Sword Finger Data Warehouse-Hive04

1.最後のレッスンの復習

2、Hive03

第三に、Hiveでのさまざまな関数の使用

1.最後のレッスンの復習

  • https://blog.csdn.net/SparkOnYarn/article/details/105182082
  • 結合は、内部接続、外部接続、左外部接続、右外部接続、完全接続に分けられます。3つの複合データ型:Map、Struct、Array、これら3つの型の定義、格納された値と値、組み込み関数のみが必要です詳細な定義を確認します。jsonデータをHiveに格納することはお勧めしません。組み込み関数はURLを解析できます(parse_url_tuple)

2.ビッグデータでの並べ替え(並べ替え、並べ替え、クラスター化)

ソートの問題は、データ量が少ない場合は問題ありませんが、データ量が多いとすぐに問題が発生します。

1、(グローバル順)で並べ替え
  • 上記のようにグローバルソートを実装する場合、reduceは1つだけです。reducerが複数ある場合、reduce1に順序があり、reduce2に順序がありますが、グローバル順序は保証されません。Order Byは本番環境では注意して使用されます。データ量は多くなりますが、削減は1つしかありません。

empno descによるemp順序から*を選択します。

0:jdbc:hive2:// hadoop001:10000 / ruozedata_hiv> set hive.mapred.mode = strict;
影響を受ける行はありません(0.004秒)
0:jdbc:hive2:// hadoop001:10000 / ruozedata_hiv> select * from emp order by empno desc;
エラー:ステートメントのコンパイル時のエラー:失敗:SemanticException 1:27厳密モードでは、ORDER BYが指定されている場合、LIMITも指定する必要があります。トークン「empno」の近くでエラーが発生しました(状態= 42000、コード= 40000)

hive.configure.propertiesを開き、パラメーターhive.mapred.modeに注意してください。厳密モードでは、一部の負荷の高いクエリの実行が許可されていません。たとえば、フルテーブルスキャンは禁止されています。orderbyのみを使用する場合は、追加する必要があります。上限フィールド:
ここに画像の説明を挿入
操作するパーティションテーブルを見つけます:
/ ruozedata_hiv> select * from order_partition where event_month = '2020-01' order by order_no desc;
Error:Error while compiling statement:FAILED:SemanticException 1:67 In strict mode、 ORDER BYを指定する場合は、LIMITも指定する必要があります。トークン 'order_no'の近くでエラーが発生しました(状態= 42000、コード= 40000)

0:jdbc:hive2:// hadoop001:10000 / ruozedata_hiv> set hive.mapred.mode = nonstrict;
影響を受ける行はありません(0.002秒)

0:jdbc:hive2:// hadoop001:10000 / ruozedata_hiv> select * from order_partition where event_month = '2020-01' order by order_no desc;

strictモードの
場合通常のテーブルの場合:
+ limitで並べ替えパーティションテーブル:+ limitで並べ替えwhere where column

  • 製造時に注意して使用順に注文する:
並び替え
  • 各パーティションが順序付けられていること、複数の削減があること、およびパーティションが生成する結果がすべて順序付けされていることを保証できますが、グローバルな順序を保証することはできません。ソートは厳密モードと非厳密モードの影響を受けません。 、数値タイプ->番号、文字列タイプ->辞書:
  • 辞書式の順序は、abcdの文字の順に配置されます。
名前 解説
mapred.reduce.tasks -1

ここに画像の説明を挿入
1、设置reduce数:
set mapred.redcue.tasks = 3;
ステージ1のHadoopジョブ情報を3つ削減:マッパーの数:1; レデューサーの数:3

2、select * from emp sort by empno;
结果在控制台上输出是没那么明显的直观的:

3、MR中有多少个reduce作业就对应输出多少个文件、spark中多少个task就对应输出多少个输出文件:

4、把输出文件放到本地liunux目录上再做决断:
insert overwrite local directory '/home/hadoop/tmp/hivetmp/sort/' select * from emp sort by empno;

