Apache Sqoopチュートリアル: Archiテキスト、コマンド、例

⚡ スマートサマリー

Apache Sqoopは、コネクタアーキテクチャを使用してリレーショナルデータベースとHDFS間で大量のデータを移動し、テーブルをHiveまたはHBaseにインポートし、処理結果をソースシステムにエクスポートするMapReduceジョブを生成します。

  • 🔘 定義: Sqoopは、プラグインベースのコネクタ層を介して、構造化ストレージとHDFS間で大量のデータを転送します。
  • ☑️ Archi構造: すべてのジョブは、マップ専用のMapReduceプログラムにコンパイルされ、そのタスクはテーブルの別々のスライスを並列に取得します。
  • ✅ コネクタ: ドライバー向け包括保険 MySQL, PostgreSQL, OracleSQL ServerとDB2に加え、汎用的なJDBCフォールバックも備えています。
  • 🧪 コマンド: インポートツールはテーブルをHDFS、Hive、またはHBaseに取り込み、エクスポートツールは処理済みのファイルをテーブルにプッシュします。
  • 🛠️ ロードモード: フルロードではテーブル全体がコピーされますが、追加モードと最終更新日モードの増分ロードでは新しい行のみが取得されます。
  • ⚠️ プロジェクト状況: Sqoopは2021年7月にApache Atticに引退したので、 Spark JDBCとNiFiに新しいパイプライン機能が追加されました。

Apache Sqoopのチュートリアルでは、アーキテクチャ、コネクタ、インポートおよびエクスポートコマンドについて説明します。

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のアーキテクチャ図。RDBMSとHadoopクラスタを接続するコネクタ層を示す。

コネクタ層の下で、Sqoop は Java テーブルの1行をミラーリングし、マップのみを送信するクラス MapReduce ジョブ。各マップタスクは分割された列範囲の独自のスライスを読み取るため、スループットは単一のJDBCカーソルではなく、マッパーの数に応じてスケーリングされます。

さらに、Sqoopにはエンタープライズレベルから データウェアハウス (Netezza、Teradata、および Oracle) を NoSQL ストア (Couchbase など) に転送します。ただし、これらのコネクタには Sqoop バンドルは付属していません。これらは個別にダウンロードする必要があり、既存の Sqoop インストールに簡単に追加できます。

なぜ Sqoop が必要なのでしょうか?

Hadoop を使用した分析処理では、さまざまなソースから大量のデータを Hadoop クラスターにロードする必要があります。異種ソースから大量のデータを Hadoop にロードして処理するこのプロセスには、いくつかの課題が伴います。データの一貫性を維持して確保し、リソースを効率的に利用できるようにするなど、データ ロードの適切なアプローチを選択する前に考慮すべき要素がいくつかあります。

主要課題:

  1. スクリプトを使用したデータロード 従来のスクリプトを用いたデータロード方法は、Hadoopへの大量データロードには適していません。この方法は非効率的で、非常に時間がかかります。
  2. 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プラットフォームなど タレンド 事前に構築されたコネクタ、スケジューリング、および履歴管理機能により、手書きのジョブは不要です。

よくあるご質問

Sqoop 1は、すべてのチュートリアルで使用される唯一のコマンドラインクライアントです。Sqoop 2ではサーバー、REST API、Web UIが追加されましたが、機能面でSqoop 1と同等にはならず、本番環境での使用が認められることもなかったため、1.4.x系が標準として残りました。

モデルはソーステーブルのプロファイリングを行い、型、キー、分割列を推測し、行分布からパーティション境界を提案し、ロードが中断する前にスキーマのずれを警告します。また、サンプルデータにおける単調な挙動やタイムスタンプの挙動を検出することで、増分チェック列を提案します。

Copilotは引数の骨子を素早く作成しますが、Sqoop 1とSqoop 2の構文が混在しており、どのリリースでも受け入れられないフラグも作成しています。ジョブをスケジュールする前に、インストールされているバージョンのSqoopユーザーガイドを参照して、すべての引数を確認してください。

Sqoopは分割列を自動的に選択できないため、インポートが失敗します。適切な数値列または日付列を分割列として明示的に指定するか、転送をシリアル化する単一のマップタスクを強制的に実行してください。

コマンドラインで入力されたパスワードは、プロセス一覧を表示するすべての人に表示されます。パスワードは、ジョブの所有者のみが読み取り可能なHDFSファイルに保存し、パスワードファイル引数でそのファイルを指定するか、対話型プロンプトを使用してください。

区切りテキストがデフォルトです。SequenceFile、Avro、Parquetもサポートされており、それぞれ引数で選択できます。カラム型Parquetは後々の分析クエリに適していますが、区切りテキストは検査やエクスポートへの入力が最も簡単です。

デフォルト値は4で、妥当な開始値と言えるでしょう。マッパーの数が増えると、データベースへの同時接続数も増えるため、実際の上限はHadoopクラスタがスケジュールできる数ではなく、ソースサーバーが許容できる数になります。

A Java ランタイム、構成済み Hadoopの クラスターにアクセスできるクライアントと、対象データベース用のJDBCドライバJARファイルがSqoopライブラリディレクトリに配置されていることが必要です。ドライバJARファイルが見つからないことが、初回実行時の最も一般的な失敗原因です。