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

Object Storage Service:JindoTable MoveToコマンドを使用して、HiveテーブルとパーティションをOSS-HDFSに移行する

最終更新日:Dec 20, 2023

このトピックでは、JindoTable MoveToコマンドを使用してHiveテーブルとパーティションをOSS-HDFSに移行する方法について説明します。

前提条件

  • バージョン3.36.0以降のE-MapReduce (EMR) クラスターが作成されます。 または、バージョン5.2.0のEMRクラスターが作成されます。 EMR V3.39.XおよびEMR V5.5.Xはサポートされていません。
  • パーティション分割されたテーブルは、Hiveコマンドを使用して作成され、データがテーブルに書き込まれます。 この例では、テーブル名はtest_tableに設定され、パーティション名はdtに設定され、パーティション値はvalueに設定されます。
  • OSS-HDFSが有効になり、OSS-HDFSにアクセスする権限が付与されます。 詳細については、「非EMRクラスターのOSS-HDFSへの接続」をご参照ください。

背景情報

MoveToコマンドは、基になるデータをコピーした後にメタデータを自動的に更新できます。 このようにして、テーブルまたはパーティション内のデータを宛先パスに完全に移行できます。 MoveToコマンドのフィルター条件を設定して、多数のパーティションを同時に移行できます。 JindoTableは、MoveToコマンドを使用してデータを移行するときに、データの整合性とセキュリティを確保するための保護対策も提供します。

手順

