すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:HDFSからOSSへのデータ移行

最終更新日:Aug 29, 2026

このトピックでは、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パッケージのダウンロード

  1. E-MapReduce クラスターにログインします。

    1. EMR on ECS コンソール にログインします。

    2. E-MapReduce クラスターの ID をクリックします。

    3. Nodes タブをクリックし、ノードグループの左側にある p480359.jpg アイコンをクリックします。

    4. ECS ID をクリックします。インスタンス詳細ページで、インスタンス ID の右側にある 接続 をクリックします。

    SSH キーペアまたはパスワードを使用して Windows または Linux 環境からクラスターに接続するには、「クラスターへのログイン」をご参照ください。

  2. 最新バージョンの 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

設定ファイル

  1. Hadoop の core-site.xml 設定ファイルがあるディレクトリに移動します。

    cd /etc/emr/hadoop-conf/

    E-MapReduce 環境の一般的なファイルパスについては、「一般的なファイルパス」をご参照ください。

  2. core-site.xmlファイルを開きます。

    vim core-site.xml
  3. 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:データの移行またはコピー

  1. 次のコマンドを実行して、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
  2. jindo-distcp-tool-${version}.jar パッケージがあるディレクトリに移動します。

    cd /opt/apps/JINDOSDK/jindosdk-current/tools
  3. コマンドを実行して、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

ファイルの圧縮コーデックを指定します。サポートされているコーデックには、gzip、gz、lzo、lzop、snappy があります。また、次のキーワードも使用できます。

  • none:ファイルを非圧縮で保存します。ソースファイルが圧縮されている場合、Jindo DistCp はそれを解凍します。

  • keep (デフォルト):ファイルの元の圧縮を保持します。

説明

オープンソースの Hadoop 環境で lzo コーデックを使用するには、gplcompression ネイティブライブラリと hadoop-lzo パッケージがインストールされている必要があります。これらが利用できない場合は、別の圧縮コーデックを使用することを推奨します。

--codec gz

--policy

OSS にコピーされるファイルのストレージクラスを指定します。有効な値:

  • ia:低頻度アクセス

  • archive:アーカイブ

  • coldArchive:コールドアーカイブ

--policy coldArchive

--filters

正規表現を含むファイルへのパスを指定します。ファイル内の各行は、コピーまたは比較プロセスから除外するファイルのパターンです。

--filters test.txt

--srcPrefixesFile

コピーするファイルパスのリストを含むファイルを指定します。ファイル内のパスは --src パスからの相対パスです。

--srcPrefixesFile prefixes.txt

--parallelism

MapReduce タスクの mapreduce.job.reduces パラメーターの値を指定します。クラスターのリソースに基づいて DistCp タスクの同時実行数を制御するために、この値をカスタマイズできます。

説明

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 カウンターとして報告されます。--enableCMS を使用すると、指定されたチャネルを通じて通知も送信されます。

--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