Sqoop-import

提供:Dev Guides
移動先:案内検索

Sqoop-インポート

この章では、MySQLデータベースからHadoop HDFSにデータをインポートする方法について説明します。 「インポートツール」は、RDBMSからHDFSに個々のテーブルをインポートします。 テーブルの各行は、HDFSのレコードとして扱われます。 すべてのレコードは、テキストファイルにテキストデータとして保存されるか、Avroおよびシーケンスファイルにバイナリデータとして保存されます。

構文

次の構文は、HDFSにデータをインポートするために使用されます。

$ sqoop import (generic-args) (import-args)
$ sqoop-import (generic-args) (import-args)

MySQLデータベースサーバーのuserdbというデータベースにある、 empemp_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 email
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