ApacheのSqoopインストールして使用する(学習)

Apache Sqoop
1。はじめにsqoop
のApache Sqoopは、システムおよびRDBMSのHadoopエコシステム間のデータ転送のためのツールです。Apache Software Foundationのから。

Sqoop作業メカニズムのMapReduceプログラムに変換コマンドをインポートまたはエクスポートすることです。主のInputFormatとカスタマイズにOUTPUTFORMATで翻訳されたMapReduceで。
Hadoopのエコシステムが含まれます:HDFS、ハイブは、HBaseのと他の
RDBMSシステムが含まれます:mysqlのは、Oracle、DB2、およびその他の
"SQLへのHadoopとHadoopのにSQL":Sqoopは、として理解することができます。

Apacheは、データ転送の問題での位置を見て立って、あなたがエクスポートにデータをインポートすることができます:
インポート:データのインポート。----- RDBMS> Hadoopの
エクスポート:エクスポートデータ。Hadoopの----> RDBMS

2。sqoopインストール
すでにJavaとのHadoop環境を持っている前提のインストールsqoop。
最新の安定バージョン:1.4.6
設定ファイルが変更された:
CD SQOOP_HOMEの$ / confに

MV sqoop-env-template.sh sqoop-env.sh
VI sqoop-env.sh
#設定を変更

export HADOOP_COMMON_HOME= /export/servers/hadoop-2.7.5 
export HADOOP_MAPRED_HOME= /export/servers/hadoop-2.7.5
export HIVE_HOME= /export/servers/hive

JDBCのMySQLドライバパッケージを追加します。

cp /hive/lib/mysql-connector-java-5.1.32.jar $SQOOP_HOME/lib/

開始を確認してください

bin/sqoop list-databases \
 --connect jdbc:mysql://localhost:3306/ \
 --username root --password hadoop

このコマンドは、すべてのMySQLデータベースを示しています。
ここでは、全体Sqoopのインストールは完了です。

二、Sqoopインポート
HDFSへのRDBMSから「インポートツール」インポート個別のテーブル。テーブルの各行は、HDFSのレコードであると考えられます。すべてのレコードは、テキストデータのテキストファイルとして保存され
、次の構文は、データHDFSをインポートするために使用されます。
インポートSqoop $(ジェネリック-argsが)(輸入-argsを)
Sqoopテストデータテーブルは、

MySQLデータベースのuserdb内に作成し、SQLスクリプト参照を実行している:
3つのテーブルを作成します。EMPの従業員テーブルを、emp_add従業員は、従業員の連絡先emp_conn、テーブルに対処しますテーブル。

1。表MySQLのHDFSにインポートするデータの総量
HDFSのMySQLデータベースサーバEMP表を導入するための以下のコマンドを。
ビン/ Sqoopインポート
。MySQLの://ノードの1-:JDBC -connect 3306 / userdbのは、
ルートを-username
のHadoopは、-password
DIR-標的- -delete
-target-DIR / sqoopresult
。-table EMPを1 - Mを

特徴と-target-dirができますHDFS格納ディレクトリにエクスポートデータを指定するために使用され、
MySQLのJDBC URLはIPアドレスを使用します。

データHDFSインポートを確認するために、インポートしたデータを表示するには、以下のコマンドを使用します。
HDFS DFS -cat / sqoopresult / 00000パート-M-は、
それがemp表HDFSにカンマ、およびデータ・フィールドで区切られたデフォルトすることがわかります。ことができ
区切り-fields終端-によって「\ tの指定が 」。

1201ゴパル、マネージャ、50000、TP
1202マニーシャ、プルーフリーダー、50000、TP
1203カリル、PHPのDEV、30000、AC
1204 prasanth、PHPのDEV、30000、AC
1205 kranthi、管理、20000、TP

2。表MySQLのHIVEインポートするデータの総額
2.1。一つの方法:データに導入された最初のコピーテーブルハイブへの構造と
ハイブへのリレーショナルデータテーブルの構造をコピーします

bin/sqoop create-hive-table \
--connect jdbc:mysql://node-1:3306/sqoopdb \
--table emp_add \
--username root \
--password hadoop \
--hive-table test.emp_add_sp

どこに:
mysqlデータベースsqoopdbテーブルに-table emp_add。
テーブル名に新しいハイブの-Hiveテーブルemp_add_sp。

ハイブのリレーショナルデータベースからファイルをインポートします

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/sqoopdb \
--username root \
--password hadoop \
--table emp_add \
--hive-table test.emp_add_sp \
--hive-import \
--m 1

2.2。第二の方法:ハイブへのデータの直接のレプリケーションテーブル構造

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--table emp_conn \
--hive-import \
--m 1 \
--hive-database test;

