Sqoop-import
Sqoop-インポート
この章では、MySQLデータベースからHadoop HDFSにデータをインポートする方法について説明します。 「インポートツール」は、RDBMSからHDFSに個々のテーブルをインポートします。 テーブルの各行は、HDFSのレコードとして扱われます。 すべてのレコードは、テキストファイルにテキストデータとして保存されるか、Avroおよびシーケンスファイルにバイナリデータとして保存されます。
構文
次の構文は、HDFSにデータをインポートするために使用されます。
$ sqoop import (generic-args) (import-args)
$ sqoop-import (generic-args) (import-args)
例
MySQLデータベースサーバーのuserdbというデータベースにある、 emp 、 emp_add 、および emp_contact という名前の3つのテーブルの例を見てみましょう。
3つのテーブルとそのデータは次のとおりです。
emp:
id | name | deg | salary | dept |
---|---|---|---|---|
1201 | gopal | manager | 50,000 | TP |
1202 | manisha | Proof reader | 50,000 | TP |
1203 | khalil | php dev | 30,000 | AC |
1204 | prasanth | php dev | 30,000 | AC |
1204 | kranthi | admin | 20,000 | TP |
emp_add:
id | hno | street | city |
---|---|---|---|
1201 | 288A | vgiri | jublee |
1202 | 108I | aoc | sec-bad |
1203 | 144Z | pgutta | hyd |
1204 | 78B | old city | sec-bad |
1205 | 720X | hitec | sec-bad |
emp_contact:
id | phno | |
---|---|---|
1201 | 2356742 | [email protected] |
1202 | 1661663 | [email protected] |
1203 | 8887776 | [email protected] |
1204 | 9988774 | [email protected] |
1205 | 1231231 | [email protected] |
テーブルのインポート
Sqoopツール「インポート」を使用して、テーブルからテーブルデータをテキストファイルまたはバイナリファイルとしてHadoopファイルシステムにインポートします。
次のコマンドを使用して、 emp テーブルをMySQLデータベースサーバーからHDFSにインポートします。
$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp --m 1
正常に実行されると、次の出力が得られます。
14/12/22 15:24:54 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
14/12/22 15:24:56 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
14/12/22 15:24:56 INFO tool.CodeGenTool: Beginning code generation
14/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement:
SELECT t.* FROM `emp` AS t LIMIT 1
14/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement:
SELECT t.* FROM `emp` AS t LIMIT 1
14/12/22 15:24:58 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is/usr/local/hadoop
14/12/22 15:25:11 INFO orm.CompilationManager: Writing jar file:
/tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar
-----------------------------------------------------
-----------------------------------------------------
14/12/22 15:25:40 INFO mapreduce.Job: The url to track the job:
http://localhost:8088/proxy/application_1419242001831_0001/
14/12/22 15:26:45 INFO mapreduce.Job: Job job_1419242001831_0001 running in uber mode :
false
14/12/22 15:26:45 INFO mapreduce.Job: map 0% reduce 0%
14/12/22 15:28:08 INFO mapreduce.Job: map 100% reduce 0%
14/12/22 15:28:16 INFO mapreduce.Job: Job job_1419242001831_0001 completed successfully
-----------------------------------------------------
-----------------------------------------------------
14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Transferred 145 bytes in 177.5849 seconds
(0.8165 bytes/sec)
14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Retrieved 5 records.
HDFSでインポートされたデータを確認するには、次のコマンドを使用します。
$ $HADOOP_HOME/bin/hadoop fs -cat/emp/part-m-*
*emp* テーブルデータが表示され、フィールドはコンマ(、)で区切られます。
1201, gopal, manager, 50000, TP
1202, manisha, preader, 50000, TP
1203, kalil, php dev, 30000, AC
1204, prasanth, php dev, 30000, AC
1205, kranthi, admin, 20000, TP
ターゲットディレクトリへのインポート
Sqoopインポートツールを使用して、テーブルデータをHDFSにインポートするときにターゲットディレクトリを指定できます。
以下は、Sqoopインポートコマンドのオプションとしてターゲットディレクトリを指定する構文です。
--target-dir <new or exist directory in HDFS>
次のコマンドを使用して、 emp_add テーブルデータを「/queryresult」ディレクトリにインポートします。
$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp_add \
--m 1 \
--target-dir/queryresult
次のコマンドは、 emp_add テーブルの/queryresultディレクトリにインポートされたデータを確認するために使用されます。
$ $HADOOP_HOME/bin/hadoop fs -cat/queryresult/part-m-*
カンマ(、)で区切られたフィールドを持つemp_addテーブルデータが表示されます。
1201, 288A, vgiri, jublee
1202, 108I, aoc, sec-bad
1203, 144Z, pgutta, hyd
1204, 78B, oldcity, sec-bad
1205, 720C, hitech, sec-bad
テーブルデータのサブセットのインポート
Sqoopインポートツールの「where」句を使用して、テーブルのサブセットをインポートできます。 各データベースサーバーで対応するSQLクエリを実行し、結果をHDFSのターゲットディレクトリに格納します。
where句の構文は次のとおりです。
--where <condition>
次のコマンドは、 emp_add テーブルデータのサブセットをインポートするために使用されます。 サブセットクエリは、セカンドラバード市に住む従業員IDと住所を取得することです。
$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp_add \
--m 1 \
--where “city =’sec-bad’” \
--target-dir/wherequery
次のコマンドを使用して、 emp_add テーブルから/wherequeryディレクトリにインポートされたデータを確認します。
$ $HADOOP_HOME/bin/hadoop fs -cat/wherequery/part-m-*
コンマ(、)で区切られたフィールドを持つ emp_add テーブルデータが表示されます。
1202, 108I, aoc, sec-bad
1204, 78B, oldcity, sec-bad
1205, 720C, hitech, sec-bad
増分インポート
増分インポートは、テーブルに新しく追加された行のみをインポートする手法です。 増分インポートを実行するには、「増分」、「チェック列」、「最終値」オプションを追加する必要があります。
次の構文は、Sqoop importコマンドの増分オプションに使用されます。
--incremental <mode>
--check-column <column name>
--last value <last check column value>
*emp* テーブルに新しく追加されたデータは次のように仮定します-
1206, satish p, grp des, 20000, GR
次のコマンドを使用して、 emp テーブルで増分インポートを実行します。
$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp \
--m 1 \
--incremental append \
--check-column id \
-last value 1205
次のコマンドは、 emp テーブルからHDFS emp/ディレクトリにインポートされたデータを確認するために使用されます。
$ $HADOOP_HOME/bin/hadoop fs -cat/emp/part-m-*
コンマ(、)で区切られたフィールドを持つ emp テーブルデータが表示されます。
1201, gopal, manager, 50000, TP
1202, manisha, preader, 50000, TP
1203, kalil, php dev, 30000, AC
1204, prasanth, php dev, 30000, AC
1205, kranthi, admin, 20000, TP
1206, satish p, grp des, 20000, GR
次のコマンドを使用して、 emp テーブルから変更または新しく追加された行を表示します。
$ $HADOOP_HOME/bin/hadoop fs -cat/emp/part-m-*1
コンマ(、)で区切られたフィールドを使用して、 emp テーブルに新しく追加された行を表示します。
1206, satish p, grp des, 20000, GR