偶然の発見
2日前、あるデータを移行する予定だったので、当然 Apache Sqoop が思い浮かび、Apache の公式 Web サイトを開いてダウンロード リンクを探しましたが、見つかりませんでした。
これは非科学的です. 数か月前に見ました. あきらめたくなかった. https://sqoop.apache.org/ にログインしようとしました.
Aapche Sqoop 公式サイト
Project Sqoop は引退しました。詳しくはアティックのページをご覧ください。
Apache Foundation ではプロジェクトの引退についての話さえあります. よく調べてみると、Apache Sqoop は 2021 年 6 月に Attic に参入したことが最新のものです。しかし、「屋根裏部屋」とは何ですか?聞いたことがありませんが、屋根裏プロジェクトはどうなりますか? 、私たちは探求を続けます。
Apache Attic の紹介
Apache Attic はもともと Apache の小さなブラック ハウスに相当するものでした.Apache がホストするプロジェクトが長期間 (新しいリリース バージョンがない状態で 2 年以上、コミッター、コントリビューター、将来のロードマップがない) 活動していない場合、Apache Attic は次のことを選択します。プロジェクトを Attic に移動する これは、プロジェクトのライフサイクル全体を担当する Apache のプロジェクト管理に相当します。
Sqoop移动到Attic的项目对咱们有啥影响呢?
現在、Sqoop をデータ移行ツールとして使用している企業は少なくありません.Sqoop が Attic に移行されても、使用自体にはまったく影響はありません.Apache Attic は引き続きコード ベースのダウンロードを提供しますが、バグを修正せず、新しいバージョンをリリースせず、コミュニティを再開しません。
これを見て、私たちはそれほどパニックにならず、使い続けることはできますが、問題が発生した場合は、それを修正するためにブランチを構築するしかありません. 側面から見ると、ある角度からSqoopが成功していることを示すこともできます.結局のところ、Apache のトップ プロジェクトだったので、長い間リリースされていない場合は、十分に成熟している可能性があります。
Attic のページを閉じようとしたときに、ちらっと Attic のプロジェクトに目を通したところ、ほとんど見覚えがありませんでした。多くの企業も使っていると思いますが、例えばうちの会社は今でもセントリーを使っています。別の見方をすれば、今は技術の急速な変化が速すぎて、時間が経てばHadoopやSparkも数年で衰退するかもしれません。次に何が起こるか誰が知っていますか?問題ありません。学習を続けてください。今日はまず Sqoop について話しましょう。
Sqoopのポジショニングと現状
簡単に言えば、Sqoop の位置付けは、Hadoop エコロジカル ストレージと構造化ストレージの間のデータ移行です。より一般的なシナリオは、HDFS/HBase/Hive と MySql/Oracle 間のデータ相互ガイダンスです。データ転送の架け橋として、Sqoop は MapReduce の InPutFormat と OutPutFormat を定義することにより、ソース ストレージと宛先ストレージを接続します。
Sqoop では、MapReduce の Map ステージのみが関与し、Reduce ステージは存在しないことに注意してください。
Sqoop アーキテクチャ図
現在、Sqoop には通常、Sqoop1 と Sqoop2 の 2 つのメジャー バージョンがあります.Sqoop1 の最新リリースは 1.4.7、Sqoop2 の最新リリースは 1.99.7 です.ここで使用する場合は、Sqoop1 を使用することをお勧めします. CLIとRest apiを追加しますが、実際には半製品であり、Sqoop1とは完全に互換性がなく、以前のCDHもApacheも本番環境での使用は推奨されていません.自分で気軽に遊ぶことができます. この記事で主に紹介するバージョンは、まだ Sqoop1 に基づいています。
Sqoop 移行の原則
コアロジック
Sqoop の移行プロセス全体が MapReduce ジョブに相当しますが、実際には Map フェーズのみであり、移行は次のように大きく 5 つの部分に分けられます。
Sqoop ロジック図
"Initializer" : Sqoop 移行全体の初期化フェーズであり、データ ソースの接続、一時テーブルの作成、依存 jar パッケージの追加など、移行前の準備を完了します。
「Partitioner」 : ソース データの断片化。同時実行ジョブの数に応じて、ソース データをいくつに分割するかを決定します。
"Extractor" : エクストラクタ スレッドを開き、メモリに構築されたデータをキューに書き込みます。
"Loader" : ローダー スレッドを開き、キューからデータを読み取り、対応するバックエンドに書き込みます。
「駆逐艦」 : 移行全体の仕上げ作業、データ ソースからの sqoop の切断、およびリソースの回復の完了。
プロセス分析
移行タスクが開始されると、最初に初期化部分に入り、JDBC を使用してインポートされたデータ テーブルをチェックし、テーブル内のすべての列と列のデータ型を取得し、これらのデータ型を Java データ型にマップし、適用します。それらの変換された MapReduce のこれらの対応する Java 型は、フィールドの値を保存するために使用されます. 各 Sqoop タスクが実行されると、コード ジェネレーターはこの情報を使用して、テーブルに対応するクラスを作成します。テーブル、つまり xxxx.java ファイルから抽出されます。次に、Partitioner は --split-by または -m に従って、タスク全体のフラグメント数を指定します. 指定されていない場合、デフォルトは 4 つのフラグメント (各パーティションは Mapper に対応します) であり、ローカルの Jar パッケージにコンパイルされます。 MapReduce ジョブを送信します。タスクがクラスターにサブミットされると、各マッパーはエクストラクタ スレッドとローダー スレッドをそれぞれ開始します. MapReduce 全体の InputFormat は実際に元の終了データを読み取り、JDBC を介してコンテキストに書き込みます. Context からデータを書き込み、対応するデータを OutPutFormat の移行先としてインポートします。タスクの実行が完了すると、yarn リソースが解放され、Destroyer はデータ ソースへのすべての接続を再利用します。ここでは、主にインポート プロセスについて説明します。エクスポート プロセスは、データを 1 つずつ挿入ステートメントに解析するインポートと非常によく似ているため、ここではあまり分析しません。
実際の Sqoop 移行
たまたま Doris から Hive への移行テストを行っていたのですが (Doris は基本的に MySQL プロトコルと互換性のある OLAP エンジンです)、実際の戦闘は Doris を中心に行われました。
移行前の準備
-
JDK/ZooKeeper/HDFS/Yarn/Hive のデプロイはこの記事の焦点ではありませんが、多くのオンライン ドキュメントがあるので、自分でデプロイを参照することができます。
-
この映画は Sqoop1 に関するもので、ダウンロード アドレスは http://archive.apache.org/dist/sqoop/ です。Note that when deploying Sqoop, you need to import mysql-connector-java.jar, and modified sqoop-env.sh 通常. Sqoop の全体的なデプロイは比較的単純です。
-
まず、Doris ソース データ テーブルの形式を見てみましょう。テーブルには 3497079 個のデータがあります
移行を開始
-
Start the Sqoop task to start the migration, and submit the MapReduce job to Yarn. 最終的な目標は、データを HDFS に配置することです。
sqoop import \
--connect jdbc:mysql://Host:IP/ods_canoe # jdbc连接地址
--username user # 用户
--password password # 密码
--delete-target-dir # 删除对应HDFS目录下的数据
--target-dir /Canoe # 对应HDFS的目录位置
--table dw_canoe_cmdb_host_cost # 源端的表名
--split-by buy_age # 根据buy_age字段进行切分,注意是Int类型
--compress # 启动压缩
--compression-codec org.apache.hadoop.io.compress.SnappyCodec # 使用Snappy压缩
-m 10 # 10个分片即10个Map
-
もちろん、Sqoop を使用して Doirs のデータを直接 Hive にインポートすることもできますが、Doris のデータ形式 DATETIME は Hive では互換性がないため、今回はこの方法は使用しません。データ型が一致する場合は、次のパラメーターを使用してハイブを直接インポートできます。
--hive-import # 数据导入到hive中
--hive-table testSqoop # hive中的表名
--hive-database default # hive中的库名
-
MapReduce タスクが実行された後、HDFS で生成されたデータがあるかどうかを確認します。
hadoop fs -ls /Canoe
Found 11 items
-rw-r--r-- 3 work supergroup 0 2021-06-16 19:58 /Canoe/_SUCCESS
-rw-r--r-- 3 work supergroup 11978345 2021-06-16 19:58 /Canoe/part-m-00000.snappy
-rw-r--r-- 3 work supergroup 11694631 2021-06-16 19:58 /Canoe/part-m-00001.snappy
-rw-r--r-- 3 work supergroup 6726724 2021-06-16 19:57 /Canoe/part-m-00002.snappy
-rw-r--r-- 3 work supergroup 14511453 2021-06-16 19:58 /Canoe/part-m-00003.snappy
-rw-r--r-- 3 work supergroup 10708857 2021-06-16 19:58 /Canoe/part-m-00004.snappy
-rw-r--r-- 3 work supergroup 4459765 2021-06-16 19:57 /Canoe/part-m-00005.snappy
-rw-r--r-- 3 work supergroup 1289616 2021-06-16 19:57 /Canoe/part-m-00006.snappy
-rw-r--r-- 3 work supergroup 94095 2021-06-16 19:57 /Canoe/part-m-00007.snappy
-rw-r--r-- 3 work supergroup 999 2021-06-16 19:57 /Canoe/part-m-00008.snappy
-rw-r--r-- 3 work supergroup 42111 2021-06-16 19:57 /Canoe/part-m-00009.snappy
HDFS の結果の検証
-
圧縮に Snappy 形式を使用しているため、実際の行数が Doris と同じであることを確認してみましょう。
hadoop fs -text /Canoe/*|wc -l
21/05/16 19:58:54 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
3497079
Hive へのデータのインポート
-
HDFS データを検証したら、Hive テーブルを作成しましょう。ここには 2 つのオプションがあることに注意してください。
-
Hive 共通テーブルを作成し、データをテーブルにロードします。
-
Hive 外部テーブルを作成し、以前にエクスポートした /Canoe パスに設定します
「ハイブ共通テーブルモード」
hive> CREATE TABLE `test_sqoop` (
> `date_time` date ,
> `ip` varchar(35) ,
> `host_name` varchar (64) ,
> `category` varchar (64) ,
> `buy_age` int COMMENT ,
> `suit_type` varchar(64) ,
> `instance_name` varchar(200) ,
> `site` varchar(200) ,
> `charge_type_name` varchar(64) ,
> `price` double ,
> `price_avg` double ,
> `default_discount` ,
> `time_stamp` date ) # 注意hive中只有date类型,没有datetime类型
> ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
hive> load data inpath '/Canoe' overwrite into table test_sqoop;
「2.hive外部テーブル方式」
hive> CREATE external TABLE `test_sqoop` (
> `date_time` date ,
> `ip` varchar(35) ,
> `host_name` varchar (64) ,
> `category` varchar (64) ,
> `buy_age` int COMMENT ,
> `suit_type` varchar(64) ,
> `instance_name` varchar(200) ,
> `site` varchar(200) ,
> `charge_type_name` varchar(64) ,
> `price` double ,
> `price_avg` double ,
> `default_discount` ,
> `time_stamp` date ) # 注意hive中只有date类型,没有datetime类型
> ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
> location '/Canoe';
ハイブ結果検証
hive> select count(*) from test_sqoop;
Query ID = work_20210816200848_acbb8c1a-b114-4872-9e76-45f5420d02ba
Total jobs = 1
Launching Job 1 out of 1
Starting Job = job_1595742917056_0028, Tracking URL = http://testjie01:23188/proxy/application_1595742917056_0028/
Hadoop job information for Stage-1: number of mappers: 10; number of reducers: 1
2021-06-16 20:08:56,677 Stage-1 map = 0%, reduce = 0%
2021-06-16 20:09:02,938 Stage-1 map = 50%, reduce = 0%, Cumulative CPU 22.88 sec
2021-06-16 20:09:03,975 Stage-1 map = 90%, reduce = 0%, Cumulative CPU 37.03 sec
2021-06-16 20:09:05,010 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 39.51 sec
2021-06-16 20:09:08,131 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 42.16 sec
MapReduce Total cumulative CPU time: 42 seconds 160 msec
Ended Job = job_1595742917056_0028
MapReduce Jobs Launched:
Stage-Stage-1: Map: 10 Reduce: 1 Cumulative CPU: 42.16 sec HDFS Read: 61581414 HDFS Write: 8 SUCCESS
Total MapReduce CPU Time Spent: 42 seconds 160 msec
OK
349707
その他の興味深い機能
「増分同期」は、 sqoop ジョブを介して sqoop タスクを作成および実行できます。増分フィールドに従って、前回の最大値を記録し、この値より大きいデータを毎回 hive に同期し、タスクを作成した後、それぞれ実行すると --last-value の値が自動的に更新されます。
--incremental append # 增量同步
--check-column abc # 检查的的字段
--last-value 'xxxx-xx-xx xx:xx:xx'
「カスタム インポート コンテンツ」は--query パラメータを使用し、ユーザーは必要に応じて必要なコンテンツをカスタマイズできます。
--query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \
「Migration Acceleration」 MySQL データを移行する場合、 --direct パラメータを追加し、MySQL の mysqldump を使用してデータベースへの JDBC 接続を最適化できます。
「コミットされていないデータクエリ」 Sqoop は、コミットされていない読み取りトランザクションを読み取る機能を提供します。パラメーター --relaxed-isolation を使用するだけで済みます。この機能は非常に興味深いものですが、私はこれをテストしていません。記事の最後にコメント。
スクープの後悔
おおむね、移行作業全体の結果は期待どおりであり、Doirs から Hive への移行は完了しています。Sqoop の機能は依然として強力ですが、いくつかの小さな後悔もあります.タスクが失敗して再試行されると、データの重複の問題が発生します.このとき、セマンティクスの一貫性を確保したい場合は、それを完了する必要があります.追加の重複排除操作による、さらに、Sqoop 移行プロセス では、リアルタイム データ書き込みの互換性はあまり良くありません。Sqoop2 は非常に良い計画のように見えますが、それが無駄になってしまったのは残念です. Sqoop コミュニティが過去の栄光を継続できることを心から願っています.
バッシュウィッシュ!!!
「前回のオリジナルレコメンド」
「これまでの慣習」