3。(フィルタ)インポートテーブルデータサブセット
リレーショナルデータベースからの際にインポートデータ-whereクエリを指定することができます。これは、データベース・サーバ内の適切なSQLクエリを実行し、HDFSの宛先ディレクトリに結果を格納します。

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/sqoopdb \
--username root \
--password hadoop \
--where "city ='sec-bad'" \
--target-dir /wherequery \
--table emp_add --m 1

4。インポートテーブルデータのサブセット(クエリクエリ)
注:
それは-tableパラメータを追加することはできません見つけるために使用するクエリのSQLステートメント、
およびそれがどこの条件を追加する必要があり、
条件が$条件文字列を持参しなければならない場所の背後に、
この必須のSQL文単一引用符ではなく二重引用符を使用します。

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--target-dir /wherequery12 \
--query 'select id,name,deg from emp WHERE  id>1203 and $CONDITIONS' \
--split-by id \
--fields-terminated-by '\t' \
--m 2

-split・バイID -m 10個の一般的にフィットパラメータsqoopコマンド。フィールドとmaptaskスタートの数に応じて分割を指定するために使用されます。

5。デルタのインポート

実用的な作業、データのインポートでは、あなただけの増分データをインポートすることができますほとんどの時間は、テーブル内のデータをその都度ハイブHDFSにすべてまたはインポートする必要はありませんが行くことにした、それがデータの重複が発生します。したがって、いくつかのフィールドは、一般的に増分データのインポートをサポートsqoop、増分を導入する使用。
表中の増分インポートのみインポートテクノロジー行が新しく追加されました。

-checkカラム(COL)
の輸入を増加させるから増分インポートするかどうかを、これらのデータおよびタイムスタンプフィールドを確認するために使用される列の数、及び同様のインクリメンタルデータとしてリレーショナルデータベースを指定します。
注:カラムこれらのタイプの種類を同時にないなどCHAR、VARCHAR、として、文字の任意の型に割り当てることができない-チェックインの列は複数の列を指示することができます。
-incremental(MODE)
追記:追加、例えば、最後の値の値を記録した後、指定がさらに導入さよりも大きいです。LASTMODIFIED:レコードが最後の値指定された日付が追加された後、最後の修正時刻、
-last値(値)は
、最後のインポート列(指定されたよりも大きい値)ので、最大値を指定し、特定の値は、それ自体を設定することができます

5.1。モード増分インポートを追加

我々の以前のデータインポート後の最初の命令:
ビン/ Sqoopインポート
1- //ノード::MySQLの:JDBCを-connect 3306 / userdbのは、
ルート-username
Hadoopの-password
-target-DIR / appendresult
。 - M -table EMP 1
データに生成されたデータファイルを使用してのHadoopのfs -catビューは、HDFSに発見されました。
2インクリメンタルデータは、EMPのMySQLで挿入されています。

insert into `userdb`.`emp` (`id`, `name`, `deg`, `salary`, `dept`) values ('1206', 'allen', 'admin', '30000', 'tp');
insert into `userdb`.`emp` (`id`, `name`, `deg`, `salary`, `dept`) values ('1207', 'woon', 'admin', '40000', 'tp');

命令の実行は、導入増分を達成するために、次のとおりです。

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root  --password hadoop \
--table emp --m 1 \
--target-dir /appendresult \
--incremental append \
--check-column id \
--last-value  1205

最後に、検証インポートデータディレクトリは増分データである文書に記載されています

5.2。LASTMODIFIEDデルタインポートモード
最初のタイムスタンプフィールドを指定するには、顧客テーブルを作成:
表のcustomertest作成します(int型のID、名前VARCHARを(20)、last_modデフォルトのタイムスタンプを更新CURRENT_TIMESTAMP CURRENT_TIMESTAMP ON);
データセット内のタイムスタンプ変更を生成して更新するときに発生する。
oがそれぞれ挿入され、次のように記録された:
INSERT INTO customertest(ID、名前)の値(1、 'ニール');
INSERT INTOのcustomertest(ID、名前)の値(2、 'ジャック');
INSERT INTOをcustomertest(ID、名前)の値(3、 'マーティン');
INSERT INTOのcustomertest(ID、名前)の値(4 'トニー');
INSERT INTO customertest(ID、名前)の値(5 'エリック');
Ø Sqoop実行指示データは、すべてのHDFSをインポートする:
ビン/ Sqoopインポート
-connect JDBCを:MySQLの://ノード1 - :3306 / userdbのは、
ルート-username
Hadoopの-password
-targetを-DIR / lastmodifiedresult
-table customertest --m 1

この時点でのデータから得られた結果を参照してください。