5、自行去到输出目录中查看确实是有3个输出文件 --> 这就是所谓的分区有序:
[hadoop@hadoop001 sort]$ pwd
/home/hadoop/tmp/hivetmp/sort
[hadoop@hadoop001 sort]$ ll
total 12
-rw-r--r-- 1 hadoop hadoop 335 Apr  3 13:59 000000_0
-rw-r--r-- 1 hadoop hadoop 282 Apr  3 13:59 000001_0
-rw-r--r-- 1 hadoop hadoop  91 Apr  3 13:59 000002_0
  • 公式ウェブサイトでのselectステートメントの表示:
    https : //cwiki.apache.org/confluence/display/Hive/LanguageManual+Select

ストリクトモードで制限を追加する必要があるのはなぜですか?昇順のデフォルトのソートメカニズム、昇順、辞書編集(辞書編集)、

配布者:

使用方法:distribute by + col:指定されたフィールドに応じて異なるレデューサーにデータを分散します; MapReduceのPartitionerに相当します。通常、並べ替えと組み合わせて使用​​されます。

  • Hiveは、Distribute Byの列を使用して、行をリデューサー間で分散します。同じ[配布元]列を持つすべての行は、同じレデューサーに送られます。ただし、Distribute Byは、分散キーのクラスタリングまたはソートプロパティを保証しません。

1.名前の長さに従って配布し、パーティション内の従業員番号の昇順で並べ替えます:
上書きローカルディレクトリを挿入します '/ home / hadoop / tmp / hivetmp / distribute' select * from emp distribute by length(ename)sort by empno;

//ビッグデータのデータスキューのシーンは、配布に依存する必要があります。

クラスター化:
  • cluster byは、Distribute byとSort byの両方のショートカットです。データ分散の場合のみ:

  • 上書きローカルディレクトリを挿入します '/ home / hadoop / tmp / hivetmp / distribute' select * from emp cluster by empno;

要約:


並べ替え:グローバルな順序、大きな削減データでの効率が低い並べ替え:各削減の順序、グローバルな順序の
配布は保証できない
並べ替えと組み合わせて頻繁に使用される、指定されたフィールドに基づくデータ分散であり、各削減を確実にします内部的に順序付けられた
クラスター= =分散+クラスター

思考:生産には秩序あるビジネス統計結果が必要であり、order byは使用できず、sort byはグローバルな順序を保証できないので、どのように解決すればよいですか?

3、Sqoopの使用

3.1 Sqoopの背景と紹介

シナリオ:
1)データがMySQLに保存されており、処理にHiveを使用したい
2)、Hive統計分析を使用し、データがまだHiveにある、MySQLへのエクスポート方法:
–>最後に、レポートが視覚化されて表示されますレポートへの接続方法:(1)、HiveServer2(2)、Hive統計結果はRDBMSにエクスポートされ、レポートデータはRDBMSに直接接続されます。2つの必要なシナリオ

解決策:MapReduce(複雑すぎる)
->一般的なツールへの抽象化

Sqoopは、データのインポートおよびエクスポートツールです。
$ HIVE_HOME / congの下のMySQLのhive-site.xml情報へのHiveのアクセスに似ています:
RDBMSには、次のリンク情報が必要です:urlドライバーdbテーブルユーザーパスワード(必須情報)
hdfsへのリンクが必要です:
Hiveへのパスリンクには、データベーステーブルパーティションが必要です。

–>これはSqoopフレームワークにつながります:sqoop.apache、org

sqoop:sql to hadoop
hue:ビジュアルフレームワーク、それにSQLを書き込み、結果はレポートの形式で使用できます:CDH構成の結果が出力されるとすぐに。

本番クラスターの会社を見て、最初に踏み台を介してサーバーに接続します。Dbeaverを本番サーバーにリンクできますか。

Sqoopの紹介:
  • Apache Sqoop™は、Apache Hadoopとリレーショナルデータベースなどの構造化データストアとの間でバルクデータを効率的に転送するために設計されたツールです。
  • sqoopは、データを効率的に転送するために使用されるツールであり、Hadoopと、RDBMSやHadoopなどの構造化データベースとを相互運用するツールです。

RDBMS <==> Hadoop、HbaseおよびHiveにデータをインポートすることもできます。

