Sqoopはオープンソースのデータ移行ツールであり、主にHadoop(Hive)と従来のリレーショナルデータベース間でのデータ転送に使用されます。Sqoopは、MySQL、Oracle、PostgreSQLなどのリレーショナルデータベースからHadoopのHDFSにデータをインポートしたり、HDFSのデータをリレーショナルデータベースにエクスポートしたりすることができ、データ移行、データ同期、ETLなどのシナリオに適しています。
バージョン互換性
コンポーネント |
バージョン要件 |
|---|---|
| Sqoop | V1.4.7 |
| OceanBase JDBCドライバー | V2.4.0 |
| MySQL JDBCドライバー | V5.1.47 |
使用上の制限
- OceanBase JDBCドライバを使用する場合、OracleモードでHDFSデータをOceanBaseデータベースにエクスポートする際に
--tableパラメータの使用はサポートされておらず、ORA-00900という構文エラーが発生します。 - Oracleモードでデータをエクスポートする際には、
--queryパラメータを使用してクエリステートメントを指定する必要があります。 - OceanBase JDBCドライバを使用する場合、
--driver com.alipay.oceanbase.jdbc.Driverパラメータを手動で指定する必要があります。
前提条件
Sqoopを使用する前に、次のことを確認してください:
- Hadoop環境がインストール済みであること。Hadoopのインストールについては、Hadoop公式ドキュメントを参照してください。
- Sqoop V1.4.7がインストール済みであること。インストール方法については、Sqoop公式ドキュメントを参照してください。
- JDK 1.8環境がインストール済みであること。JDKのインストールについては、Oracle JDK公式ドキュメントを参照してください。
- OceanBase JDBCドライバ(V2.4.0)またはMySQL JDBCドライバ(V5.1.47)をダウンロードし、ドライバのJARファイルを
$SQOOP_HOME/libディレクトリに配置していること。 - OceanBaseデータベースのデプロイが完了し、MySQL/Oracleモードのユーザーテナントが作成されていること。テナント作成の詳細については、テナントの作成を参照してください。
手順
ステップ1:OceanBaseデータベースの接続文字列を取得する
OceanBaseデータベースのデプロイ担当者から接続文字列を取得します。例:
obclient -h$host -P$port -u$user_name -p$password -D$database_name
パラメータ説明:
$host:接続IPアドレス。ODP接続の場合はODPアドレスを使用し、直接接続の場合はOBServer IPを使用します。$port:接続ポート。ODPのデフォルトは2883、直接接続のデフォルトは2881です。$database_name:データベース名。注意
テナントに接続するユーザーには、データベースに対する
CREATE、INSERT、DROP、およびSELECT権限が付与されていなければなりません。ユーザー権限の詳細については、MySQLモードの権限分類を参照してください。$user_name:接続アカウント。ODP形式:ユーザー@テナント#クラスタまたはクラスタ:テナント:ユーザー。直接接続形式:ユーザー@テナント。$password:アカウントのパスワード。
接続文字列の詳細については、OBClientを使用してOceanBaseテナントに接続するを参照してください。
例:
obclient -hxxx.xxx.xxx.xxx -P2881 -utest_user001@mysql001 -p****** -Dtest
ステップ2:Sqoop環境を設定する
Sqoopインストールパッケージをダウンロードして解凍します:
Sqoop公式ダウンロードページにアクセスして
sqoop-1.4.7.bin__hadoop-2.6.0.tar.gzをダウンロードし、/usr/local/sqoopディレクトリにアップロードして解凍します。環境変数を設定します:
/etc/profileファイルを編集し、以下の内容を追加します:export SQOOP_HOME=/usr/local/sqoop-1.4.7 export PATH=$SQOOP_HOME/bin:$PATH環境変数を有効にします:
source /etc/profileコマンドを実行します。JDBCドライバーのJARファイルを
$SQOOP_HOME/libディレクトリに配置します。
ステップ3:OceanBaseドライバを使用してHDFSにデータをインポートする
OceanBase JDBCドライバを使用して、OceanBaseデータベースのデータをHDFSにインポートします。
MySQLモードの例:
sqoop import --direct \
--connect jdbc:oceanbase://$host:$port/$database_name \
--username $user_name \
--password $password \
--query "select * from $table_name where \$CONDITIONS" \
--target-dir /root/test \
--delete-target-dir \
--fields-terminated-by ',' \
-m 1 \
--bindir $SQOOP_HOME/lib \
--driver com.alipay.oceanbase.jdbc.Driver
Oracleモードの例:
sqoop import --direct \
--connect jdbc:oceanbase://$host:$port/$database_name \
--username $user_name \
--password $password \
--query "select * from $table_name where \$CONDITIONS" \
--target-dir /root/test \
--delete-target-dir \
--fields-terminated-by ',' \
-m 1 \
--bindir $SQOOP_HOME/lib \
--driver com.alipay.oceanbase.jdbc.Driver
注意
Oracleモードでは、--queryパラメータの使用が必須です。--tableパラメータはサポートされておらず、使用すると構文エラーが発生します。
よく使われるパラメータの説明:
パラメータ |
説明 |
|---|---|
--driver |
JDBCドライバークラスを手動で指定します。OceanBase JDBCドライバーを使用する場合は、com.alipay.oceanbase.jdbc.Driverとして指定する必要があります。 |
--connect |
データベースのJDBC接続URLを指定します。 |
--username |
データベースログインユーザー名。 |
--password |
データベースログインパスワード。 |
--query |
データをインポートするためのクエリステートメントを指定します。--target-dirと併用する必要があります。クエリ条件には\$CONDITIONSキーワードを含める必要があります。 |
--table |
インポートするデータテーブル名を指定します。--queryパラメータとどちらか一方を選択してください。 |
--target-dir |
HDFSターゲットパスを指定します。 |
--delete-target-dir |
ターゲットパスが既に存在する場合、先に削除します。 |
--fields-terminated-by |
フィールド区切り文字を設定します。デフォルトはカンマです。 |
-m または --num-mappers |
N個のMapタスクを起動してデータを並列インポートします。デフォルトは4です。 |
--bindir |
コンパイル生成されたclassファイルの保存先パスを指定します。 |
ステップ4:OceanBaseドライバを使用してHDFSデータをOceanBaseにエクスポートする
OceanBase JDBCドライバを使用して、HDFSのデータをOceanBaseデータベースにエクスポートします。
MySQLモードの例:
sqoop export --direct \
--connect jdbc:oceanbase://$host:$port/$database_name \
--username $user_name \
--password $password \
--table $table_name \
--export-dir /root/test \
--input-fields-terminated-by ',' \
-m 1 \
--bindir $SQOOP_HOME/lib \
--driver com.alipay.oceanbase.jdbc.Driver
注意
Oracleモードではエクスポート機能は利用できません。--tableパラメータを使用すると、構文エラーORA-00900が発生します。これは、OracleがAS構文を使用したテーブル名をサポートしていないためです。
よく使われるパラメータの説明:
パラメータ |
説明 |
|---|---|
--driver |
JDBCドライバークラスを手動で指定します。OceanBase JDBCドライバーを使用する場合は、com.alipay.oceanbase.jdbc.Driverと指定する必要があります。 |
--connect |
データベースのJDBC接続URLを指定します。 |
--username |
データベースログインユーザー名。 |
--password |
データベースログインパスワード。 |
--table |
エクスポート対象のデータテーブル名を指定します。 |
--export-dir |
HDFSソースデータパスを指定します。 |
--input-fields-terminated-by |
入力フィールド区切り文字を指定します。 |
-m または --num-mappers |
N個のMapタスクを起動してデータを並列エクスポートします。デフォルトは4です。 |
--bindir |
コンパイル生成されたclassファイルの保存先パスを指定します。 |
ステップ5:MySQLドライバを使用してMySQLテナントに接続する
MySQL JDBCドライバを使用して、OceanBaseのMySQLモードテナントに接続し、データのインポートおよびエクスポート操作を実行します。
接続テスト:
sqoop list-databases \
--connect jdbc:mysql://$host:$port/$database_name \
--username $user_name \
--password $password
HDFSへのデータインポート:
sqoop import \
--connect jdbc:mysql://$host:$port/$database_name \
--username $user_name \
--password $password \
--target-dir /root/test \
--delete-target-dir \
--table $table_name \
--fields-terminated-by ',' \
-m 1 \
--bindir $SQOOP_HOME/lib
HDFSデータをOceanBaseにエクスポート:
sqoop export \
--connect jdbc:mysql://$host:$port/$database_name \
--username $user_name \
--password $password \
--table $table_name \
--export-dir /root/test \
--input-fields-terminated-by ',' \
-m 1 \
--bindir $SQOOP_HOME/lib
結果の検証
HDFSへのデータインポートの検証
インポートコマンドを実行した後、HDFSのターゲットパスにあるデータファイルを確認します:
hdfs dfs -cat /root/test/part-m-00000
出力にインポートされたデータレコードが表示されれば、インポートは成功です。
OceanBaseへのデータエクスポートの検証
エクスポートコマンドを実行した後、OceanBaseデータベースに接続して対象テーブルをクエリします:
obclient -h$host -P$port -u$user_name -p$password -D$database_name -e "SELECT COUNT(*) FROM $table_name;"
出力されたレコード数がHDFSのソースファイル内のレコード数と一致すれば、エクスポートは成功です。