再びcustomertestにデータテーブルを挿入

insert into customertest(id,name) values(6,'james')

インクリメンタル方式の増分を用いて導入:

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--table customertest \
--target-dir /lastmodifiedresult \
--check-column last_mod \
--incremental lastmodified \
--last-value "2019-05-28 18:42:06" \
--m 1 \
--append

ここでは、最後に挿入されたレコードのインポートを持っているが、我々はここに理由である、二つのデータを挿入しましたか?
LASTMODIFIEDモードを増加するために採用プロセスは、増分として挿入され、最後の値のデータ値に等しくなるからです。

5.3.Lastmodified模式:append、merge-key

増分データを指定するには、増分処理を使用してLASTMODIFIEDモードは、モード(追加)を追加したり、キーをマージしているモードが追加(マージ)
以下は、マージ・モード増分更新の使用方法を示し、我々は、id名フィールドを更新するために行く1 。

update customertest set name = 'Neil' where id = 1;

システム時刻のデータを更新する場合、更新した後、このデータのタイムスタンプが更新され
た命令は、マージ・キーとしてidフィールドを実行します:

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--table customertest \
--target-dir /lastmodifiedresult \
--check-column last_mod \
--incremental lastmodified \
--last-value "2019-05-28 18:42:06" \
--m 1 \
--merge-key id

マージ・キーモードでは、完全なMapReduceの操作ですので
lastmodifiedresultで、我々は名前ID = 1に変更し、新たにされているでしょう、この部分-R-00000のために生成されたファイルのフォルダを見ることができ、最終的なので、データにより、ID = 6。

四、Sqoop輸出

RDBMSのデータベースのエクスポート前のHadoopエコシステムからのデータのエクスポートは、ターゲット表には、ターゲット・データベースに存在している必要があります。
輸出は、3つのモードがあります。
デフォルトのアクションは、INSERT文を使用して、データファイルからテーブルに挿入されます。
更新モード:Sqoopは、既存のデータベースのレコードUPDATE文を置き換える生成しました。
コールモード:Sqoop各レコードは、ストアド・プロシージャ・コールを作成します。

以下は、エクスポート・コマンドの構文は次のとおりです。

$ sqoop export (generic-args) (export-args)

1。デフォルトモードのデータはHDFSでmysqlにエクスポートされ
、デフォルト、ライン当たりに換算しsqoop輸出はINSERT文として記録され、ターゲット・データベース・テーブルに追加されます。制約条件を有するデータベーステーブル(例えば、その値が一意主キー列でなければならない)と既存のデータが存在する場合、それは挿入を避けるように注意しなければならない記録されたこれらの制約に違反します。INSERT文が失敗した場合、エクスポートプロセスは失敗します。このモードは、主にこれらの結果を受け取ることができる空のテーブルにレコードをエクスポートするために使用されます。フル・テーブルは、通常、データのエクスポートに使用します。
テーブルやハイブHDFSデータ内のすべてのレコードをエクスポートすることができますMySQLは、ターゲット表にエクスポート(すべてのフィールドは、フィールドの一部であってもよいです)。

1.1。HDFSデータの準備

下の"/ EMP /"ディレクトリは、ファイルemp_data.txtでHDFSファイルシステム内に作成された:
1201、ゴパル、マネージャー、50000、TP
1202、マニーシャ、preader、50000、TP
1203、Kalil、PHP devの、30000、AC
1204、 Prasanth、PHPのDEV、30000、AC
1205 Kranthi、ADMIN、20000、TP
1206 satishp、grpdes、20000、GR
1.2。MySQLは、手動でターゲット表を作成します

mysql> USE userdb;
mysql> CREATE TABLE employee ( 
   id INT NOT NULL PRIMARY KEY, 
   name VARCHAR(20), 
   deg VARCHAR(20),
   salary INT,
   dept VARCHAR(10));

1.3。Exportコマンドの実行

bin/sqoop export \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--table employee \
--export-dir /emp/emp_data

1.4。設定パラメータ
「終端-によってフィールド- -入力
の\ t」の指定されたファイルの区切り文字
-columns
列を選択し、そのソートを制御します。データファイルとコピー先テーブルの列の順序をエクスポートするときとまったく同じフィールドが書き込むことはできません。それ以外の場合は各列の選択と配置間隔カンマ。いずれかの列またはフィールドにはデフォルト値が含まれて含まれている、あるいは-columns後にNULL値の挿入を可能にしません。それ以外の場合は、データベースは、その結果、データsqoopがエクスポート受け入れることを拒否しますSqoopジョブが失敗した
一方または両方を持っている必要が-tableパラメータ-table手段を-callながら、輸出の実装では、あなたは、このパラメータを指定する必要があり、-export-dirのエクスポートディレクトリを対応するエクスポート・データベース・テーブルの間で、
ストアドプロシージャの-call手段。

