Sqoop を使用する

Prev Next

VPC環境で利用できます。

Sqoop(SQL to Hadoop)は、Hadoopと関係データベースの間でデータを配信できるように設計されたオープンソースソフトウェアです。
簡単な CLIで Oracle、MySQLなど RDBMSの特定のテーブルまたは特定の条件に合ったデータを手軽に HDFSに移動でき、Hive、Pig、HBaseなどにすぐに移して確認できます。逆に、HDFSに保存されているデータを RDBMSへ移すこともできます。

Sqoopは2009年最初のバージョンが出て以来、2012年に Apache Top Level Projectとなり、継続して発展しています。現在、Apache Sqoopは Sqoop 1、Sqoop 2の2つのバージョンで発展しつつあります。Sqoop 1はクライアント方式で、Sqoop 2は既存の Sqoop 1方式にサーバサイド方式が追加されたバージョンです。

NAVERクラウドプラットフォームの Cloud Hadoopでサポートする クラスタ Type には、Sqoopがデフォルトでインストールされています。
このガイドでは、Sqoopを用いて MySQLデータを Cloud Hadoopにコピーする方法とその逆のパターンについて説明します。
その他の Sqoopの使用方法は、Apache Sqoop Documentationをご参照ください。

参考

このガイドでは、MySQL 5バージョンを基準に説明しています。 MySQL 8バージョンにマイグレーションする場合、コネクタのバージョンアップグレードが必要です。

8バージョンのコネクタバージョンは近日中にアップデートされる予定です。

事前ジョブ

Cloud Hadoopで Sqoopを使用するには、以下のような事前ジョブが必要です。

項目 説明 ガイド
ACGおよび ACLの設定 Cloud Hadoopクラスタサーバと RDBMSサーバ間に通信を行えるように設定 ファイアウォール設定(ACG)
RDBMS ソースデータが保存されている RDBMS

事前ジョブの完了後、以下の手順に従ってください。

1. Hadoopクラスタにアクセス

ジョブを行う Cloud Hadoopクラスタのマスターノードにアクセスします。
クラスタのマスターノードにアクセスする方法は、SSHでクラスタノードにアクセスガイドをご参照ください。

2. MySQLアクセスおよびインポートする対象データを確認

  1. 以下のコマンドを実行し、リモート MySQLサーバにアクセスできるように MySQLクライアントがインストールされているか確認します。

    • マスターノード(2台)には、MySQLクライアントがデフォルトでインストールされています。
    [sshuser@m-001-example-1fx8-hd ~]$ mysql -V
    mysql  Ver 14.14 Distrib 5.7.37, for Linux (x86_64) using  EditLine wrapper
    
  2. 以下のコマンドを実行して MySQLサーバに接続されたか確認します。

    mysql -h mysql.local -u [クラスタ管理者のアカウント名 ] -p
    


    アクセス例

    [sshuser@m-001-example-1fx8-hd ~]$ mysql -u example -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 37
    Server version: 5.7.37-log MySQL Community Server (GPL)
    Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql>
    
    注意

    接続がうまくいかない場合は、MySQL DBのポートで ACGがうまく開いているか確認し、MySQL DB自体の ACLリストをご確認ください。

  3. ユーザーの MySQL DBサーバから Hadoopクラスタ HDFSにインポートするデータを確認します。

    • 以下の例は、sqoopというデータベースに SQOOP_TESTテーブルがあらかじめ作成されたステータスです。
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sqoop              |
    +--------------------+
    4 rows in set (0.00 sec)
    
    mysql> use sqoop
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> show tables;
    +-----------------+
    | Tables_in_sqoop |
    +-----------------+
    | SQOOP_TEST      |
    +-----------------+
    1 row in set (0.00 sec)
    
    mysql> select * from SQOOP_TEST;
    +--------------+--------+-----------+------+---------------------+------+------+--------+
    | SQOOP_TESTNO | ENAME  | JOB       | MGR  | HIREDATE            | SAL  | COMM | DEPTNO |
    +--------------+--------+-----------+------+---------------------+------+------+--------+
    |         7369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800 | NULL |     20 |
    |         7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600 |  300 |     30 |
    |         7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250 |  500 |     30 |
    |         7566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975 | NULL |     20 |
    |         7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250 | 1400 |     30 |
    |         7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850 | NULL |     30 |
    |         7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450 | NULL |     10 |
    |         7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000 | NULL |     20 |
    |         7839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000 | NULL |     10 |
    |         7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500 |    0 |     30 |
    |         7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100 | NULL |     20 |
    |         7900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950 | NULL |     30 |
    |         7902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000 | NULL |     20 |
    |         7934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300 | NULL |     10 |
    +--------------+--------+-----------+------+---------------------+------+------+--------+
    14 rows in set (0.00 sec)
    