重要 EMRクラスターで一度に実行できるMoveToプロセスは1つだけです。 別のMoveToプロセスが実行されているEMRクラスターでMoveToプロセスを開始しようとすると、構成ロックが使用できないため、リクエストは拒否されます。 実行中のMoveToプロセスに関する情報を含むメッセージも表示されます。 この場合、実行中のMoveToプロセスを終了して新しいMoveToプロセスを開始するか、実行中のMoveToプロセスが終了するのを待つことができます。
  1. SSHモードでクラスターにログインします。 詳細については、「クラスターへのログイン」をご参照ください。
  2. 次のコマンドを実行して、ヘルプ情報を取得します。
    sudo jindoテーブル-help moveTo

    次の出力が返されます。

    <dbName.tableName> 移動するテーブル。
    <destination path> 常に
                              移動した「テーブル位置」と同じレベル
                              パーティションまたはパーティションなしのデータがに配置されます。
    <condition>/-fullTableどのパーティションを決定するためのフィルター条件
                              移動し、共通演算子 ('>' のような) をサポートし、
                              組み込みUDF (to_dateなど) (UDFはサポートされていません)
                              まだ...) 、while -fullTableは、すべてのパーティション (または
                              つまり、パーティション分割されていないテーブル全体を移動する必要があります。 1つだが
                              -cの中にオプションを1つだけ指定する必要があります
                              "<condition>" と-fullTable。
    <before days> オプション、テーブル /パーティションを移動する必要があることを示す
                              作成された場合のみ (更新または変更されていない)
                              今から数日以上前に。
    <parallelism> パーティションをコピーするときの最大同時実行数。
                              defaultを実行します。
    <OSSストレージポリシー> OSS宛先のストレージポリシー (標準)
                              (デフォルトで) 、IA、アーカイブ、またはColdArchive。 その他の目的地には適用されません
                              OSSよりも 注: ColdArchiveストレージポリシーを使用する場合は、
                              OSSバケットに対してコールドアーカイブが有効になっていることを確認します。
    
    -o/-overWriteデータが移動される最終パスを上書きします。
                              パーティションテーブルの場合、これはパーティションの場所を上書きします
                              <destination path> のサブディレクトリです。
                              <destination path> を上書きするパーティション分割されていないテーブル
                              それ自体。
    -r/-removeSource対応するときにソースデータを削除してみましょう
                              テーブル /パーティションが新しい宛先に正常に移動されました。
                              それ以外の場合 (デフォルトで) 、ソースデータはそのままになります。
                              でした。
    -skipTrash [-r/-removeSource] が有効になっている場合にのみ適用できます。 で指定されます。
                              存在すると、ソースデータはすぐに
                              ファイルシステム、ゴミ箱をバイパスします。
    -e/-explain存在する場合、コマンドは実際にはデータを移動しませんが、
                              指定された場合に移動されるテーブル /パーティションを印刷します。
                              ソート条件に応じて並べられます。
    <log directory> ログファイルを検索するディレクトリ。'/tmp/<current user>/' by
                              defaultを実行します。
    • コマンド構文
      sudo jindo table -moveTo \
        -t <dbName.tableName> \
        -d <宛先パス> \
        [-c "<condition>" | -fullTable] \
        [-b/-before <before days>] \
        [-p/-パラレル <並列処理>] \
        [-s/-storagePolicy <OSSストレージポリシー>] \
        [-o/-overWrite] \
        [-r/-removeSource] \
        [-skipTrash] \
        [-e/-説明] \
        [-l/-logDir <ログディレクトリ>] 
    • コマンド説明
      パラメーター必須説明
      -t <dbName.tableName>必須移行するテーブルの名前。 このパラメーターは、データベース名. テーブル名形式で指定します。

      データベース名とテーブル名をピリオド (.) で区切ります。 テーブルは、パーティションテーブルまたは非パーティションテーブルにすることができます。

      -d <宛先パス>必須テーブルを移行する宛先パス。 このパラメーターは、特定のパーティションまたは非パーティションテーブル全体を移行するかどうかに関係なく、テーブルレベルのパスを指定します。 パーティションを移行する場合、パーティションのフルパスは、宛先パスとパーティションの名前で構成されます。 例: <destination path>/p1=v1/p2=v2/
      -c "<condition>" | -fullTable任意-c "<condition>" および -fullTable変数のいずれかを指定する必要があります。
      • -fullTableを指定した場合、パーティションテーブルまたは非パーティションテーブル全体がアーカイブされます。
      • -c "<condition>" を指定した場合、フィルター条件を満たすパーティションのみがアーカイブされます。 より大きい記号 (>) などの一般的な演算子がサポートされています。

        たとえば、パーティションキー列がデータ型がStringのds列で、パーティション名が 'd' より大きいパーティションをアーカイブする場合は、-c "ds > 'd'" を使用します。

      -b/before <before days>任意移行できるのは、少なくとも特定の日数前に作成されたテーブルまたはパーティションのみです。
      -p/-parallel <parallelism>任意並行して移行できるパーティションまたはテーブルの最大数。
      -s/-storagePolicy <OSSストレージポリシー>任意このパラメーターはOSS-HDFSではサポートされていません。
      -o/-overWrite任意宛先パスを強制的に上書きするかどうかを指定します。 パーティションテーブルの場合、移行するパーティションの宛先パスのみが上書きされます。
      -r/-removeSource任意データの移行およびメタデータの更新後にソースパスをクリアするかどうかを指定します。 パーティションテーブルの場合、移行されたパーティションのソースパスのみがクリアされます。
      -skipTrash任意ソースパスがクリアされたときにTrashディレクトリをスキップするかどうかを指定します。
      説明 このパラメーターは、-r/-removeSourceパラメーターと一緒に使用する必要があります。
      -e/-説明任意説明モード。 説明モードでは、移行するパーティションのリストが表示されますが、データは移行されません。
      -l/-logDir <ログディレクトリ>任意ログファイルが保存されているディレクトリ。

      デフォルト値: /tmp/<current user>/

  3. パーティションをOSS-HDFSに移行します。
    1. 移行するパーティションを照会します。
      -eオプションを含むコマンドは、移行するパーティションのみを一覧表示しますが、データは移行されません。
      sudo jindotable -moveTo -t tdb.test_table -d oss:// examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table -c "dt > 'v'" -e

      コマンド出力:

      移動するパーティションが1つ見つかりました:
            dt=value-2
      条件 "dt > 'v'" でテーブルtdb.test_tableを宛先oss:// examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_tableに移動しました (説明のみ) 。
    2. パーティションをOSS-HDFSに移行します。
      sudo jindotable -moveTo -t tdb.test_table -d oss:// examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table -c "dt > 'v'"

      コマンド出力:

      合計で1つのパーティションが見つかり、すべてが正常に移動されました。
      パーティションの移動に成功:
          dt=value-2
      失敗したパーティションはありません。
      条件 "dt > 'v'" でテーブルtdb.test_tableを宛先oss:// examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_tableに移動しました。
    3. パーティションの場所を照会して、パーティションが移行されているかどうかを確認します。
      sudo hive> desc形式のtest_tableパーティション (dt='value-2 ');

      コマンド出力:

      OK
      # col_name data_typeコメント
      id int
      コンテンツ文字列
      
      # パーティション情報
      # col_name data_typeコメント
      dtストリング
      
      # 詳細なパーティション情報
      パーティション値: [Value-2]
      データベース: tdb
      テーブル: test_table
      CreateTime: 不明
      LastAccessTime: 不明
      場所: oss:// examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table/dt=value-2 
    4. オプション: パーティションをOSS-HDFSからHadoop分散ファイルシステム (HDFS) に移行します。
      sudo jindotable -moveTo -t tdb.test_table -d hdfs://<hdfs-path>/user/hive/warehouse/tdb.db/test_table -c "dt > 'v'"

      コマンド出力:

      正常に移動したパーティションがありません。
      失敗したパーティション:
          dt=value-2新しい場所は空ではありませんが、overWriteは有効になっていません。
      テーブルtdb.test_tableから宛先hdfs://<hdfs-path>/user/hive/warehouse/tdb.db/test_table with condition -c "dt > 'v'" への移動が終了しました。

      Noは、パーティションの移動に成功しました。 HDFSの宛先ディレクトリが空でないため、エラーメッセージが返されます。 宛先ディレクトリをクリアする場合は、-overWriteパラメーターを使用して強制的に上書きします。 このようにして、パーティションをOSS-HDFSからHDFSに移行できます。

      sudo jindotable -moveTo -t tdb.test_table -d hdfs://<hdfs-path>/user/hive/warehouse/tdb.db/test_table -c "dt > 'v'"

      パーティションが移行されると、次のコマンド出力が返されます。

      合計で1つのパーティションが見つかり、すべてが正常に移動されました。
      パーティションの移動に成功:
          dt=value-2
      失敗したパーティションはありません。
      テーブルtdb.test_tableから宛先hdfs:/// user/hive/warehouse/tdb.db/test_tableを条件 "dt > 'v'" で終了し、新しい場所を上書きしました。

例外処理

Conflicts foundエラーで移行が失敗した場合は、次の操作を実行して問題を処理します。

  • DistCpやJindoDistCpなど、データを宛先パスに移行するために、JindoTable MoveToコマンド以外のコマンドが実行されていないことを確認してください。
  • 宛先ディレクトリを削除します。 パーティション分割されていないテーブルの場合は、テーブルレベルのディレクトリを削除します。 パーティション分割テーブルの場合は、競合するパーティションレベルのディレクトリを削除します。
  • ソースディレクトリを削除しないでください。