使用前に

Q. Sqoopとは何ですか?

  • SqoopはSQL to Hadoopの略字で、Hadoopと関係型データベース間でデータを転送できるように設計されたオープンソースソフトウェアです。
  • 簡単なCLI(Command Line Interface)でOracle, MySQLなどのRDBMSの特定テーブルまたは特定条件に合ったデータをHDFSに簡単に移すことができ、Hive, Pig, HBaseにすぐ移して確認できます。

    逆にHDFSに保存されているデータをRDBMSに移すこともできます。

  • Sqoopは2009年初のバージョンが発売されてから2012年にApache Top Level Projectになり、引き続き発展しています。現在Apache SqoopはSqoop 1, Sqoop 2バージョンに発展しています。Sqoop 1はクライアント方式で Sqoop 2は既存のSqoop 1 方式に追加でServer side方式が追加されました。

Q. Sqoopはどのように使用しますか?

Sqoop機能はimport以外にも色々ありますが、この文書ではRDBMSに保存されたデータをSqoopを使用して HDFSに移す過程を説明します。

その他Sqoopの使用法はApache社のSqoop使用ガイドをご参照ください。

Cloud HadoopでのSqoop使用法

事前作業

  • 原本データが保存されているRDBMSが必要です。本文ではMySQLが設置されたNAVERクラウドプラットフォームサーバで構成しました。
  • Cloud HadoopクラスタサーバとRDBMS サーバ間の通信ができるようにACG及びACLを設定する必要があります。

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

① 作業しようとするHadoopクラスタのマスターノードにアクセスします。

② アクセス方法は クラスタアクセス:サーバ直接アクセス、トンネリングをご参照ください。

Step 2. MySQLアクセス及びimportを受ける対象データの確認

① 遠隔MySQLサーバにアクセスできるようにMySQL Clientがあるか確認します。

  • 基本的にはマスターノード(2台)にはMySQL Clientが設置されています。以下の命令語で設置可否を確認できます。

      [root@localhost ~]# mysql -V
      mysql  Ver 14.14 Distrib 5.6.41, for Linux (x86_64) using  EditLine wrapper
    
  • データノードでMySQL遠隔アクセスがしたい時は以下の命令語でMySQL Clientを設置します。

      [root@localhost ~] # yum -y install mysql
    

② 接続を確認します。

  • アクセス命令語: mysql -h [MySQL DBサーバのパブリックIP] -p
  • アクセス例

      [root@objobj001 ~]# mysql -h 10.10.10.10 -p
      Enter password:
      Welcome to the MySQL monitor.  Commands end with ; or \g.
      Your MySQL connection id is 37
      Server version: 5.6.35-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リストを確認します。

③ マイMySQL DB サーバ内でHadoopクラスタHDFSでimport受けるデータを確認します。

  • 例としてsqoopというデータベースを生成しておいてSQOOP_TESTテーブルを生成しておきました。
[root@objobj001 ~]# mysql -h 10.10.10.10 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 42
Server version: 5.6.35-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> 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)

Step 3. Sqoop命令語でimportを受ける

① Sqoop命令語を利用して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 認証ユーザー名の設定
--verbose 作業する間により多くの情報を印刷する際に使用
--connection-param-file <filename> 接続媒介変数を提供する選択的な特性ファイルの指定
  • importには特定データベース、特定テーブル、クエリ実行結果などのimportが可能です。
  • 以下は最も一般的な方法で特定データベースの特定テーブルをimportする例題です。
  • import 命令語: sqoop import --connect jdbc:mysql://[MySQL DBサーバパブリックIP]/[データベース名] --username [user名] --password [パスワード] --table [対象テーブル]
  • SqoopはMapReduce作業を通じてデータを持ち込みます。
[root@objobj001 ~]# sqoop import --connect jdbc:mysql://10.10.10.10/sqoop --username root -P --table sqoop_test --hive-import --create-hive-table --hive-table sqoop_workspace.sqoop_test -m -1
Warning: /usr/hdp/2.6.5.0-292/hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /usr/hdp/2.6.5.0-292/accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
18/08/03 09:06:34 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6.2.6.5.0-292
18/08/03 09:06:34 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
18/08/03 09:06:34 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
18/08/03 09:06:34 INFO tool.CodeGenTool: Beginning code generation
18/08/03 09:06:35 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `SQOOP_TEST` AS t LIMIT 1
18/08/03 09:06:35 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `SQOOP_TEST` AS t LIMIT 1
18/08/03 09:06:35 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/hdp/2.6.5.0-292/hadoop-mapreduce
Note: /tmp/sqoop-root/compile/5f30acd07dd5fd9146104653a4615ef9/SQOOP_TEST.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
18/08/03 09:06:36 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-root/compile/5f30acd07dd5fd9146104653a4615ef9/SQOOP_TEST.jar
18/08/03 09:06:36 WARN manager.MySQLManager: It looks like you are importing from mysql.
18/08/03 09:06:36 WARN manager.MySQLManager: This transfer can be faster! Use the --direct
18/08/03 09:06:36 WARN manager.MySQLManager: option to exercise a MySQL-specific fast path.
18/08/03 09:06:36 INFO manager.MySQLManager: Setting zero DATETIME behavior to convertToNull (mysql)
18/08/03 09:06:36 INFO mapreduce.ImportJobBase: Beginning import of SQOOP_TEST
18/08/03 09:06:38 INFO client.AHSProxy: Connecting to Application History server at m-002-obj001.hd/10.33.81.208:10200
18/08/03 09:06:38 INFO mapreduce.JobSubmissionFiles: Permissions on staging directory /user/root/.staging are incorrect: rwxrwxrwx. Fixing permissions to correct value rwx------
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を受けるテーブルは必ずPKを持っている必要があります。PKを持っていない時は以下のようなエラーが発生します。
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'.

Step 4. HiveでHDFSデータの確認

Hiveを通じてテーブルがよく保存されているか確認してみます。Hiveの使用方法 Hive使用ガイドをご参照ください。

chadoop-4-1-101

① importを受けるテーブルがよくテーブルに保存されているか確認するクエリを作成します。

② 作成されたクエリを実行します。

関連情報へショートカット

Hadoopクラスタの生成、管理及び使用については以下の使用ガイドをご参照ください。

に対する検索結果は~件です。 ""

    に対する検索結果がありません。 ""

    処理中...