Sqoop-quick-guide

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

Sqoop-はじめに

従来のアプリケーション管理システム、つまり、RDBMSを使用したアプリケーションとリレーショナルデータベースの相互作用は、ビッグデータを生成するソースの1つです。 RDBMSによって生成されるこのようなビッグデータは、リレーショナルデータベース構造のリレーショナル*データベースサーバー*に保存されます。

MapReduce、Hive、HBase、Cassandra、Pigなどのビッグデータストレージおよびアナライザー Hadoopエコシステムの一部が姿を現したため、リレーショナルデータベースサーバーと対話して、そこにあるビッグデータをインポートおよびエクスポートするためのツールが必要でした。 ここで、Sqoopは、Hadoopエコシステムで、リレーショナルデータベースサーバーとHadoopのHDFSの間の実行可能な相互作用を提供します。

*Sqoop* -「SQL to HadoopおよびHadoop to SQL」

Sqoopは、Hadoopとリレーショナルデータベースサーバー間でデータを転送するために設計されたツールです。 MySQL、OracleなどのリレーショナルデータベースからHadoop HDFSへのデータのインポート、およびHadoopファイルシステムからリレーショナルデータベースへのエクスポートに使用されます。 Apache Software Foundationによって提供されます。

Sqoopの仕組み

次の画像は、Sqoopのワークフローを説明しています。

Sqoop Work

Sqoopインポート

インポートツールは、RDBMSからHDFSに個々のテーブルをインポートします。 テーブルの各行は、HDFSのレコードとして扱われます。 すべてのレコードは、テキストファイルにテキストデータとして保存されるか、Avroおよびシーケンスファイルにバイナリデータとして保存されます。

Sqoopエクスポート

エクスポートツールは、一連のファイルをHDFSからRDBMSにエクスポートします。 Sqoopへの入力として指定されたファイルには、テーブルの行と呼ばれるレコードが含まれています。 これらは読み取られ、解析されて一連のレコードになり、ユーザー指定の区切り文字で区切られます。

Sqoop-インストール

SqoopはHadoopのサブプロジェクトであるため、Linuxオペレーティングシステムでのみ機能します。 以下の手順に従って、システムにSqoopをインストールします。

ステップ1:JAVAインストールの確認

Sqoopをインストールする前に、システムにJavaをインストールする必要があります。 次のコマンドを使用してJavaのインストールを確認しましょう-

$ java –version

Javaがすでにシステムにインストールされている場合、次の応答が表示されます-

java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b13)
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)

Javaがシステムにインストールされていない場合は、以下の手順に従ってください。

Javaのインストール

以下に示す簡単な手順に従って、システムにJavaをインストールします。

ステップ1

次のhttp://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads- [リンク]にアクセスして、Java(JDK <最新バージョン>-X64.tar.gz)をダウンロードします。

次に、jdk-7u71-linux-x64.tar.gzがシステムにダウンロードされます。

ステップ2

通常、ダウンロードしたJavaファイルは、ダウンロードフォルダーにあります。 それを確認し、次のコマンドを使用してjdk-7u71-linux-x64.gzファイルを抽出します。

$ cd Downloads/
$ ls
jdk-7u71-linux-x64.gz
$ tar zxf jdk-7u71-linux-x64.gz
$ ls
jdk1.7.0_71 jdk-7u71-linux-x64.gz

ステップ3

Javaをすべてのユーザーが利用できるようにするには、Javaを「/usr/local/」の場所に移動する必要があります。 ルートを開き、次のコマンドを入力します。

$ su
password:

# mv jdk1.7.0_71/usr/local/java
# exitStep IV:

ステップ4

PATHおよびJAVA_HOME変数を設定するには、次のコマンドを〜/.bashrcファイルに追加します。

export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin

すべての変更を現在実行中のシステムに適用します。

$ source ~/.bashrc

ステップ5

次のコマンドを使用して、Javaの代替を構成します-

# alternatives --install/usr/bin/java java usr/local/java/bin/java 2
# alternatives --install/usr/bin/javac javac usr/local/java/bin/javac 2
# alternatives --install/usr/bin/jar jar usr/local/java/bin/jar 2

# alternatives --set java usr/local/java/bin/java
# alternatives --set javac usr/local/java/bin/javac
# alternatives --set jar usr/local/java/bin/jar

