このトピックでは、Jindo DistCpを使用してEMR Hadoopクラスター内のデータをHadoop分散ファイルシステム (HDFS) からObject Storage Service (OSS) に移行する方法について説明します。 Jindo DistCpは、Alibaba Cloudが提供するデータコピーツールです。
背景情報
HDFSは、従来のビッグデータアーキテクチャでは、大量のデータの基盤となるストレージとして使用されます。 Hadoopが提供するDistCpツールは、HDFSでデータを移行またはコピーするために使用されます。 ただし、このツールはOSSの機能を利用できないため、効率が低く、データの一貫性が低くなります。 さらに、DistCpは単純な機能のみを提供し、ユーザーの要件を満たすことはできません。
Jindo DistCpは、分散ファイルシステムでファイルをコピーするために使用できます。 Jindo DistCpを使用して、大規模なクラスター内またはクラスター間でファイルをコピーできます。 Jindo DistCpは、MapReduceを使用してファイルの配布、エラーの処理、データの復元を行います。 ファイルとディレクトリのリストは、MapReduceジョブの入力として使用されます。 各タスクは、入力リスト内の特定のファイルとディレクトリをコピーします。 Jindo DistCpを使用すると、HDFSデータノード間、HDFSとOSS間、およびOSSバケット間でデータをコピーできます。 また、データコピー用のさまざまなカスタムパラメータとポリシーも提供します。
Hadoop DistCpと比較して、Jindo DistCpには、HDFSからOSSへのデータ移行に次の利点があります。
高い効率。 Jindo DistCpのデータ移行速度は、Hadoop DistCpのデータ移行速度の1.59倍です。
豊富な基本機能。 Jindo DistCpは、複数のコピー方法とさまざまなシナリオベースの最適化ポリシーを提供します。
OSSとの深い統合。 Jindo DistCpはOSS機能を利用しているため、データの圧縮やデータストレージクラスのアーカイブへの変換など、データに対してさまざまな操作を実行できます。
ファイル名を変更せずにファイルをコピーします。 これによりデータの整合性が保証されます。
高い互換性。 Jindo DistCpはさまざまなシナリオに適用可能で、Hadoop DistCpの代わりに使用できます。 Jindo DistCpはHadoop 2.7.xとHadoop 3.xをサポートしています。
前提条件
EMRクラスター3.28.0以降が作成されます。 詳細については、「クラスターの作成」をご参照ください。
EMRクラスター3.28.0以降では、Shellコマンドを実行してJindo DistCpを使用できます。 詳細については、「Jindo DistCpの使用」をご参照ください。 3.28.0より前のEMRクラスターでは、互換性の問題が発生する可能性があります。 その場合、 チケットを起票し、テクニカルサポートへお問い合わせください。
自己管理型ECS (Elastic Compute Service) クラスターを使用する場合、Hadoop 2.7.xまたはHadoop 3.x環境がデプロイされ、その環境でMapReduceジョブを実行できます。
ステップ1: Jindo DistCpのJARパッケージをダウンロードする
EMRクラスターに接続します。
EMRコンソールにログインします。 左側のナビゲーションウィンドウで、[ECS上のEMR] をクリックします。
作成したEMRクラスターをクリックします。
[ノード] タブをクリックし、ノードグループの左側にあるプラスアイコン () をクリックします。
ECSインスタンスのIDをクリックします。 [インスタンス] ページで、インスタンスIDの横にある [接続] をクリックします。
SSHキーペアまたはSSHパスワードを使用してWindowsまたはLinuxでクラスターにログインする方法の詳細については、「クラスターにログインする」をご参照ください。
Jindosdk-${version}.tar.gz
の最新バージョンをダウンロードして解凍します。 詳細については、「JindoDataのダウンロード」をご参照ください。
手順2: OSSへのアクセスに使用するAccessKeyペアの設定
次のいずれかの方法を使用して、AccessKeyペアを設定できます。
サンプルコマンドを使用してAccessKeyペアを設定する
hadoop jar jindo-distcp-tool-${version}.jar -- src /tmp/ -- dest oss:// examplebucket/ -- hadoopConf fs.oss. oss.accessKeyId=LTAI5t7h6SgiLSganP2m **** -- hadoopConf fs fs.oss. endoposs. t=oss-cn-hangzhou.aliyuncs.com.
設定ファイルを使用してAccessKeyペアを設定する
core-site.xml Hadoop設定ファイルがあるディレクトリに移動します。
cd /etc/emr/hadoop-conf/
詳細については、「頻繁に使用されるファイルのパス」をご参照ください。
次のコマンドを実行して、core-site.xml設定ファイルを開きます。
vim core-site.xml
core-site.xml設定ファイルに次の設定を追加します。
<configuration> <property> <name>fs.oss.accessKeyId</name> <value>xxx</value> </property> <property> <name>fs.oss.accessKeySecret</name> <value>xxx</value> </property> <property> <name>fs.oss.endpoint</name> <!-- ECSインスタンスからOSSにアクセスする場合は、OSSの内部エンドポイントをe oss-cn-xxx-internal.aliyuncs.com形式で使用することを推奨します。 --> <valu e>oss-cn-xxx.aliyuncs.com</value> </property> </configuration>
JindoFS SDKのパスワード不要機能の使用
JindoFS SDKのパスワード不要機能を使用する場合は、AccessKeyペアをプレーンテキストで保存しないことを推奨します。 データの安全性が向上します。 詳細については、「JindoFS SDKのパスワード不要機能の使用」をご参照ください。
ステップ3: データの移行またはコピー
次のコマンドを実行して、HDFSのデータを表示します。
hdfs dfs -ls /
レスポンス例:
は8アイテムを見つけました drwxrwxrwx - admin supergroup 0 2023-10-26 10:55 /.sysinfo drwxrwxrwx - hadoop supergroup 0 2023-10-26 10:55 /アプリ drwxrwxrwx - root supergroup 0 2022-08-03 15:54 /データ -rw-r ----- 1ルートスーパーグループ13 2022-08-25 11:45 /examplefile.txt drwxrwxrwx - spark supergroup 0 2023-10-26 14:49 /spark-history drwx-wx-wx - hiveスーパーグループ0 2023-10-26 13:35 /tmp drwxrwxrwx - hive supergroup 0 2023-10-26 14:48 /ユーザー drwxrwxrwx - hadoop supergroup 0 2023-10-26 14:48 /yarn
次のコマンドを実行して、jindo-distjob-tool-${version}.jarパッケージがあるディレクトリに切り替えます。
cd /opt/apps/JINDOSDK/jindosdk-current/tools
HDFSからOSSにデータを移行します。
完全なデータの移行またはコピー
次のコマンドを実行して、HDFSの /tmpディレクトリからossのOSS: // examplebucketに完全なデータを移行またはコピーします。
hadoop jar jindo-distcp-tool-${version}.jar -- src /tmp/ -- dest oss:// examplebucket/ -- hadoopConf fs.oss. oss.accessKeyId=LTAI5t7h6SgiLSganP2m **** -- hadoopConf fs fs.oss. endoposs. t=oss-cn-hangzhou.aliyuncs.com.
コマンドのパラメーターとオプションを次の表に示します。
パラメータ /オプション
説明
例
-- src
HDFSから移行またはコピーするデータのソースパス。
/tmp/
-dest
OSSに移行またはコピーするデータの宛先パス。
oss:// examplebucket/
-- hadoopConf
OSSへのアクセスに使用できるAccessKey ID、AccessKey secret、エンドポイント。
AccessKey IDとAccessKeyシークレットの取得方法の詳細については、「AccessKeyペアの取得」をご参照ください。
OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
重要ECSインスタンスからOSSにアクセスする場合は、OSSの内部エンドポイントをoss-cn-xxx-internal.aliyuncs.com形式で使用することを推奨します。
-- hadoopConf fs.oss.accessKeyId=LTAI5t7h6SgiLSganP2m **** -- hadoopConf fs.oss.accessKeySecret=KZo149BD9GLPNiDIEmdQ7dyNKG **** -- hadoopConf fs.oss.endpoin t=oss-cn-hangzhou.aliyuncs.com
-- 並列処理
クラスター内のリソース数に基づいて、並列に実行できるデータ移行タスクまたはデータコピータスクの数。
10
増分データの移行またはコピー
完全なデータ移行またはコピーの後に、ソースパスから増分データのみを移行またはコピーする場合は、-- updateオプションを指定できます。
次のコマンドを実行して、HDFSの /tmpディレクトリからossのOSS: // examplebucketに増分データのみを移行またはコピーします。
hadoop jar jindo-distcp-tool-${version}.jar -- src /tmp/ -- dest oss:// examplebucket/ -- hadoopConf fs.oss. oss.accessKeyId=LTAI5t7h6SgiLSganP2m **** -- hadoopConf fs fs.oss. endossの並列性. 10 t=oss-cn-hangzhou.aliyuncs.com。
デフォルトでは、-- updateオプションを指定するとチェックサムが有効になります。 このようにして、Jindo DistCpは、ファイル名、ファイルサイズ、およびソースパスと宛先パスのファイルのチェックサムを比較します。 上記の項目でデータの不整合が検出された場合、増分データ移行またはコピーが自動的に開始されます。
Jindo DistCpがソースパスと宛先パスのファイルのチェックサムを比較できないようにするには、コマンドに -- disableChecksumオプションを追加します。 例:
hadoop jar jindo-distcp-tool-${version}.jar -- src /tmp/ -- dest oss:// examplebucket/ -- hadoopConf fs.oss. oss.accessKeyId=LTAI5t7h6SgiLSganP2m **** -- hadoopConf fs fs.oss-t=oss-cn-hangzhou.aliyuncs.com. endosum.
付録1: Jindo DistCpでサポートされているパラメータとオプション
Jindo DistCpはさまざまなパラメータとオプションを提供します。 次のコマンドを実行して、パラメーターとオプションに関する情報を取得できます。
hadoop jar jindo-distcp-tool-${version}.jar -- help
次の表に、パラメーターとオプションを示します。
パラメータ /オプション | 説明 | 例 |
-- src | HDFSからコピーするデータのソースパス。 | -- src oss:// examplebucket/sourcedir |
-dest | OSSにコピーするデータの宛先パス。 | -- dest oss:// examplebucket/destdir |
-- bandWidth | データコピータスクの帯域幅。 単位:MB。 | -- bandWidth 6 |
-- codec | コピーするファイルの圧縮方法。 サポートされている圧縮コーデック: gzip、gz、lzo、lzop、snappy。 サポートされているキーワード: none and keep. どれもの説明とキープ:
説明 オープンソースのHadoopクラスターでLempel-Ziv-Oberhumer (LZO) 圧縮アルゴリズムを使用する場合は、gplcompressionのネイティブライブラリとHadoop-LZOパッケージをインストールする必要があります。 ネイティブライブラリとパッケージをインストールしない場合は、他の圧縮方法を使用することをお勧めします。 | -- codec gz |
-- ポリシー | OSSにコピーされた後のファイルのストレージクラス。 有効な値:
| -- policy coldArchive |
-- フィルタ | ファイルのパス。 ファイルの各行のデータには、コピーまたは比較する必要のないファイルに対応する正規表現が含まれています。 | -- filters test.txt |
-- srcPrefixesFile | コピーするファイル。 ファイルの先頭には、srcパラメーターで指定されたパスがあります。 | -- srcPrefixesFile prefixes.txt |
-- 並列処理 | 並列に実行できるデータコピータスクの数。 このパラメーターは、使用可能なクラスターリソースに基づいて設定できます。 説明 デフォルト値 : 7 | -- 平行度20 |
-- tmp | Jindo DistCpを使用するときに一時ファイルを格納するディレクトリ。 | -- tmp /tmp |
-- hadoopConf | OSSへのアクセスに使用できるAccessKey ID、AccessKey secret、エンドポイント。 | -- hadoopConf fs.oss.accessKeyId=yourkey -- hadoopConf fs.oss.accessKeySecret=yoursecret -- hadoopConf fs.oss.endpoin t=oss-cn-xxx.aliyuncs.com |
-- disableChecksum | チェックサム検証を無効にすることを指定します。 | -- disableChecksum |
-- deleteOnSuccess | ソースパスからコピーするファイルが、コピー先パスにコピーされた後に削除されることを指定します。 | -- deleteOnSuccess |
-- enableTransaction | デフォルトでは、Jindo DistCpはタスク間のデータ整合性を保証します。 ジョブレベルのデータの整合性とジョブ間のトランザクションのサポートを確保するために、-- enableTransactionパラメーターを使用できます。 | -- enableTransaction |
-無視 | データ移行中に例外を無視して、移行を中断しないように指定します。 エラーはJindo DistCpカウンタの形式で報告されます。 -- enableCMSパラメーターを使用する場合は、指定したフォームで通知を受け取ります。 | -無視 |
-- diff | このパラメーターは、すべてのファイルがコピーされているかどうかを確認し、コピーに失敗したファイルのリストを生成するために使用されます。 | -- diff |
-- 更新 | 増分データのみを宛先パスに移行するように指定します。 増分データとは、最後の完全データ移行またはコピーの後にソースパスに追加されるデータを指します。 | -- 更新 |
-- preserveMeta | データが移行されると、Owner、Group、Permission、Atime、Mtime、Replication、BlockSize、XAttrs、およびACLを含むメタデータが移行されます。 | -- preserveMeta |
-- jobBatch | 各データコピータスクで処理されたファイルの数。 デフォルト値は 1000 です。 | -- jobBatch 1000 |
-- taskBatch | 各データコピーサブタスクによって処理されるファイルの数。 デフォルト値は 10 です。 | -- taskBatch 10 |
付録2: サンプルシナリオ
シナリオ1: Jindo DistCpを使用してデータをOSSに送信した後、データの整合性を確認するにはどうすればよいですか?
次のいずれかの方法を使用して、データの整合性を確認できます。
方法1: Jindo DistCpカウンターを使用する
BYTES_EXPECTEDやFILES_EXPECTEDなど、DistCpカウンタに関する情報に含まれるパラメータを使用して、データの完全性をチェックできます。
例 JindoDistcpCounter BYTES_COPIED=10000 BYTES_EXPECTED=10000 FILES_COPIED=11 FILES_EXPECTED=11 ... シャッフルエラー BAD_ID=0 接続=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0
次の表に、前述の例のJindo DistCpカウンタに含めることができるパラメータを示します。
パラメーター
説明
BYTES_COPIED
コピーされたバイト数。
BYTES_EXPECTED
コピーするバイト数。
FILES_COPIED
コピーされたファイルの数。
FILES_EXPECTED
コピーするファイルの数。
FILES_SKIPPED
増分データのみをコピーするときにスキップされるファイルの数。
BYTES_SKIPPED
増分データのみをコピーするときにスキップされるバイト数。
COPY_FAILED
コピーに失敗したファイルの数。 値が0でない場合、アラートがトリガーされます。
BYTES_FAILED
コピーに失敗したバイト数。
DIFF_FILES
ソースパスと宛先パスが異なるファイルの数。 値が0でない場合、アラートがトリガーされます。
DIFF_FAILED
正しく比較されていないファイルの数。 数値はDIFF_FILES値に加算されます。
SRC_MISS
ソースパスに存在しないファイルの数。 数値はDIFF_FILES値に加算されます。
DST_MISS
宛先パスに存在しないファイルの数。 数値はDIFF_FILES値に加算されます。
LENGTH_DIFF
ソースパスと宛先パスで名前が同じでサイズが異なるファイルの数。 数値はDIFF_FILES値に加算されます。
CHECKSUM_DIFF
チェックサム検証に失敗したファイルの数。 数値はCOPY_FAILED値に加算されます。
SAME_FILES
ソースパスと宛先パスで同じファイルの数。
方法2: -- diffオプションを使用する
-- diffオプションを使用して、ソースパスと宛先パスのファイルの名前とサイズを比較できます。 例:
hadoop jar jindo-distcp-tool-${version}.jar -- src /tmp/ -- dest oss:// examplebucket/ -- hadoopConf fs.oss. oss.accessKeyId=LTAI5t7h6SgiLSganP2m **** -- hadoopConf fs.oss. endposs. t=oss-cn-hangzhou.aliyuncs.com。
シナリオ2: OSSに移行されるファイルのストレージクラスをIA、アーカイブ、またはコールドアーカイブに設定するために使用できるパラメーターはどれですか。
-- policyオプションを使用して、OSSに移行されるファイルのストレージクラスをIA、アーカイブ、またはコールドアーカイブに設定できます。 次のコードは、移行されたファイルのストレージクラスをIAに設定する方法の例を示しています。
hadoop jar jindo-distcp-tool-${version}.jar -- src /tmp/ -- dest oss:// examplebucket/ -- hadoopConf fs.oss. oss.accessKeyId=LTAI5t7h6SgiLSganP2m **** -- hadoopConf fs fs.oss-parallelism t=oss-cn-hangzhou.aliyuncs.com. oss.
移行したファイルのストレージクラスをArchiveに設定するには、-- policy iaを -- policy archiveに置き換えます。 移行したファイルのストレージクラスをCold Archiveに設定するには、-- policy iaを -- policy coldArchiveに置き換えます。 コールドアーカイブは、特定のリージョンでのみサポートされます。 詳細については、「コールドアーカイブ」をご参照ください。
シナリオ3: データが移行またはコピーされた後、ソースパスから特定のデータを削除するように設定できるパラメーターはどれですか?
-- deleteOnSuccessオプションを使用して、データがターゲットパスに移行またはコピーされた後、特定のデータをソースパスから削除できます。
hadoop jar jindo-distcp-tool-${version}.jar -- src /tmp/ -- dest oss:// examplebucket/ -- hadoopConf fs.oss. oss.accessKeyId=LTAI5t7h6SgiLSganP2m **** -- hadoopConf fs fs.oss. t=oss-cn-hangzhou.aliyuncs.com-並列処理. 10-- 成功.