目次
データ移行ツール-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ソース/ etc / profile
3.構成ファイルを作成および変更します
#構成ファイルの場所$ SQOOP_HOME / conf;変更する構成ファイルはsqoop
-env.shcp 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.jarをコピーします。$ HIVE_HOME / libの下のhive-common-2.3.7.jarを$ SQOOP_HOME / libディレクトリにコピーします。MySQLからHiveにデータをコピーしない場合、エラーが発生します:ClassNotFoundException:org.apache.hadoop.hive.conf.HiveConf
#ハードコピーとソフトリンクの両方を確立できます。実行するものを1つ選択するだけです。以下はハードコピーです
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
$ HADOOP_HOME / share / hadoop / tools / lib /json-20170516.jarを$ SQOOP_HOME / lib /ディレクトリにコピーします。そうしないと、sqoopジョブを作成するときに、次のように報告されます。java.lang.NoClassDefFoundError:org / json / JSONObject
cp $ HADOOP_HOME / share / hadoop / tools / lib / json-20170516.jar $ SQOOP_HOME / lib /
6.インストールの検証
[root @ linux123〜] #sqoopバージョン
..。
警告を省略
...
20/06/19 10:37:24 INFO sqoop.Sqoop:実行中のSqoopバージョン:1.4.7
Sqoop 1.4.7
git commit id2328971411f57f0cb683dfb79d19d4d19d185dd812月
21日木曜日15 :59:58STD2017にmaugliによってコンパイルされました
#Sqoopがデータベースに正常に接続できるかどうかをテストします[root @ linux123〜] #sqoop list-databases --connect jdbc:mysql:// linux123:3306 /?useSSL = false --username hive --password 12345678
警告:..。
警告を省略
...
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からHDFS
1.すべてのデータをインポートします
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"
備考:
- target-dir:データをHDFSにインポートするためのパス。
- delete-target-dir:ターゲットフォルダーがHDFSに既に存在する場合、再度実行するとエラーが報告されます。--delete-target-dirを使用して、最初にディレクトリを削除できます。追加パラメーターを使用して、追加データを示すこともできます。
- num-mappers:開始されるマップタスクの数。デフォルトで4つのマップタスクが開始されます。-m1と書くこともできます。
- fields-termination-by:HDFSファイル内のデータの区切り文字。
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;'
備考:
- クエリステートメントのwhere句には「$ CONDITIONS」が含まれている必要があります
- クエリの後に二重引用符を使用する場合は、シェルが自身の変数を識別しないように、$ CONDITIONSの前に転送文字を追加する必要があります
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
sqoop import \
-Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou/sqoop/5 \
--delete-target-dir \
--fields-terminated-by "\t" \
--table goodtbl \
--split-by gname
注:
データのインポートに複数のマップタスクを使用する場合、sqoopは各タスクのデータを分割する必要があります
- MySQLのテーブルに主キーがある場合は、マップタスクの数を指定するだけです
- MySQLのテーブルに主キーがある場合は、split-byを使用してパーティションフィールドを指定します
- パーティションフィールドが文字タイプの場合は、sqoopコマンドを使用するときに追加します:-Dorg.apache.sqoop.splitter.allow_text_splitter = true。これは
sqoop import -
Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://liunx:3306/sqoop \
... ...
- マップタスクが1つしかない場合でも、クエリステートメントのwhere句の「$ CONDITIONS」はデータのパーティション分割にも使用されます。
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
パラメータの説明:
- ハイブインポート。必須パラメーター、インポートハイブを指定
- ハイブデータベース。ハイブライブラリ名(デフォルト値デフォルト)
- hive-table。Hive表名
- フィールド-終了-によって。ハイブフィールドセパレータ
- ハイブ-上書きします。既存のデータを上書きする
- create-hive-table。ハイブテーブルが作成されますが、テーブルにエラーがある可能性があります。このパラメータを使用することはお勧めしません。事前にテーブルを作成することをお勧めします
セクション2エクスポートデータのエクスポート
インポートするビッグデータプラットフォームを入力してください:import
ビッグデータプラットフォームのエクスポートはそのままにします:エクスポート
注:MySQLテーブルは事前に作成する必要があります
-- 提前创建表
CREATE TABLE sqoop.goodtbl2(
gname varchar(50),
serialNumber int,
price int,
stock_number int,
create_time date);
ハイブmydb.goodtbl→MySQLsqoop.goodtbl2
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インクリメンタルデータのインポート
データキャプチャの変更(CDC)
以前のすべてのデータインポートが実行されました。データ量が少ない場合は完全なソースデータ抽出を採用し、ソースデータ量が多い場合は変更データを抽出する必要があります。このデータ抽出モードをCDC(Change Data Capture)と呼びます。ショート。
CDCは、侵襲性と非侵襲性の2つのタイプに大別されます。侵入型とは、ソースシステムでのCDC操作のパフォーマンスへの影響を指します。CDC操作がソースデータベースでSQL操作を実行する限り、侵入型と見なされます。
一般的に使用される4つのCDCメソッドは次のとおりです(最初の3つは侵襲的です)。
タイムスタンプに基づくCDC。抽出プロセスでは、特定の属性列に基づいて増分データを判別できます。最も一般的な属性列は次のとおりです。
- タイムスタンプ:2つの列を用意することをお勧めします。1つは作成日を示す挿入タイムスタンプ、もう1つは最後の更新時刻を示す更新タイムスタンプです。
- シーケンス:ほとんどのデータベースは自己インクリメント機能を提供し、テーブルの列は自己インクリメントとして定義され、列に従って新しく挿入されたデータを簡単に識別できます。
この方法は最も単純で最も一般的に使用されていますが、次の欠点があります。
- 記録削除操作を記録できません
- 認識されない複数の更新
- リアルタイム機能なし
トリガーベースのCDC。INSERT、UPDATE、DELETEなどのSQLステートメントが実行されると、データベース内のトリガーがアクティブ化されます。トリガーを使用して、変更されたデータをキャプチャし、中間一時テーブルにデータを保存できます。次に、これらの変更されたデータが一時テーブルから取得されます。ほとんどの場合、運用データベースにトリガーを追加することは許可されておらず、この方法はシステムパフォーマンスを低下させ、採用されません。
スナップショットに基づくCDC。データの変更は、ソーステーブルとスナップショットテーブルを比較することで取得できます。スナップショットベースのCDCは、挿入、更新、および削除されたデータを検出できます。これは、タイムスタンプベースのCDCスキームよりも優れています。欠点は、スナップショットを保存するために多くのストレージスペースが必要になることです。
ログベースのCDC。最も複雑で非侵襲的なCDC法は、ログベースの方法です。データベースは、すべての挿入、更新、および削除操作をログに記録します。ログファイルを解析することで、関連情報を取得できます。各リレーショナルデータベースのログ形式には一貫性がなく、普遍的な製品はありません。アリババの運河はMySQLログファイル分析を完了することができます。
データを段階的にインポートするには、次の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
パラメータの説明:
- check-columnは、いくつかの列を指定するために使用されます(つまり、複数の列を指定できます)。これらの列は、データが増分インポート中に増分データとしてインポートされるかどうかを確認するために使用されます。これは、リレーショナルの自動増分フィールドとタイムスタンプに似ています。データベース。これらの指定された列のタイプは、char、varcharなどの文字タイプにすることはできません。
- last-valueは、最後のインポート時のチェック列の指定されたフィールドの最大値を指定します
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ファイルは更新操作をlast-valueに記録します。
cat metastore.db.script |grep incremental.last.value
パートIV一般的なコマンドとパラメーター
セクション1一般的なコマンド
セクション2一般的なパラメータ
いわゆるパブリックパラメータは、ほとんどのコマンドでサポートされているパラメータです。
共通パラメータ-データベース接続
共通パラメータ-インポート
共通パラメータ-エクスポート
一般的なパラメータ-ハイブ
インポートパラメータ
エクスポートパラメータ