--input-null-string --input-null-non-string

あなたは文字列型の列の最初の引数を指定しない場合、それは「NULL」であるかどうか全く2番目の引数は、空の文字列または文字を言わなかった場合は、背中に「NULL」文字列は、NULL値に変換されます文字列またはは、フィールドの非文字列型のため、空の文字列のこれらの2つのタイプがNULL値に変換されます。例:
-input-のヌル文字列"\ N" --input-null以外、文字列"\ N"

2。エクスポート(updateonlyモード)を更新
2.1。パラメータ
-更新キー、アイデンティティを更新、すなわちフィールドに基づいて更新は、例えば、ID、フィールドの更新は、カンマで区切られた複数のフィールドを識別複数を指定することができます。
- updatemod、(デフォルトモード)updateonly指定され、すでに存在しているだけで更新されたデータレコードは、新しいレコードを挿入しません。
2.2。するHDFSデータの準備ができて
"/ updateonly_1 /"ディレクトリHDFSにファイルupdateonly_1.txtを作成:
1201、ゴパル、マネージャー、50000
1202、マニーシャ、preader、50000
1203、Kalil、PHP devの、30000
2.3。MySQLは、手動でターゲット表を作成します

mysql> USE userdb;
mysql> CREATE TABLE updateonly ( 
   id INT NOT NULL PRIMARY KEY, 
   name VARCHAR(20), 
   deg VARCHAR(20),
   salary INT);

2.4。すべてのエクスポート操作を実行するには

bin/sqoop export \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--table updateonly \
--export-dir /updateonly_1/

2.5。MySQLでデータがいることを確認し
、エクスポートされた全額で見つけることができるすべてのデータを

2.6。ファイルの追加
updateonly_2.txtを。最初の3を変更し、データ・レコードを追加します。/ updateonly_2 /ディレクトリへのアップロード:
1201、ゴパル、マネージャー、1212
1202、マニーシャ、preader、1313
1203、Kalil、PHP devの、1414
1204、アレン、ジャワ、1515

2.7。エクスポート更新を実行します

bin/sqoop export \
--connect jdbc:mysql://node-1:3306/userdb \
--username root --password hadoop \
--table updateonly \
--export-dir /updateonly_2/ \
--update-key id \
--update-mode updateonly

2.8。最終結果を確認します

輸出が輸出したログは、4つのレコードを表示する場合:

しかし、最終的にのみ更新操作

3。エクスポート(allowinsertモード)の更新
3.1。パラメータ
-更新キー、アイデンティティを更新、すなわちフィールドに基づいて更新は、例えば、ID、フィールドの更新は、カンマで区切られた複数のフィールドを識別複数を指定することができます。
- updatemod、指定allowinsert、既存のデータレコードを更新し、新しいレコードを挿入します。基本的に、挿入&アップデート操作。
3.2。準備ができてHDFSデータ
"/ allowinsert_1 /"ディレクトリallowinsert_1.txt HDFS内のファイルを作成:
1201、ゴパル、マネージャー、50000
1202、マニーシャ、preader、50000
1203、Kalil、PHP devの、30000
3.3。MySQLは、手動でターゲット表を作成します

mysql> USE userdb;
mysql> CREATE TABLE allowinsert ( 
   id INT NOT NULL PRIMARY KEY, 
   name VARCHAR(20), 
   deg VARCHAR(20),
   salary INT);

3.4。すべてのエクスポート操作を実行するには

bin/sqoop export \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--table allowinsert \
--export-dir /allowinsert_1/

3.5。MySQLはこの場合のデータを表示します

これは、エクスポートされた全額のすべてのデータを見つけることができます

3.6。ファイルの追加
allowinsert_2.txtを。最初の3を変更し、データ・レコードを追加します。/ allowinsert_2 /ディレクトリへのアップロード:
1201、ゴパル、マネージャー、1212
1202、マニーシャ、preader、1313
1203、Kalil、PHP devの、1414
1204、アレン、ジャワ、1515
3.7。エクスポート更新を実行します

bin/sqoop export \
--connect jdbc:mysql://node-1:3306/userdb \
--username root --password hadoop \
--table allowinsert \
--export-dir /allowinsert_2/ \
--update-key id \
--update-mode allowinsert

3.8。最終的な結果を確認
ログをエクスポートするときに、エクスポートが4つのレコードことを示しています。

同時に、データ更新操作も新しい操作されています

おすすめ

転載: blog.csdn.net/qq_38483094/article/details/94742961