3.2.3 Sqoopデータ移行ツール、データのインポート、MySQLからHDFS / Hive、データのエクスポート、増分データのインポート、Sqoopジョブ、一般的なコマンドとパラメーター

目次

データ移行ツール-Sqoop

Sqoopの概要の最初の部分

インストールと構成の2番目の部分

パート3アプリケーションケース

セクション1インポートデータのインポート

MySQLからHDFS

MySQLからHiveへ

セクション2エクスポートデータのエクスポート

セクション3インクリメンタルデータのインポート

データキャプチャの変更(CDC)

追加方法

セクション4ジョブの実行

パートIV一般的なコマンドとパラメーター

セクション1一般的なコマンド

セクション2一般的なパラメータ

共通パラメータ-データベース接続

共通パラメータ-インポート

共通パラメータ-エクスポート

一般的なパラメータ-ハイブ

インポートパラメータ

エクスポートパラメータ


 

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

  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ファイルは更新操作をlast-valueに記録します。

cat metastore.db.script |grep incremental.last.value

 

パートIV一般的なコマンドとパラメーター

セクション1一般的なコマンド

 

セクション2一般的なパラメータ

いわゆるパブリックパラメータは、ほとんどのコマンドでサポートされているパラメータです。

共通パラメータ-データベース接続

 

共通パラメータ-インポート


 

共通パラメータ-エクスポート

 

一般的なパラメータ-ハイブ


 

インポートパラメータ

 

エクスポートパラメータ

 

おすすめ

転載: blog.csdn.net/chengh1993/article/details/112060391