2つのメジャーバージョン:
sqoop1.x:sqoop1 ***(約70%の企業がこれを使用しています)
sqoop1.99.x:sqoop2(使用するのは非常に面倒です)

  • 私たちはsqoop1を使用しており、2つのフレームワークは比類のないものです。
責任:
把数据从RDBMS和Hadoop之间记性导入导出操作,底层就是使用MapReduce来实现的。
Sqoop只有Map,它不需要Reduce;

Sqoopのインポート:参照点および参照点としてのHadoopに基づく:
RDBMS <==> Hadoop

Sqoopエクスポート:開始点としてのHadoopから外部へ:
Hadoop <==> RDBMS
ここに画像の説明を挿入

3.2 Sqoopのインストールとデプロイ

1.ダウンロード:
wget http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.16.2.tar.gz

2.解凍してソフト接続を作成します:
tar -zxvf sqoop-1.4.6-cdh5.16.2.tar.gz -C〜/ app /
ln -s sqoop-1.4.6-cdh5.16.2 sqoop

3.システム環境変数を構成します
。vi〜/ .bashrc export SQOOP_HOME = / home / hadoop / app / sqoop
export PATH = S Q P H O M E / b i n : SQOOP_HOME / bin: パス

4.効果的な環境変数:
ソース〜/ .bashrc

5. $ SQOOP_HOME / confの下にファイルをコピーし、パラメーターを構成します
。cp sqoop-env-template.sh sqoop-env.sh
export HADOOP_COMMON_HOME = / home / hadoop / app / hadoop
export HADOOP_MAPRED_HOME = / home / hadoop / app / hadoop
export HIVE_HOME = / home / hadoop / app / hive

6.ドライバパッケージを$ SQOOP_HOME / libディレクトリにコピーします。cp
mysql-connector-java-5.1.27-bin.jar $ SQOOP_HOME / lib /

3.3、Sqoopの簡単な使用

sqoopヘルプコマンドヘルプを表示し、sqoopが辞書を検索することを学ぶ:

1. sqoopバージョン:
バージョン番号を表示します

2. mysqlでデータベースを一覧表示し、コマンドヘルプを表示します。sqoop help list_databases

sqoop list-databases \
--connect jdbc:mysql://hadoop001:3306 \
--username root \
--password 960210

输出结果如下:
20/04/03 15:08:06 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
mysql
performance_schema
ruozedata_hive
sqoop
sys
wordpress

3.データベースの下のテーブルを一覧表示します。

sqoop list-tables \
--connect jdbc:mysql://hadoop001:3306/sqoop \
--username root \
--password 960210

//运行结果如下:
20/04/03 15:39:54 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
dept
emp
salgrade

3.4。Sqoopインポートの詳細な使用(MySQLからhdfsへ)

sqoop help import:コマンドのヘルプを表示します。

参数先捋一遍:
--append
--columns <col,col,col...> 
--delete-target-dir     
-m,--num-mappers <n> 
--mapreduce-job-name <name>
--target-dir <dir>
要件1:sqoopのempデータテーブルをHDFSにインポートします。
sqoop import \
--connect jdbc:mysql://hadoop001:3306/sqoop \
--username root \
--password 960210 \
--table emp \
-m 1

//出现如下报错:
Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject
        at org.apache.sqoop.util.SqoopJsonUtil.getJsonStringforMap(SqoopJsonUtil.java:43)
        at org.apache.sqoop.SqoopOptions.writeProperties(SqoopOptions.java:784)
        at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Caused by: java.lang.ClassNotFoundException: org.json.JSONObject
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

//原因是缺少java-json.jar包,上传一个即可解决问题:
  • このsqoopステートメントはmapreduceタスクを実行し、アプリ名はemp.jar(名前が指定されていない場合のデフォルト名はemp.jar)であり、出力結果はデフォルトで/ user / hadoop / empです。
1、如下所示,顺利的把MySQL中的数据导入到了hdfs目录上:
[hadoop@hadoop001 bin]$ hdfs dfs -ls /user/hadoop/emp
20/04/03 16:10:18 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r--r--   1 hadoop supergroup          0 2020-04-03 16:08 /user/hadoop/emp/_SUCCESS
-rw-r--r--   1 hadoop supergroup        282 2020-04-03 16:08 /user/hadoop/emp/part-m-00000

