Sqoopの使用

4125 ワード

Sqoop公式サイト:
http://sqoop.apache.org/
*)Sqoopは、Hadoopと関係データベースでデータを転送するためのSqoopを紹介します.sqoopを通じて、関係データベースからHFSにデータを導入したり、HFSから関係データベースにデータを導き出すことができます.
Sqoop的使用
参照リンク:http://blog.csdn.net/yfkiss/article/details/8700480
*)簡単なsampleケースターゲット:oracleの全テーブルデータをhdfsファイルシステムに導入する1)Oracleに下記の表を追加する:CREATE TABLE tb_メッセージ(ID INT PRIMARY KEY、MSGID INT、MESSAGE VRCHAR(256));
2)下記のデータを追加します.INSERT INTO tb_message(ID、MSGID、MESSAGE)VALES(1,1001,‘message 1’);INSERT INTO tb_message(ID、MSGID、MESSAGE)VALES(2、1002、‘message 2’);INSERT INTO tb_message(ID、MSGID、MESSAGE)VALES(3、1003、NULL);3)データ検証SELECT*FROM tb_メッセージ
ID	MSGID	MESSAGE

---------- -------------------------------------

1	 1001	message 1

2	 1002	message 2

3	 1003
4)ターゲットディレクトリsudo-u hdfs dfs-mkdir-p/sqoop-test/dataを作成します.
5)sqoop importコマンドを用いてsqoop import--connect jdbc:oracle:thin:@::--username--password--テーブルname>--columns--targt-dir-m
sudo-u hdfs sqoop import--connect jdbc:oracle:thin:@172.6.1.18:1521:XE--username SYSTEM--password tiger--table tb_メッセージ--columns ID、MSGID、MESSAGE--taget-dir/sqoop-test/data/message-m 1
6).hdfsファイル検証sudo-u hdfs dfs-cat/sqoop-test/data/message/part-m-0000
1,1001,message 1

2,1002,message 2

3,1003,null
簡単なsampleとして、その過程はやはり分かりやすいです.
 
*)Sqoopコマンドラインのパラメータを詳しく説明するために、RDMSからHFSまでのデータをエクスポートするためにexportを使用して、HFSからRDMSのデータを導入するために使用します.
--アプリはデータの追加に使います.
--connect JDBC接続串によくあるmysql/oracle接続文字列は以下の通りです.mysql:jdbc:mysql://server_ip>:/oracle:jdbc:oracle:thin:@ip>::
--usernameデータベース登録ユーザ名
--passwordデータベースはユーザーパスワードを登録し、-Pを借りてconsoneから入力することができます.
--テーブルにインポート/エクスポートするデータベーステーブル名を指定します.
--columnsはエクスポートした列名を指定して、それぞれの列名は'を通して、'はid、msgidのように分割します.
--targt-dirは、導出したhdfsパスを指定します.
--num-mappers指定mapのタスク数は、-mと略して書きます.
上記は一般的なコマンドラインのパラメータです.詳細なパラメータは公式ユーザーマニュアルを参照してください.http://sqoop.apache.org/docs/1.4.4/SqoopUserGuide.html
*)性能分析は、2つの案に対して、RDBMS->Local File->HFSS RDBMS->Sqoop->HFS性能コントラスト:潇はJDBC方式を採用しており、RDBMSが持参した導入/導出ツールよりも性能が良いとは限らず、実際のパフォーマンスは劣っています.
最適化方案:並行導入1).num-mappers値を大きくし、複数のmapタスクを起動して加速しますが、メインキーがないテーブルについては、失敗しました.以下のエラーを報告します.
14/06/25 17:47:33 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hdfs/compile/a1525a92a1a74988ed98d367452e7fa8/tb_nopk_table.jar

14/06/25 17:47:33 ERROR tool.ImportTool: Error during import: No primary key could be found for table tb_nopk_table. Please specify one with --split-by or perform a sequential import with '-m 1'.
主キーがないテーブルです.sqoopは複数のmapタスクを指定することができません.「-m 1」だけを許可します.つまり、導入/エクスポート作業はシリアルで実行しなければなりません.2)を指定します.スプリット-byは、分割に適したフィールドを選択します.split-byフィールドは、メインキーがないテーブルデータの導入/エクスポートに適しています.その参照値とnum-mapperは配合されます.
3)複数のSqoopコマンドを分割するために、分割に適したフィールドを選択し、範囲分離としてWhereを指定し、複数のsqoopコマンドを起動しながら実行します.
sqoop import ... --table tb_message --where "ID > 0 AND ID <= 1000"

sqoop import ... --table tb_message --where "ID > 1000 AND ID <= 2000"

sqoop import ... --table tb_message --where "ID > 2000 AND ID <= 3000"
参考できる:http://www.cnblogs.com/gpcuster/archive/2011/03/01/1968027.html
*)Sqoopその他の疑惑1.データ整合性問題exportが途中で停止し、データの不一致を招く場合、つまりpartially-complette export.
2.Valueに対してNULLですが、どう処理しますか?デフォルトでは、sqoopコマンドに関連パラメータが指定されていない場合、フィールド値が空の場合は、ファイルに書き込みます.特殊処理が必要ならば、null-stringを指定できます.--null-non-stringの二つのパラメータを処理します.--null-stringThe string to be written for a null value for string column-null-non stringThe string to written for a null value'sのときに、stringを指定します.
exportでは--input-null-string'\N'--input-null-non-string'\N'を指定します.