Sqoop を使用する
    • PDF

    Sqoop を使用する

    • PDF

    Article Summary

    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 -コマンドを実行して rootアカウントに切り替えます。

      [sshuser@m-001-example-1fx8-hd ~]$ sudo su -
      [root@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_ja.png

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

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


    この記事は役に立ちましたか?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.