3.2.5データ移行ツール-Sqoop

データ移行ツール– 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 Ec o m m o n2 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 n2 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つの方法があります。

  1. 毎回最後の値を手動で構成し、手動でスケジュールします
  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一般的なパラメータ

いわゆるパブリックパラメータは、ほとんどのコマンドでサポートされているものです。
共通パラメーター-データベース接続
ここに画像の説明を挿入
共通パラメーター-インポート
ここに画像の説明を挿入
共通パラメーター-エクスポート
ここに画像の説明を挿入
共通パラメーター-ハイブ
ここに画像の説明を挿入
インポートパラメーター
ここに画像の説明を挿入
ここに画像の説明を挿入
エクスポートパラメーター
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_47134119/article/details/113659432