2、使用了一个map所以结果是一个文件
[hadoop@hadoop001 bin]$ hdfs dfs -text /user/hadoop/emp/part-m-00000
20/04/03 16:10:31 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
7369,SMITH,CLERK,7902,1980-12-17,800.0,20.0,40
7499,SMITH,CLERK,7902,1980-12-17,800.0,20.0,40
7499,SMITH,CLERK,7902,1980-12-17,800.0,20.0,40
7499,SMITH,CLERK,7902,1980-12-17,800.0,20.0,40
7499,SMITH,CLERK,7902,1980-12-17,800.0,20.0,40
7499,SMITH,CLERK,7902,1980-12-17,800.0,20.0,40

ここに画像の説明を挿入

テスト:

エラーツール:FileAlreadyExist、ファイルディレクトリは既に存在します。つまり、インポートコマンドでターゲットテーブルを削除する必要があります。

1. $ SQOOP_HOME / binディレクトリでコマンドを実行したときにコンソールに出力されるログ情報、主にこのテーブルが存在するかどうかを確認するためにlimit1がある理由:
20/04/03 16:21:09 INFOマネージャ。 SqlManager:SQLステートメントの実行:SELECT t。* FROM empAS t LIMIT 1

2.
マップが分割数で設定される理由:1 は1です

3. $ SQOOP_HOME / binディレクトリにあるすべてのsqoopインポートは.javaファイルを生成します

リードは、インポートコマンドを実行する前に毎回ターゲットテーブルを削除することです。
  • この時点で、-delete-target-dirパラメーターを追加し、mysql2hdfsから--mapreduce-job-nameパラメーターを介して実行するジョブの名前を指定してから、指定したマップ番号をデフォルト値の4に戻します。
sqoop import \
--connect jdbc:mysql://hadoop001:3306/sqoop \
--username root \
--password 960210 \
--table emp \
--mapreduce-job-name frommysql2hdfs \
--delete-target-dir 
  • マップの数を1に削除すると、上記のようにエラーが報告されます。理由は非常に明確です。empテーブルに主キーがある場合、エラーは報告されません。デフォルト値は4マップです。empテーブルに主キーがない場合は、マップを指定する必要があります。番号:
  • 20/04/03 16:32:18エラーtool.ImportTool:インポートに失敗しました:テーブルempの主キーが見つかりませんでした。--split-byで指定するか、 '-m 1'で順次インポートを実行してください
要件2:hdfsにデータをインポートするときは、自分で列を指定し、ディレクトリ(target-dir)を変更します
sqoop import \
--connect jdbc:mysql://hadoop001:3306/sqoop \
--username root \
--password 960210 \
--table emp \
--mapreduce-job-name frommysql2hdfs2 \
--delete-target-dir \
--target-dir emp_column \
--columns "empno,ename,job,sal,comm" \
-m 1
要件3:エクスポートされたデータスプリッターは '\ t'に変更し、null値を0に置き換える必要があります。
sqoop import \
--connect jdbc:mysql://hadoop001:3306/sqoop \
--username root \
--password 960210 \
--table emp \
--mapreduce-job-name frommysql2hdfs2 \
--delete-target-dir \
--target-dir emp_column \
--columns "empno,ename,job,sal,comm" \
--fields-terminated-by '\t' \
-- null-string '' \
--null-non-string '0' \
-m 1

//--fields-terminated-by '\t'把导出数据的分割符换成\t,-- null-string '' \
--null-non-string '0' \ -->意思是把空的字符串值替换为0
一般的なインタビューの質問:

1.並べ替えと並べ替えの違いは何ですか?

  • 並べ替えは各パーティションの順序であり、並べ替えはグローバルな順序を保証するためです。

2. hadoop fs -lsとhadoop fs -ls /の違いは何ですか?
スラッシュは意味しません:/ user / hadoop-> / user /現在のユーザー名
スラッシュはhdfsのルートディレクトリを意味します

元の記事を23件公開しました 賞賛されました0 訪問数755

おすすめ

転載: blog.csdn.net/SparkOnYarn/article/details/105291173