Apache Sqoopチュートリアル: Archiテキスト、コマンド、例
⚡ スマートサマリー
Apache Sqoopは、コネクタアーキテクチャを使用してリレーショナルデータベースとHDFS間で大量のデータを移動し、テーブルをHiveまたはHBaseにインポートし、処理結果をソースシステムにエクスポートするMapReduceジョブを生成します。
Hadoop の SQOOP とは何ですか?
アパッチスクープ (SQL-to-Hadoop) は、データの一括エクスポートとインポートをサポートするように設計されたツールです。 HDFS リレーショナルデータベース、エンタープライズデータウェアハウス、NoSQLシステムなどの構造化データストアからのデータ移行に対応しています。コネクタアーキテクチャに基づいたデータ移行ツールであり、プラグインをサポートすることで新しい外部システムへの接続を提供します。
Hadoop Sqoop の使用例は、夜間に Sqoop インポートを実行して、運用トランザクション RDBMS からその日のデータをロードする企業です。 ハイブ さらなる分析のためのデータウェアハウス。
次に、この Apache Sqoop チュートリアルでは、Apache Sqoop アーキテクチャについて学習します。
スクープ Archi構造
既存のすべて データベース管理システム で設計されています SQL 標準を念頭に置いています。 ただし、DBMS ごとに方言が多少異なります。 したがって、この違いは、システム間のデータ転送に関して課題を引き起こします。 Sqoop コネクタは、これらの課題を克服するのに役立つコンポーネントです。
Sqoop Hadoop と外部ストレージ システム間のデータ転送は、Sqoop のコネクタを利用して可能になります。
Sqoop には、次のようなさまざまな一般的なリレーショナル データベースを操作するためのコネクタがあります。 MySQL, PostgreSQL, Oracle、SQL Server、DB2です。これらのコネクタはそれぞれ、関連するDBMSとやり取りする方法を知っています。また、サポートするデータベースに接続するための汎用JDBCコネクタもあります。 JavaSqoopはJDBCプロトコルも提供しています。さらに、最適化された MySQL (NAIST) と PostgreSQL データベース固有の API を使用して一括転送を効率的に実行するコネクタ。
下の図は、Sqoopクライアントを外部データストアとHadoopクラスタの間に配置したもので、片側にコネクタ層、もう片側にHDFS、Hive、HBaseが配置されています。
コネクタ層の下で、Sqoop は Java テーブルの1行をミラーリングし、マップのみを送信するクラス MapReduce ジョブ。各マップタスクは分割された列範囲の独自のスライスを読み取るため、スループットは単一のJDBCカーソルではなく、マッパーの数に応じてスケーリングされます。
さらに、Sqoopにはエンタープライズレベルから データウェアハウス (Netezza、Teradata、および Oracle) を NoSQL ストア (Couchbase など) に転送します。ただし、これらのコネクタには Sqoop バンドルは付属していません。これらは個別にダウンロードする必要があり、既存の Sqoop インストールに簡単に追加できます。
なぜ Sqoop が必要なのでしょうか?
Hadoop を使用した分析処理では、さまざまなソースから大量のデータを Hadoop クラスターにロードする必要があります。異種ソースから大量のデータを Hadoop にロードして処理するこのプロセスには、いくつかの課題が伴います。データの一貫性を維持して確保し、リソースを効率的に利用できるようにするなど、データ ロードの適切なアプローチを選択する前に考慮すべき要素がいくつかあります。
主要課題:
- スクリプトを使用したデータロード 従来のスクリプトを用いたデータロード方法は、Hadoopへの大量データロードには適していません。この方法は非効率的で、非常に時間がかかります。
- MapReduceアプリケーションを介して外部データに直接アクセスする 外部システムに存在するデータに(Hadoopにロードせずに)直接アクセスできるようにすることで、マップリデュースアプリケーションの動作が複雑化します。そのため、この方法は現実的ではありません。
Hadoopは膨大なデータを処理できるだけでなく、さまざまな形式のデータにも対応できます。そのため、こうした多様なデータをHadoopにロードするために、さまざまなツールが開発されてきました。 スクープ (NAIST) と 用水路 は、そのようなデータ読み込みツールの XNUMX つです。
次に、例を示したこの Sqoop チュートリアルでは、Sqoop、Flume、HDFS の違いについて学びます。
Hadoop における Sqoop 対 Flume 対 HDFS
| スクープ | 用水路 | HDFS |
|---|---|---|
| Sqoop は、RDBMS などの構造化データ ソースからデータをインポートするために使用されます。 | Flume は、大量のストリーミング データを HDFS に移動するために使用されます。 | HDFS は、Hadoop エコシステムがデータを保存するために使用する分散ファイル システムです。 |
| Sqoop にはコネクタ ベースのアーキテクチャがあります。コネクタは、それぞれのデータ ソースに接続してデータを取得する方法を知っています。 | Flume はエージェントベースのアーキテクチャを採用しています。ここでは、データの取得を処理するコード (「エージェント」と呼ばれます) が記述されます。 | HDFS は、データが複数のデータ ノードに分散される分散アーキテクチャを備えています。 |
| HDFS は、Sqoop を使用したデータのインポート先です。 | データは XNUMX 個以上のチャネルを通じて HDFS に流れます。 | HDFS は、データ ストレージの最終的な保存先です。 |
| Sqoop データのロードはイベント駆動型ではありません。 | Flume データロードはイベントによって駆動できます。 | HDFS は、何らかの手段で提供されたデータを保存するだけです。 |
| 構造化データ ソースからデータをインポートするには、Sqoop コマンドのみを使用する必要があります。これは、そのコネクタが構造化データ ソースと対話し、そこからデータをフェッチする方法を知っているためです。 | Twitter上で生成されたツイートやWebサーバーのログファイルなどのストリーミングデータを読み込むには、Flumeを使用する必要があります。 Flume エージェントは、ストリーミング データを取得するために構築されています。 | HDFSには、データを保存するための独自の組み込みシェルコマンドがあります。HDFSはストリーミングデータをインポートすることはできません。 |
Sqoopの主な特徴
上記の比較は、Sqoopがどの位置づけにあるかを示しています。以下の機能セットは、Sqoopが特定のデータ取り込みジョブに適しているかどうかを判断するものです。
- フルロード: 1 つのコマンドでテーブル全体をコピーし、
import-all-tablesスキーマ内のすべてのテーブルを一度にコピーします。 - 段階的な負荷:
appendモード tracksは、サロゲートキーなどの単調増加する列であり、lastmodifiedモード tracks はタイムスタンプ列なので、新規または変更された行のみが転送されます。 - 並列転送: 分割列はキー範囲をマップタスク間で分割し、マッパー数は同時に実行されるタスクの数を設定します。
- 自由形式のクエリのインポート: テーブル全体ではなく、任意のSQL文の実行結果をインポートできるため、結合やフィルタリングはデータベース側で処理されます。
- 倉庫への直接搬入: インポートによって作成および入力が可能 ハイブ テーブルまたは停止せずにHBaseテーブルに直接書き込むping 生のHDFSファイルにおいて。
- 圧縮とファイル形式: 出力形式は、区切りテキスト、SequenceFile、Avro、Parquetから選択でき、オプションでコーデックレベルの圧縮も可能です。
- セキュリティ: SqoopはKerberosと連携しており、認証情報はパスワードファイルから読み込むことも、コマンドラインに入力する代わりにプロンプトから入力することもできます。
Sqoopのインポートおよびエクスポートコマンド
データの転送は双方向とも、1つのコマンドラインユーティリティを介して行われます。インポートツールはデータベースからHadoopにデータ行を移動し、エクスポートツールはHadoopからデータベーステーブルにファイルを移動します。
一般的なインポートでは、JDBC接続、ソーステーブル、宛先ディレクトリ、分割列、およびマッパー数を指定します。
sqoop import \ --connect jdbc:mysql://localhost:3306/employees \ --username hadoop \ --password-file /user/hadoop/.mysql.password \ --table employees \ --target-dir /user/hadoop/warehouse/employees \ --split-by emp_no \ --num-mappers 4
エクスポートは、この流れを逆転させます。HDFSディレクトリに既に存在する区切り文字付きファイルを読み込み、既存のテーブルに挿入するため、ターゲットテーブルを先に作成しておく必要があります。
sqoop export \ --connect jdbc:mysql://localhost:3306/employees \ --username hadoop \ --password-file /user/hadoop/.mysql.password \ --table employee_summary \ --export-dir /user/hadoop/warehouse/employee_summary \ --input-fields-terminated-by ','
夜間ジョブでテーブル全体を2回処理する必要はほとんどありません。増分インポートでは、既に検出された最高値を記録し、次回の実行時にそこから処理を開始します。
sqoop import \ --connect jdbc:mysql://localhost:3306/sales \ --table orders \ --incremental append \ --check-column order_id \ --last-value 15000 \ --target-dir /user/hadoop/warehouse/orders
ほぼすべての仕事で出てくる議論は以下のとおりです。
| 引数 | 制御するもの |
|---|---|
--connect |
JDBC URL ソースデータベースまたはターゲットデータベースの。 |
--table |
インポート時に読み込まれるテーブル、またはエクスポート時に書き込まれるテーブル。 |
--target-dir |
インポートを受け入れるHDFSディレクトリ。既に存在しているものであってはなりません。 |
--export-dir |
エクスポートによってファイルが読み込まれるHDFSディレクトリ。 |
--split-by |
範囲がマップタスク間で分割されている列。 |
--num-mappers (-m) |
並列マップタスクの数。デフォルト値は4です。 |
--incremental |
選択 append or lastmodified 変化する tracキング。 |
--hive-import |
対応するHiveテーブルを作成し、インポートしたデータをそのテーブルにロードします。 |
⚠️注意: エクスポートは単一のトランザクションではありません。各マップタスクは独自のバッチをコミットするため、途中で障害が発生すると、ターゲットテーブルにデータの一部が残ってしまう可能性があります。ロードを全か無かで実行する必要がある場合は、書き込み処理をステージングテーブル経由でルーティングしてください。
Sqoopプロジェクトの現状と現代的な代替案
上記のコマンドをスケジューラに投入する前に、バージョンに関する詳細が1つ重要になります。
Sqoopの開発者たちは2021年6月にプロジェクトを終了させることを投票で決定し、 アパッチ・アティック 2021年7月に完成。ウェブサイト、メーリングリスト、gitリポジトリ、課題 trackerとダウンロードはすべて引き続き利用可能ですが、読み取り専用であり、今後のリリース予定はありません。最後の製品版リリースは2017年のSqoop 1.4.7です。別バージョンのSqoop 2(1.99.x)は機能面で同等になることはなく、製品版としてリリースできる状態には至りませんでした。
既存のSqoopジョブは引き続き実行され、商用Hadoopディストリビューションは引き続き自社プラットフォーム内でこのツールを同梱し、サポートしています。しかし、新しいデータ取り込み作業は通常、以下のいずれかをベースに構築されます。
| Alternative | 最適 |
|---|---|
| Spark JDBCデータソースを使用 | バッチテーブル例tracすでに中に収まっている Spark マッパーの代わりにパーティション化された読み取りを使用するパイプライン。 |
| アパッチNiFi | フローベースで、視覚的に設定可能な、複数の異種システム間ルーティング。 |
| Kafka ConnectとCDCコネクタ | 夜間バッチ処理の代わりに、継続的な変更データ取得を行う。 |
| マネージドETLプラットフォームなど タレンド | 事前に構築されたコネクタ、スケジューリング、および履歴管理機能により、手書きのジョブは不要です。 |

