このトピックでは、Jindo DistCp を使用して Hadoop 分散ファイルシステム (HDFS) から Object Storage Service (OSS) にデータを移行する方法について、Alibaba Cloud E-MapReduce クラスターを例に説明します。
背景情報
従来のビッグデータシステムでは、HDFS は大規模なデータセットの基盤ストレージとして機能することがよくあります。データ移行およびコピーのタスクでは、最も一般的なツールは Hadoop に付属の DistCp ユーティリティです。しかし、このツールはオブジェクトストレージの機能を十分に活用できないため、パフォーマンスが低下し、データ整合性の問題が発生する可能性があります。また、提供されるオプションも限られており、すべてのユーザー要件を満たせない場合があります。
Alibaba Cloud Jindo DistCp は、大規模なクラスター内またはクラスター間でファイルをコピーするために設計された分散ファイルコピーユーティリティです。MapReduce を使用して、ファイルの配布、エラー処理、およびリカバリを管理します。このタスクは、ファイルとディレクトリのリストを入力として受け取り、各マップタスクがソースからファイルのサブセットをコピーします。Jindo DistCp は、HDFS クラスター間、HDFS と OSS 間、および OSS バケット間のデータコピーシナリオを完全にサポートします。また、コピータスクをカスタマイズするための幅広いパラメーターと戦略も提供します。
Jindo DistCp は、HDFS から OSS にデータを移行する際に、Hadoop DistCp と比較して以下の利点があります。
-
高性能:テストシナリオでは、Hadoop DistCp よりも最大 1.59倍高速です。
-
豊富な機能:複数のコピー方法とシナリオ固有の最適化戦略を提供します。
-
OSS との密な統合:ファイルのストレージクラスをアーカイブに変更したり、圧縮を適用したりするなど、ネイティブの OSS 機能をサポートします。
-
アトミックコピー:リネーム不要のコピーメカニズムにより、データ整合性を保証します。
-
幅広い互換性:Hadoop DistCp の完全な代替として機能し、Hadoop 2.7+ および Hadoop 3.x をサポートします。
前提条件
バージョン 3.28.0 以降の E-MapReduce クラスターが必要です。詳細については、「クラスターの作成」をご参照ください。
バージョン 3.28.0 以降の E-MapReduce クラスターでは、シェルコマンドを使用して Jindo DistCp を実行できます。詳細については、「Jindo DistCpの使用方法」をご参照ください。バージョン 3.28.0 より前のクラスターでは、互換性の問題が発生する可能性があります。この問題が発生した場合は、チケットを送信してサポートを依頼してください。
ECS インスタンス上の自己管理クラスターを使用する場合、MapReduce タスクを実行できる Hadoop 2.7+ または Hadoop 3.x 環境が必要です。
ステップ1:JARパッケージのダウンロード
-
E-MapReduce クラスターにログインします。
-
EMR on ECS コンソール にログインします。
-
E-MapReduce クラスターの ID をクリックします。
-
Nodes タブをクリックし、ノードグループの左側にある
アイコンをクリックします。 -
ECS ID をクリックします。インスタンス詳細ページで、インスタンス ID の右側にある 接続 をクリックします。
SSH キーペアまたはパスワードを使用して Windows または Linux 環境からクラスターに接続するには、「クラスターへのログイン」をご参照ください。
-
-
最新バージョンの
Jindosdk-${version}.tar.gzをダウンロードして解凍します。ダウンロードリンクについては、「JindoDataのダウンロード」をご参照ください。
ステップ2:OSS認証情報の設定
次のいずれかの方法を使用して、OSS へのアクセス認証情報を設定します。
コマンドラインパラメーター
hadoop jar jindo-distcp-tool-${version}.jar --src /tmp/ --dest oss://examplebucket/ --hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --parallelism 10
設定ファイル
-
Hadoop の core-site.xml 設定ファイルがあるディレクトリに移動します。
cd /etc/emr/hadoop-conf/E-MapReduce 環境の一般的なファイルパスについては、「一般的なファイルパス」をご参照ください。
-
core-site.xmlファイルを開きます。
vim core-site.xml -
core-site.xmlファイルに次のプロパティを追加します。
<configuration> <property> <name>fs.oss.accessKeyId</name> <value>LTAI****************</value> </property> <property> <name>fs.oss.accessKeySecret</name> <value>YourAccessKeySecret</value> </property> <property> <name>fs.oss.endpoint</name> <!-- Alibaba Cloud ECS 環境では、oss-cn-xxx-internal.aliyuncs.com のような内部 OSS エンドポイントを使用することを推奨します。 --> <value>oss-cn-xxx.aliyuncs.com</value> </property> </configuration>
認証情報不要のアクセス
AccessKey ペアを平文で保存するのを避け、セキュリティを向上させるため、認証情報不要のアクセスを設定します。詳細については、「JindoFS SDKの認証情報不要機能の使用」をご参照ください。
ステップ3:データの移行またはコピー
-
次のコマンドを実行して、HDFS 内のデータを一覧表示します。
hdfs dfs -ls /レスポンスの例:
Found 8 items drwxrwxrwx - admin supergroup 0 2023-10-26 10:55 /.sysinfo drwxrwxrwx - hadoop supergroup 0 2023-10-26 10:55 /apps drwxrwxrwx - root supergroup 0 2022-08-03 15:54 /data -rw-r----- 1 root supergroup 13 2022-08-25 11:45 /examplefile.txt drwxrwxrwx - spark supergroup 0 2023-10-26 14:49 /spark-history drwx-wx-wx - hive supergroup 0 2023-10-26 13:35 /tmp drwxrwxrwx - hive supergroup 0 2023-10-26 14:48 /user drwxrwxrwx - hadoop supergroup 0 2023-10-26 14:48 /yarn -
jindo-distcp-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.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --parallelism 10次の表で、コマンドのパラメーターとオプションについて説明します。
パラメーター
説明
例
--src
HDFS のソースパス。
/tmp/
--dest
宛先の OSS パス。
oss://examplebucket/
--hadoopConf
OSS へのアクセスに必要な AccessKey ID、AccessKey Secret、およびエンドポイントを指定します。
-
AccessKey ID と AccessKey Secret を取得するには、「AccessKeyペアの作成」をご参照ください。
-
OSS のリージョンとそれに対応するエンドポイントのリストについては、「リージョンとエンドポイント」をご参照ください。
重要ECS インスタンスから OSS にアクセスする場合は、oss-cn-xxx-internal.aliyuncs.com のような内部エンドポイントを使用してください。
--hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com
--parallelism
同時実行タスクの数。クラスターのリソースに基づいてこの値を調整できます。
10
増分データコピー
前回の完全なデータ移行またはコピーの後にソースパスに追加されたデータのみをコピーしたい場合は、--update オプションを使用して増分データ移行またはコピーを実行できます。
次のコマンド例では、指定された HDFS ディレクトリ/tmp から宛先の OSS パスoss://examplebucket/ へデータを増分移行またはコピーします。
hadoop jar jindo-distcp-tool-${version}.jar --src /tmp/ --dest oss://examplebucket/ --hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --update --parallelism 10--update オプションを使用すると、デフォルトでチェックサムが有効になります。この機能が有効な場合、DistCp はソースパスと宛先パスのファイル名、ファイルサイズ、およびチェックサムを比較します。ソースパスと宛先パスでファイル名、ファイルサイズ、またはチェックサムが一致しない場合、増分データ移行またはコピータスクが自動的にトリガーされます。
ソースパスと宛先パスのファイルのチェックサムを比較する必要がない場合は、--disableChecksum オプションを追加してチェックサム検証を無効にします。コマンド例は次のとおりです。
hadoop jar jindo-distcp-tool-${version}.jar --src /tmp/ --dest oss://examplebucket/ --hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --update --disableChecksum --parallelism 10 -
付録1:Jindo DistCpのパラメーター
Jindo DistCp には、包括的なパラメーターとオプションが用意されています。それぞれの詳細情報を表示するには、次のコマンドを実行してください。
hadoop jar jindo-distcp-tool-${version}.jar --help
次の表で、一般的なパラメーターとオプションを説明します。
|
パラメーター |
説明 |
例 |
|
--src |
コピー元のソースパス。 |
--src oss://examplebucket/sourcedir |
|
--dest |
コピー先の宛先パス。 |
--dest oss://examplebucket/destdir |
|
--bandWidth |
DistCp タスクのホストあたりの帯域幅制限 (MB/秒)。 |
--bandWidth 6 |
|
--codec |
ファイルの圧縮コーデックを指定します。サポートされているコーデックには、
説明
オープンソースの Hadoop 環境で |
--codec gz |
|
--policy |
OSS にコピーされるファイルのストレージクラスを指定します。有効な値:
|
--policy coldArchive |
|
--filters |
正規表現を含むファイルへのパスを指定します。ファイル内の各行は、コピーまたは比較プロセスから除外するファイルのパターンです。 |
--filters test.txt |
|
--srcPrefixesFile |
コピーするファイルパスのリストを含むファイルを指定します。ファイル内のパスは |
--srcPrefixesFile prefixes.txt |
|
--parallelism |
MapReduce タスクの 説明
E-MapReduce 環境でのこのパラメーターのデフォルト値は 7 です。 |
--parallelism 20 |
|
--tmp |
DistCp タスクの一時ディレクトリを指定します。 |
--tmp /tmp |
|
--hadoopConf |
OSS にアクセスするための AccessKey ペアとエンドポイントを指定します。 |
--hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-xxx.aliyuncs.com |
|
--disableChecksum |
チェックサム検証を無効にします。 |
--disableChecksum |
|
--deleteOnSuccess |
コピータスクが正常に完了した後、ソースファイルを削除します。 |
--deleteOnSuccess |
|
--enableTransaction |
タスクレベルの整合性とトランザクションサポートを保証します。 |
--enableTransaction |
|
--ignore |
データ移行中に発生した例外を無視します。エラーはタスクを中断せず、DistCp カウンターとして報告されます。 |
--ignore |
|
--diff |
すべてのファイルがコピーされたことを確認し、見逃されたファイルをリストアップします。 |
--diff |
|
--update |
増分コピーを有効にし、ソースパスから宛先パスへ新規または更新されたファイルのみをコピーします。 |
--update |
|
--preserveMeta |
移行中に、Owner、Group、Permission、Atime、Mtime、Replication、BlockSize、XAttrs、ACLs などのファイルメタデータを保持します。 |
--preserveMeta |
|
--jobBatch |
各 DistCp タスクによって処理されるファイル数を指定します。デフォルト値:1000。 |
--jobBatch 1000 |
|
--taskBatch |
各 DistCp サブタスクによって処理されるファイル数を指定します。デフォルト値:10。 |
--taskBatch 10 |
付録2:ユースケース
シナリオ1:データ整合性の検証
Jindo DistCp でデータ整合性を検証するには、2つの方法があります。
-
方法1:DistCpカウンターの使用
タスクのサマリーにある
BYTES_EXPECTEDやFILES_EXPECTEDなどの DistCp カウンターを確認することで、データ整合性を検証できます。例 JindoDistcpCounter BYTES_COPIED=10000 BYTES_EXPECTED=10000 FILES_COPIED=11 FILES_EXPECTED=11 ... Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0次の表で、例のカウンターを説明します。
パラメーター
説明
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.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --diff
シナリオ2:ストレージクラスの指定
コマンド例に --policy オプションを追加して、OSS に書き込まれるファイルのストレージクラスを指定できます。次の例は、ストレージクラスを低頻度アクセスとして指定する方法を示しています。
hadoop jar jindo-distcp-tool-${version}.jar --src /tmp/ --dest oss://examplebucket/ --hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --policy ia --parallelism 10
ストレージタイプをアーカイブとして指定したい場合は、--policy ia を --policy archive に置き換えます。ストレージタイプをコールドアーカイブとして指定したい場合は、--policy ia を --policy coldArchive に置き換えます。さらに、コールドアーカイブは一部のリージョンでのみ利用可能です。詳細については、「コールドアーカイブ」をご参照ください。
シナリオ3:移行後のソースデータの削除
--deleteOnSuccess オプションを使用すると、移行またはコピータスクが完了した後に、OSS の宛先パスのデータのみを保持し、HDFS のソースパスから指定されたデータを削除できます。
hadoop jar jindo-distcp-tool-${version}.jar --src /tmp/ --dest oss://examplebucket/ --hadoopConf fs.oss.accessKeyId=LTAI**************** --hadoopConf fs.oss.accessKeySecret=yourAccessKeySecret --hadoopConf fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com --deleteOnSuccess --parallelism 10