上記で説明したように、ターミナルからコマンド java -version を使用してインストールを検証します。

ステップ2:Hadoopインストールの検証

Sqoopをインストールする前に、Hadoopをシステムにインストールする必要があります。 次のコマンドを使用してHadoopのインストールを確認しましょう-

$ hadoop version

Hadoopが既にシステムにインストールされている場合、次の応答が表示されます-

Hadoop 2.4.1
--
Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768
Compiled by hortonmu on 2013-10-07T06:28Z
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4

Hadoopがシステムにインストールされていない場合は、次の手順に進みます-

Hadoopをダウンロードする

次のコマンドを使用して、Apache Software FoundationからHadoop 2.4.1をダウンロードして抽出します。

$ su
password:

# cd/usr/local
# wget http://apache.claz.org/hadoop/common/hadoop-2.4.1/
hadoop-2.4.1.tar.gz
# tar xzf hadoop-2.4.1.tar.gz
# mv hadoop-2.4.1/* to hadoop/
# exit

擬似分散モードでのHadoopのインストール

以下の手順に従って、Hadoop 2.4.1を擬似分散モードでインストールします。

ステップ1:Hadoopのセットアップ

〜/.bashrcファイルに次のコマンドを追加することにより、Hadoop環境変数を設定できます。

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

次に、すべての変更を現在実行中のシステムに適用します。

$ source ~/.bashrc

ステップ2:Hadoopの構成

すべてのHadoop設定ファイルは、「$ HADOOP_HOME/etc/hadoop」の場所にあります。 Hadoopインフラストラクチャに応じて、これらの構成ファイルに適切な変更を加える必要があります。

$ cd $HADOOP_HOME/etc/hadoop

javaを使用してHadoopプログラムを開発するには、JAVA_HOME値をシステム内のjavaの場所に置き換えて、 hadoop-env.sh ファイルのjava環境変数をリセットする必要があります。

export JAVA_HOME=/usr/local/java

以下に、Hadoopを構成するために編集する必要があるファイルのリストを示します。

*core-site.xml*

core-site.xmlファイルには、Hadoopインスタンスに使用されるポート番号、ファイルシステムに割り当てられたメモリ、データを保存するためのメモリ制限、読み取り/書き込みバッファのサイズなどの情報が含まれています。

core-site.xmlを開き、<configuration>タグと</configuration>タグの間に次のプロパティを追加します。

<configuration>
   <property>
      <name>fs.default.name</name>
      <value>hdfs://localhost:9000 </value>
   </property>
</configuration>
*hdfs-site.xml*

hdfs-site.xmlファイルには、レプリケーションデータの値、namenodeパス、ローカルファイルシステムのdatanodeパスなどの情報が含まれています。 これは、Hadoopインフラストラクチャを保存する場所を意味します。

次のデータを想定します。

dfs.replication (data replication value) = 1

(In the following path/hadoop/is the user name.
hadoopinfra/hdfs/namenode is the directory created by hdfs file system.)
namenode path =//home/hadoop/hadoopinfra/hdfs/namenode

(hadoopinfra/hdfs/datanode is the directory created by hdfs file system.)
datanode path =//home/hadoop/hadoopinfra/hdfs/datanode

このファイルを開き、このファイルの<configuration>タグと</configuration>タグの間に次のプロパティを追加します。

<configuration>
   <property>
      <name>dfs.replication</name>
      <value>1</value>
   </property>

   <property>
      <name>dfs.name.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/namenode </value>
   </property>

   <property>
      <name>dfs.data.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/datanode </value>
   </property>
</configuration>

-上記のファイルでは、すべてのプロパティ値はユーザー定義であり、Hadoopインフラストラクチャに応じて変更できます。

*yarn-site.xml*

このファイルは、Hadoopに糸を設定するために使用されます。 yarn-site.xmlファイルを開き、このファイルの<configuration>タグと</configuration>タグの間に次のプロパティを追加します。

<configuration>
   <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
   </property>
</configuration>
*mapred-site.xml*

このファイルは、使用しているMapReduceフレームワークを指定するために使用されます。 デフォルトでは、Hadoopにはyarn-site.xmlのテンプレートが含まれています。 まず、次のコマンドを使用して、mapred-site.xml.templateからmapred-site.xmlファイルにファイルをコピーする必要があります。

