データ移行ツール– Sqoop
記事のディレクトリ
Sqoopの概要の最初の部分
Sqoopは、主にHadoop(Hive)と従来のデータベース(mysql、postgresqlなど)の間でデータを転送するために使用されるオープンソースツールです。リレーショナルデータベース(MySQL、Oracle、Postgresなど)からHDFSにデータをインポートできます。また、HDFSからリレーショナルデータベースにデータをインポートすることもできます。
Sqoopプロジェクトは2009年に開始されました。最初はHadoopのサードパーティモジュールとして存在していましたが、その後、ユーザーが迅速にデプロイできるようにし、開発者がより速く繰り返し開発できるようにするために、Sqoopは独立してApacheプロジェクトになりました。
インストールと構成の2番目の部分
Sqoop公式ウェブサイト:http
://sqoop.apache.org/ Sqoopダウンロードアドレス:http://www.apache.org/dyn/closer.lua/sqoop/
1.
ダウンロードしたインストールパッケージsqoop-1.4をダウンロード、アップロード、解凍します。 .6.bin__hadoop-2.0.4-alpha.tar.gzを仮想マシンにアップロードし
ます。ソフトウェアパッケージを解凍します。
tar zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
mv sqoop-1.4.7.bin__hadoop-2.6.0/ ../servers/sqoop-1.4.7/
2.環境変数を増やし、それらを効果的にする
vi /etc/profile
# 增加以下内容
export SQOOP_HOME=/opt/lagou/servers/sqoop-1.4.7
export PATH=$PATH:$SQOOP_HOME/bin
source /etc/profile
3.構成ファイルを作成および変更します
# 配置文件位置 $SQOOP_HOME/conf;要修改的配置文件为 sqoop-env.sh
cp sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh
# 在文件最后增加以下内容
export HADOOP_COMMON_HOME=/opt/lagou/servers/hadoop-2.9.2
export HADOOP_MAPRED_HOME=/opt/lagou/servers/hadoop-2.9.2
export HIVE_HOME=/opt/lagou/servers/hive-2.3.7
4.JDBCドライバーをコピーします
# 拷贝jdbc驱动到sqoop的lib目录下(备注:建立软链接也可以)
ln -s /opt/lagou/servers/hive-2.3.7/lib/mysql-connector-java-5.1.46.jar /opt/lagou/servers/sqoop-1.4.7/lib/
5、コピージャーHIVEHOME / libにハイブ-共通- 。2.3.7瓶、 HIVE_HOME / libの下のハイブ共通-2.3.7.jarにコピーし、コピーへ
H I V EHO M E / L I B at the H I V E−c o m m o n−2 。3 。7 。J A R&LT 、コピー殻にSQOOP_HOME / libディレクトリに。MySQLからHiveにデータをコピーしない場合、エラーが発生します:ClassNotFoundException:org.apache.hadoop.hive.conf.HiveConf
# 硬拷贝 和 建立软链接都可以,选择一个执行即可。下面是硬拷贝
cp $HIVE_HOME/lib/hive-common-2.3.7.jar $SQOOP_HOME/lib/
# 建立软链接
ln -s /opt/lagou/servers/hive-2.3.7/lib/hive-common-2.3.7.jar /opt/lagou/servers/sqoop-1.4.7/lib/hive-common-2.3.7.jar
コピー20170516.jarにHADOOP_HOME /共有/ Hadoopの/ツール/ libに/ JSON-20170516.jarへ- HADOOPHOME /共有/ Hadoopの/ツール/ libに/ JSONH A D O O PHO M E / s h a r e / h a d o o p / t o o l s / l i b / j s o n−2 0 1 7 0 5 1 6 。J A Rのコピー貝する/ lib /ディレクトリSQOOP_HOMEを低下は、sqoopジョブを作成するときにそうでなければ、報告される:java.lang.NoClassDefFoundErrorが:ORG / JSON / JSONObject
cp $HADOOP_HOME/share/hadoop/tools/lib/json-20170516.jar $SQOOP_HOME/lib/
6.インストールの検証
[root@linux123 ~]# sqoop version
...
省略警告
...
20/06/19 10:37:24 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
Sqoop 1.4.7
git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8
Compiled by maugli on Thu Dec 21 15:59:58 STD 2017
# 测试Sqoop是否能够成功连接数据库
[root@linux123 ~]# sqoop list-databases --connect jdbc:mysql://linux123:3306/?useSSL=false --username hive --password 12345678
Warning: ...
省略警告
...
information_schema
hivemetadata
mysql
performance_schema
sys
アプリケーションケースの3番目の部分
Sqoopで
- インポートとは、リレーショナルデータベースからビッグデータクラスター(HDFS、HIVE、HBASE)にデータを転送することを指します。import
キーワードを使用します。 - エクスポートとは、ビッグデータクラスターからリレーショナルデータベースにデータを転送する
こと、exportキーワードを使用することを指します。
テストデータスクリプト
-- 用于在 Mysql 中生成测试数据
CREATE DATABASE sqoop;
use sqoop;
CREATE TABLE sqoop.goodtbl(
gname varchar(50),
serialNumber int,
price int,
stock_number int,
create_time date);
DROP FUNCTION IF EXISTS `rand_string`;
DROP PROCEDURE IF EXISTS `batchInsertTestData`;
-- 替换语句默认的执行符号,将;替换成 //
DELIMITER //
CREATE FUNCTION `rand_string` (n INT) RETURNS VARCHAR(255)
CHARSET 'utf8'
BEGIN
DECLARE char_str VARCHAR(200) DEFAULT '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
DECLARE return_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str = CONCAT(return_str, SUBSTRING(char_str, FLOOR(1 + RAND()*36), 1));
SET i = i+1;
END WHILE;
RETURN return_str;
END
//
-- 第一个参数表示:序号从几开始;第二个参数表示:插入多少条记录
CREATE PROCEDURE `batchInsertTestData` (m INT, n INT)
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < n DO
INSERT INTO goodtbl (gname, serialNumber, price, stock_number, create_time)
VALUES (rand_string(6), i+m, ROUND(RAND()*100), FLOOR(RAND()*100), NOW());
SET i = i+1;
END WHILE;
END
//
DELIMITER ;
call batchInsertTestData(1, 100);
セクション1インポートデータのインポート
MySQLからHDFS1
。すべてのデータをインポートします
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl \
--target-dir /root/lagou \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"
2.クエリデータをインポートします
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou \
--append \
-m 1 \
--fields-terminated-by "\t" \
--query 'select gname, serialNumber, price, stock_number,
create_time from goodtbl where price>88 and $CONDITIONS order by price;'
3.指定した列をインポートします
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns gname,serialNumber,price \
--table goodtbl
備考:複数の列が列に含まれている場合は、それらをコンマで区切り、スペースを追加することはできません
。4。クエリデータのインポート(キーワードを使用)
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou \
--delete-target-dir \
-m 1 \
--fields-terminated-by "\t" \
--table goodtbl \
--where "price>=68"
5.複数のマップ
タスクを開始してデータをインポートします。goodtblにデータを追加します。batchInsertTestData(1000000);を呼び出します。
# 给 goodtbl 表增加主键
alter table goodtbl add primary key(serialNumber);
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou/sqoop/5 \
--append \
--fields-terminated-by "\t" \
--table goodtbl \
--split-by serialNumber
MySQLからHiveへ
ハイブにテーブルを作成します。
CREATE TABLE mydb.goodtbl(
gname string,
serialNumber int,
price int,
stock_number int,
create_time date);
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table mydb.goodtbl \
-m 1
セクション2データのエクスポート
- インポートするビッグデータプラットフォームを入力してください:import
- ビッグデータプラットフォームをエクスポートするままにします:エクスポート
注:MySQLテーブルは事前に作成する必要があります
-- 提前创建表
CREATE TABLE sqoop.goodtbl2(
gname varchar(50),
serialNumber int,
price int,
stock_number int,
create_time date);
sqoop export \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl2 \
-m 4 \
--export-dir /user/hive/warehouse/mydb.db/goodtbl \
--input-fields-terminated-by "\t"
セクション3インクリメンタルデータのインポート
データを段階的にインポートするには、次の2つの方法があります。
- インクリメンタル列に基づくインクリメンタルデータのインポート(追加方法)
- 時間列に基づくデータの増分インポート(LastModifiedメソッド)
追加メソッド
1.初期データを準備します
-- 删除 MySQL 表中的全部数据
truncate table sqoop.goodtbl;
-- 删除 Hive 表中的全部数据
truncate table mydb.goodtbl;
-- 向MySQL的表中插入100条数据
call batchInsertTestData(1, 100);
2.データをHiveにインポートします
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive --password 12345678 \
--table goodtbl \
--incremental append \
--hive-import \
--fields-terminated-by "\t" \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 0 \
-m 1
3.ハイブテーブルにデータがあるかどうか、およびデータがいくつあるかを確認します。4。MySQL
に1000個のデータを追加すると、番号は200から始まります。
call batchInsertTestData(200, 1000);
5.増分インポートを再度実行して、MySQLからHiveにデータをインポートします。この時点で、最後の値を100に変更します。
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive --password 12345678 \
--table goodtbl \
--incremental append \
--hive-import \
--fields-terminated-by "\t" \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 100 \
-m 1
6.ハイブテーブルにデータがあるかどうか、およびデータがいくつあるかを確認します
セクション4ジョブの実行
増分データインポートを実装するには、次の2つの方法があります。
- 毎回最後の値を手動で構成し、手動でスケジュールします
- ジョブを使用して、最初の最後の値が与えられると、時間指定されたタスクが毎日定期的にスケジュールされます
明らかに、方法2の方が簡単です。
1.パスワードファイルを作成します
echo -n "12345678" > sqoopPWD.pwd
hdfs dfs -mkdir -p /sqoop/pwd
hdfs dfs -put sqoopPWD.pwd /sqoop/pwd
hdfs dfs -chmod 400 /sqoop/pwd/sqoopPWD.pwd
# 可以在 sqoop 的 job 中增加:
--password-file /sqoop/pwd/sqoopPWD.pwd
2.sqoopジョブを作成します
# 创建 sqoop job
sqoop job --create myjob1 -- import \
--connect jdbc:mysql://linux123:3306/sqoop?useSSL=false \
--username hive \
--password-file /sqoop/pwd/sqoopPWD.pwd \
--table goodtbl \
--incremental append \
--hive-import \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 0 \
-m 1
# 查看已创建的job
sqoop job --list
# 查看job详细运行时参数
sqoop job --show myjob1
# 执行job
sqoop job --exec myjob1
# 删除job
sqoop job --delete myjob1
3.ジョブを実行します
sqoop job -exec myjob1
4.データを表示する
実装の原則:
ジョブの実行後、現在のチェック列の最大値がメタに記録され、この値は次回呼び出されたときに最後の値に割り当てられます。
デフォルトでは、メタデータは〜/ .sqoop /に保存されます
その中で、metastore.db.scriptファイルは更新操作を最後の値に記録します。
cat metastore.db.script |grep incremental.last.value
一般的に使用されるコマンドとパラメーターの4番目の部分
セクション1一般的なコマンド
セクション2一般的なパラメータ
いわゆるパブリックパラメータは、ほとんどのコマンドでサポートされているものです。
共通パラメーター-データベース接続
共通パラメーター-インポート
共通パラメーター-エクスポート
共通パラメーター-ハイブ
インポートパラメーター
エクスポートパラメーター