- 印刷する
- PDF
Sqoop を使用する
- 印刷する
- PDF
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アクセスおよびインポートする対象データを確認
以下のコマンドを実行し、リモート 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
以下のコマンドを実行して 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リストをご確認ください。
ユーザーの 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コマンドでデータをインポート
sudo su -
コマンドを実行して rootアカウントに切り替えます。[sshuser@m-001-example-1fx8-hd ~]$ sudo su - [root@m-001-example-1fx8-hd ~]#
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データを確認
- Hiveを通じて、テーブルが正常に保存されているか確認します。
- Hiveの使用方法は、Hive を使用するガイドをご参照ください。
- importしたテーブルが正常に保存されているかを確認するクエリを作成し、実行します。
SELECT * FROM sqoop _workspace.sqoop_ test;
よくある質問を先にご確認ください。
Q. Cloud hadoopサービスのマスターノードで Sqoop Clientを使用したいのですが、jdbcドライバを datanodeにも追加する必要がありますか?
A. jdbcドライバを datanodeでインストールする必要はなく、Sqoopコマンドを使用するサーバに jdbcドライバがあれば使用できます。