$ cp mapred-site.xml.template mapred-site.xml

mapred-site.xmlファイルを開き、このファイルの<configuration>タグと</configuration>タグの間に次のプロパティを追加します。

<configuration>
   <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
   </property>
</configuration>

Hadoopインストールの検証

次の手順を使用して、Hadoopのインストールを確認します。

ステップ1:ノードのセットアップに名前を付ける

次のようにコマンド「hdfs namenode -format」を使用して、namenodeをセットアップします。

$ cd ~
$ hdfs namenode -format

期待される結果は次のとおりです。

10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/192.168.1.11
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.4.1
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted.
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to
retain 1 images with txid >= 0
10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11
************************************************************/

ステップ2:Hadoop dfの検証

次のコマンドは、dfsを開始するために使用されます。 このコマンドを実行すると、Hadoopファイルシステムが起動します。

$ start-dfs.sh

予想される出力は次のとおりです-

10/24/14 21:37:56
Starting namenodes on [localhost]
localhost: starting namenode, logging to/home/hadoop/hadoop-
2.4.1/logs/hadoop-hadoop-namenode-localhost.out
localhost: starting datanode, logging to/home/hadoop/hadoop-
2.4.1/logs/hadoop-hadoop-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]

ステップ3:糸スクリプトの検証

次のコマンドを使用して、糸スクリプトを開始します。 このコマンドを実行すると、糸デーモンが起動します。

$ start-yarn.sh

予想される出力は次のとおりです-

starting yarn daemons
starting resourcemanager, logging to/home/hadoop/hadoop-
2.4.1/logs/yarn-hadoop-resourcemanager-localhost.out
localhost: starting node manager, logging to/home/hadoop/hadoop-
2.4.1/logs/yarn-hadoop-nodemanager-localhost.out

ステップ4:ブラウザーでHadoopにアクセスする

Hadoopにアクセスするためのデフォルトのポート番号は50070です。 次のURLを使用して、ブラウザーでHadoopサービスを取得します。

http://localhost:50070/

次の画像は、Hadoopブラウザーを示しています。

ブラウザでのHadoopへのアクセス

ステップ5:クラスターのすべてのアプリケーションを確認する

クラスターのすべてのアプリケーションにアクセスするためのデフォルトのポート番号は8088です。 このサービスにアクセスするには、次のURLを使用してください。

http://localhost:8088/

次の画像は、Hadoopクラスターブラウザーを示しています。

Hadoopアプリケーションクラスター

ステップ3:Sqoopをダウンロードする

Sqoopの最新バージョンは、次のhttps://sqoop.apache.org [link]からダウンロードできます。このチュートリアルでは、バージョン1.4.5、つまり sqoop-1.4.5.bin__hadoop-2.0.4を使用しています。 -alpha.tar.gz

ステップ4:Sqoopのインストール

次のコマンドを使用して、Sqoop tarボールを抽出し、「/usr/lib/sqoop」ディレクトリに移動します。

$tar -xvf sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz
$ su
password:

# mv sqoop-1.4.4.bin__hadoop-2.0.4-alpha/usr/lib/sqoop
#exit

ステップ5:bashrcの構成