3. Sqoopコマンドでデータをインポート

  1. sudo su - [ユーザーアカウント] コマンドを実行してユーザーアカウントに切り替えます。

    [sshuser@m-001-example-1fx8-hd ~]$ sudo su - test
    [test@m-001-example-1fx8-hd ~]#
    
    
  2. Sqoopコマンドの importを利用してデータを importします。

    • importコマンドを用いると、特定のデータベース、特定のテーブル、クエリの実行結果などをインポートできます。

          sqoop import --connect jdbc:mysql://[マスターノード Private IP]:3306/[データベース名] --username [クラスタ管理者のアカウント名] --password [クラスタ管理者のパスワード] --table [対象テーブル]
      
    • importコマンドを用いると、特定のデータベース、特定のテーブル、クエリの実行結果などをインポートできます。Sqoop importコマンドの一般的なオプションは、下記の表をご参照ください。

    引数 説明
    --connect <jdbc-uri> JDBC接続文字列を指定
    --connection-manager <class-name> 使用する接続管理者クラスを指定
    --driver <class-name> 使用する JDBCドライバクラスを手動で指定するときに使用
    --hadoop-home <dir> $ HADOOP_HOMEに指定
    --help ヘルプ
    -P コンソールでパスワードを読み込む
    --password <password> 認証パスワードを設定
    --username <username> 認証ユーザー名を設定
    --verbose ジョブ中により多くの情報を出力する場合に使用
    --connection-param-file <filename> 接続パラメータを提供する任意の属性ファイルを指定

Sqoopは、MapReduceジョブを通じてデータをインポートします。以下は、最も一般的な方法で特定のデータベースの特定のテーブルをインポートするユースケースです。

[root@m-001-example-1fx8-hd ~]# sqoop import --connect jdbc:mysql://[マスターノード Private IP]:3306/sqoop \
--username [クラスタ管理者のアカウント名] \
-P --table sqoop_test \
--hive-import --create-hive-table --hive-table sqoop_workspace.sqoop_test -m 1

...

18/08/03 09:06:38 INFO client.RequestHedgingRMFailoverProxyProvider: Looking for the active RM in [rm1, rm2]...
18/08/03 09:06:38 INFO client.RequestHedgingRMFailoverProxyProvider: Found active RM [rm1]
18/08/03 09:06:42 INFO db.DBInputFormat: Using read commited transaction isolation
18/08/03 09:06:42 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(`SQOOP_TESTNO`), MAX(`SQOOP_TESTNO`) FROM `SQOOP_TEST`
18/08/03 09:06:42 INFO db.IntegerSplitter: Split size: 141; Num splits: 4 from: 7369 to: 7934
18/08/03 09:06:42 INFO mapreduce.JobSubmitter: number of splits:4
18/08/03 09:06:42 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1532345019075_0002
18/08/03 09:06:43 INFO impl.YarnClientImpl: Submitted application application_1532345019075_0002
18/08/03 09:06:43 INFO mapreduce.Job: The url to track the job: http://m-002-obj001.hd:8088/proxy/application_1532345019075_0002/
18/08/03 09:06:43 INFO mapreduce.Job: Running job: job_1532345019075_0002
18/08/03 09:06:49 INFO mapreduce.Job: Job job_1532345019075_0002 running in uber mode : false
18/08/03 09:06:49 INFO mapreduce.Job:  map 0% reduce 0%
18/08/03 09:06:57 INFO mapreduce.Job:  map 75% reduce 0%
18/08/03 09:07:38 INFO mapreduce.Job:  map 100% reduce 0%
18/08/03 09:07:40 INFO mapreduce.Job: Job job_1532345019075_0002 completed successfully
18/08/03 09:07:40 INFO mapreduce.Job: Counters: 30
        File System Counters
                FILE: Number of bytes read=0
                FILE: Number of bytes written=683688
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                S3A: Number of bytes read=497
                S3A: Number of bytes written=853
                S3A: Number of read operations=44
                S3A: Number of large read operations=0
                S3A: Number of write operations=36
        Job Counters
                Launched map tasks=4
                Other local map tasks=4
                Total time spent by all maps in occupied slots (ms)=277580
                Total time spent by all reduces in occupied slots (ms)=0
                Total time spent by all map tasks (ms)=55516
                Total vcore-milliseconds taken by all map tasks=55516
                Total megabyte-milliseconds taken by all map tasks=170545152
        Map-Reduce Framework
                Map input records=14
                Map output records=14
                Input split bytes=497
                Spilled Records=0
                Failed Shuffles=0
                Merged Map outputs=0
                GC time elapsed (ms)=248
                CPU time spent (ms)=5690
                Physical memory (bytes) snapshot=1087877120
                Virtual memory (bytes) snapshot=12255760384
                Total committed heap usage (bytes)=702545920
        File Input Format Counters
                Bytes Read=0
        File Output Format Counters
                Bytes Written=853
18/08/03 09:07:40 INFO mapreduce.ImportJobBase: Transferred 0 bytes in 62.4343 seconds (0 bytes/sec)
18/08/03 09:07:40 INFO mapreduce.ImportJobBase: Retrieved 14 records.
注意

importするテーブルには、Primary Keyが必ず必要です。Primary Keyを持っていないと、以下のようなエラーが発生します。

18/08/03 09:00:25 ERROR tool.ImportTool: Error during import: No primary key could be found for table SQOOP_TEST. Please specify one with --split-by or perform a sequential import with '-m 1'.

4. Hiveで HDFSデータを確認

  1. Hiveを通じて、テーブルが正常に保存されているか確認します。
  2. importしたテーブルが正常に保存されているかを確認するクエリを作成し、実行します。
SELECT * FROM sqoop_workspace.sqoop_test;

chadoop-4-1-101_ko

よくある質問を先にご確認ください。

Q. Cloud hadoopサービスのマスターノードで Sqoop Clientを使用したいのですが、jdbcドライバを datanodeにも追加する必要がありますか?
A. jdbcドライバを datanodeでインストールする必要はなく、Sqoopコマンドを使用するサーバに jdbcドライバがあれば使用できます。