次の行を〜/*。bashrc *ファイルに追加して、Sqoop環境を設定する必要があります-

#Sqoop
export SQOOP_HOME=/usr/lib/sqoop export PATH=$PATH:$SQOOP_HOME/bin

〜/*。bashrc *ファイルを実行するには、次のコマンドを使用します。

$ source ~/.bashrc

ステップ6:Sqoopの構成

HadoopでSqoopを設定するには、 $ SQOOP_HOME/conf ディレクトリにある sqoop-env.sh ファイルを編集する必要があります。 まず、Sqoop configディレクトリにリダイレクトし、次のコマンドを使用してテンプレートファイルをコピーします-

$ cd $SQOOP_HOME/conf
$ mv sqoop-env-template.sh sqoop-env.sh
*sqoop-env.sh* を開き、次の行を編集します-
export HADOOP_COMMON_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=/usr/local/hadoop

ステップ7:mysql-connector-javaをダウンロードして構成する

次のhttp://ftp.ntu.edu.tw/MySQL/Downloads/Connector-J/.[link]から mysql-connector-java-5.1.30.tar.gz ファイルをダウンロードできます。

次のコマンドを使用して、mysql-connector-java tarballを抽出し、 mysql-connector-java-5.1.30-bin.jar を/usr/lib/sqoop/libディレクトリに移動します。

$ tar -zxf mysql-connector-java-5.1.30.tar.gz
$ su
password:

# cd mysql-connector-java-5.1.30
# mv mysql-connector-java-5.1.30-bin.jar/usr/lib/sqoop/lib

ステップ8:Sqoopの検証

次のコマンドを使用して、Sqoopバージョンを確認します。

$ cd $SQOOP_HOME/bin
$ sqoop-version

期待される出力-

14/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
Sqoop 1.4.5 git commit id 5b34accaca7de251fc91161733f906af2eddbe83
Compiled by abe on Fri Aug 1 11:19:26 PDT 2014

Sqoopのインストールが完了しました。

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

Sqoop-すべてのテーブルのインポート

この章では、RDBMSデータベースサーバーからHDFSにすべてのテーブルをインポートする方法について説明します。 各テーブルデータは個別のディレクトリに格納され、ディレクトリ名はテーブル名と同じです。

構文

すべてのテーブルをインポートするには、次の構文を使用します。

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

*userdb* データベースからすべてのテーブルをインポートする例を見てみましょう。 データベース *userdb* に含まれるテーブルのリストは次のとおりです。
 +--------------------+
 |      Tables        |
 +--------------------+
 |      emp           |
 |      emp_add       |
 |      emp_contact   |
 +--------------------+

次のコマンドを使用して、 userdb データベースからすべてのテーブルをインポートします。

$ sqoop import-all-tables \
--connect jdbc:mysql://localhost/userdb \
--username root

-import-all-tablesを使用している場合、そのデータベース内のすべてのテーブルに主キーフィールドが必要です。

次のコマンドは、HDFSのuserdbデータベースに対するすべてのテーブルデータを確認するために使用されます。

$ $HADOOP_HOME/bin/hadoop fs -ls

userdbデータベース内のテーブル名のリストがディレクトリとして表示されます。

出力

drwxr-xr-x - hadoop supergroup 0 2014-12-22 22:50 _sqoop
drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:46 emp
drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:50 emp_add
drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:52 emp_contact

Sqoop-エクスポート

この章では、HDFSからRDBMSデータベースにデータをエクスポートする方法について説明します。 ターゲットテーブルは、ターゲットデータベースに存在する必要があります。 Sqoopへの入力として提供されるファイルには、テーブル内の行と呼ばれるレコードが含まれています。 これらは読み取られ、解析されて一連のレコードになり、ユーザー指定の区切り文字で区切られます。

デフォルトの操作では、INSERTステートメントを使用して、入力ファイルのすべてのレコードをデータベーステーブルに挿入します。 更新モードでは、Sqoopは既存のレコードをデータベースに置き換えるUPDATEステートメントを生成します。

構文

exportコマンドの構文は次のとおりです。

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

HDFSのファイルにある従業員データの例を見てみましょう。 従業員データは、HDFSの「emp/」ディレクトリの emp_data ファイルで入手できます。 emp_data は次のとおりです。

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

エクスポートするテーブルは手動で作成し、エクスポートする必要のあるデータベースに存在することが必須です。

次のクエリを使用して、mysqlコマンドラインでテーブル「従業員」を作成します。

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

次のコマンドを使用して、テーブルデータ(HDFSの emp_data ファイル内)をMysqlデータベースサーバーのdbデータベースの従業員テーブルにエクスポートします。

$ sqoop export \
--connect jdbc:mysql://localhost/db \
--username root \
--table employee \
--export-dir/emp/emp_data

次のコマンドを使用して、mysqlコマンドラインのテーブルを確認します。

mysql>select * from employee;

指定されたデータが正常に保存された場合、指定された従業員データの次の表を見つけることができます。

+------+--------------+-------------+-------------------+--------+
| Id   | Name         | Designation | Salary            | Dept   |
+------+--------------+-------------+-------------------+--------+
| 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     |
+------+--------------+-------------+-------------------+--------+

Sqoop-ジョブ

この章では、Sqoopジョブを作成および管理する方法について説明します。 Sqoopジョブは、インポートコマンドとエクスポートコマンドを作成して保存します。 保存されたジョブを識別して呼び出すためのパラメーターを指定します。 この再呼び出しまたは再実行は増分インポートで使用され、更新された行をRDBMSテーブルからHDFSにインポートできます。

構文

以下は、Sqoopジョブを作成するための構文です。

$ sqoop job (generic-args) (job-args)
   [-- [subtool-name] (subtool-args)]

$ sqoop-job (generic-args) (job-args)
   [-- [subtool-name] (subtool-args)]

ジョブの作成(-作成)

ここでは、RDBMSテーブルからHDFSにテーブルデータをインポートできる myjob という名前のジョブを作成しています。 次のコマンドは、 db データベースの employee テーブルからHDFSファイルにデータをインポートするジョブを作成するために使用されます。

$ sqoop job --create myjob \
-- import \
--connect jdbc:mysql://localhost/db \
--username root \
--table employee --m 1

検証ジョブ(--list)

*'-list'* 引数は、保存されたジョブを確認するために使用されます。 次のコマンドは、保存されたSqoopジョブのリストを確認するために使用されます。
$ sqoop job --list

保存されたジョブのリストが表示されます。

Available jobs:
   myjob

ジョブの検査(--show)

*'-show'* 引数は、特定のジョブとその詳細を検査または検証するために使用されます。 次のコマンドとサンプル出力を使用して、 *myjob* というジョブを検証します。
$ sqoop job --show myjob
*myjob* で使用されるツールとそのオプションが表示されます。
Job: myjob
 Tool: import Options:
 ----------------------------
 direct.import = true
 codegen.input.delimiters.record = 0
 hdfs.append.dir = false
 db.table = employee
 ...
 incremental.last.value = 1206
 ...

ジョブの実行(--exec)

*'-exec'* オプションは、保存されたジョブを実行するために使用されます。 次のコマンドは、 *myjob* という名前の保存済みジョブを実行するために使用されます。
$ sqoop job --exec myjob

次の出力が表示されます。

10/08/19 13:08:45 INFO tool.CodeGenTool: Beginning code generation
...

Sqoop-コード生成

この章では、「codegen」ツールの重要性について説明します。 オブジェクト指向アプリケーションの観点から、すべてのデータベーステーブルには、オブジェクトを初期化する「getter」および「setter」メソッドを含む1つのDAOクラスがあります。 このツール(-codegen)は、DAOクラスを自動的に生成します。

テーブルスキーマ構造に基づいて、JavaでDAOクラスを生成します。 Java定義は、インポートプロセスの一部としてインスタンス化されます。 このツールの主な使用法は、JavaがJavaコードを失ったかどうかを確認することです。 その場合、フィールド間のデフォルトの区切り文字を使用して新しいバージョンのJavaが作成されます。

構文

以下は、Sqoop codegenコマンドの構文です。

$ sqoop codegen (generic-args) (codegen-args)
$ sqoop-codegen (generic-args) (codegen-args)

*userdb* データベースの *emp* テーブルのJavaコードを生成する例を見てみましょう。

次のコマンドを使用して、指定された例を実行します。

$ sqoop codegen \
--connect jdbc:mysql://localhost/userdb \
--username root \
--table emp

コマンドが正常に実行されると、端末に次の出力が生成されます。

14/12/23 02:34:40 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
14/12/23 02:34:41 INFO tool.CodeGenTool: Beginning code generation
……………….
14/12/23 02:34:42 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is/usr/local/hadoop
Note:/tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.java uses or
   overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

14/12/23 02:34:47 INFO orm.CompilationManager: Writing jar file:
  /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.jar

検証

出力を見てみましょう。 太字のパスは、 emp テーブルのJavaコードが生成および保存する場所です。 次のコマンドを使用して、その場所のファイルを確認します。

$ cd/tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/
$ ls
emp.class
emp.jar
emp.java

詳細に検証する場合は、 userdb データベースの emp テーブルと次のディレクトリの emp.java を比較します

/tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/。

Sqoop-評価

この章では、Sqoopの「評価」ツールの使用方法について説明します。 ユーザーは、各データベースサーバーに対してユーザー定義のクエリを実行し、コンソールで結果をプレビューできます。 したがって、ユーザーは結果の表データがインポートされることを期待できます。 evalを使用して、DDLまたはDMLステートメントのいずれかである可能性がある任意のタイプのSQLクエリを評価できます。

構文

次の構文は、Sqoop evalコマンドに使用されます。

$ sqoop eval (generic-args) (eval-args)
$ sqoop-eval (generic-args) (eval-args)

クエリ評価を選択

evalツールを使用して、あらゆるタイプのSQLクエリを評価できます。 db データベースの employee テーブルで制限された行を選択する例を見てみましょう。 次のコマンドは、SQLクエリを使用して特定の例を評価するために使用されます。

$ sqoop eval \
--connect jdbc:mysql://localhost/db \
--username root \
--query “SELECT * FROM employee LIMIT 3”

コマンドが正常に実行されると、端末に次の出力が生成されます。

+------+--------------+-------------+-------------------+--------+
| Id   | Name         | Designation | Salary            | Dept   |
+------+--------------+-------------+-------------------+--------+
| 1201 | gopal        | manager     | 50000             | TP     |
| 1202 | manisha      | preader     | 50000             | TP     |
| 1203 | khalil       | php dev     | 30000             | AC     |
+------+--------------+-------------+-------------------+--------+

クエリ評価の挿入

Sqoop evalツールは、SQLステートメントのモデリングと定義の両方に適用できます。 つまり、挿入ステートメントにもevalを使用できます。 次のコマンドを使用して、 db データベースの employee テーブルに新しい行を挿入します。

$ sqoop eval \
--connect jdbc:mysql://localhost/db \
--username root \
-e “INSERT INTO employee VALUES(1207,‘Raju’,‘UI dev’,15000,‘TP’)”

コマンドが正常に実行されると、更新された行のステータスがコンソールに表示されます。

または、MySQLコンソールで従業員テーブルを確認できます。 次のコマンドは、selectクエリを使用して、 db データベースの employee テーブルの行を確認するために使用されます。

mysql>
mysql> use db;
mysql> SELECT * FROM employee;
+------+--------------+-------------+-------------------+--------+
| Id   | Name         | Designation | Salary            | Dept   |
+------+--------------+-------------+-------------------+--------+
| 1201 | gopal        | manager     | 50000             | TP     |
| 1202 | manisha      | preader     | 50000             | TP     |
| 1203 | khalil       | php dev     | 30000             | AC     |
| 1204 | prasanth     | php dev     | 30000             | AC     |
| 1205 | kranthi      | admin       | 20000             | TP     |
| 1206 | satish p     | grp des     | 20000             | GR     |
| 1207 | Raju         | UI dev      | 15000             | TP     |
+------+--------------+-------------+-------------------+--------+

Sqoop-データベースのリスト

この章では、Sqoopを使用してデータベースをリストする方法について説明します。 Sqoopリストデータベースツールは、データベースサーバーに対して「SHOW DATABASES」クエリを解析して実行します。 その後、サーバー上の現在のデータベースをリストします。

構文

次の構文は、Sqoop list-databasesコマンドに使用されます。

$ sqoop list-databases (generic-args) (list-databases-args)
$ sqoop-list-databases (generic-args) (list-databases-args)

サンプルクエリ

次のコマンドを使用して、MySQLデータベースサーバー内のすべてのデータベースを一覧表示します。

$ sqoop list-databases \
--connect jdbc:mysql://localhost/\
--username root

コマンドが正常に実行されると、MySQLデータベースサーバー内のデータベースのリストが次のように表示されます。

...
13/05/31 16:45:58 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.

mysql
test
userdb
db

Sqoop-リストテーブル

この章では、Sqoopを使用して、MySQLデータベースサーバー内の特定のデータベースのテーブルをリストする方法について説明します。 Sqoopリストテーブルツールは、特定のデータベースに対して「SHOW TABLES」クエリを解析して実行します。 その後、データベース内の現在のテーブルをリストします。

構文

次の構文は、Sqoop list-tablesコマンドに使用されます。

$ sqoop list-tables (generic-args) (list-tables-args)
$ sqoop-list-tables (generic-args) (list-tables-args)

サンプルクエリ

次のコマンドは、MySQLデータベースサーバーの userdb データベース内のすべてのテーブルを一覧表示するために使用されます。

$ sqoop list-tables \
--connect jdbc:mysql://localhost/userdb \
--username root

コマンドが正常に実行されると、次のように userdb データベース内のテーブルのリストが表示されます。

...
13/05/31 16:45:58 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.

emp
emp_add
emp_contact

Sqoop-questions-answers