全部产品
Search
文档中心

Object Storage Service:Gunakan perintah JindoTable MoveTo untuk memigrasikan tabel dan partisi Hive ke OSS-HDFS

更新时间:Jul 06, 2025

Topik ini menjelaskan cara menggunakan perintah JindoTable MoveTo untuk memigrasikan tabel dan partisi Hive ke OSS-HDFS.

Prasyarat

  • Kluster E-MapReduce (EMR) versi 3.36.0 atau yang lebih baru telah dibuat. Sebagai alternatif, kluster EMR versi 5.2.0 telah dibuat. EMR V3.39.X dan EMR V5.5.X tidak didukung.
  • Tabel terpartisi telah dibuat dengan menggunakan perintah Hive dan data telah ditulis ke dalam tabel tersebut. Dalam contoh ini, nama tabel diatur menjadi test_table, nama partisi diatur menjadi dt, dan nilai partisi diatur menjadi value.
  • OSS-HDFS telah diaktifkan dan izin telah diberikan untuk mengakses OSS-HDFS. Untuk informasi lebih lanjut, lihat Hubungkan Kluster Non-EMR ke OSS-HDFS.

Informasi latar belakang

Perintah MoveTo dapat secara otomatis memperbarui metadata setelah menyalin data dasar. Dengan cara ini, data dalam tabel atau partisi dapat sepenuhnya dimigrasikan ke jalur tujuan. Anda dapat mengonfigurasi kondisi filter untuk perintah MoveTo guna memigrasikan sejumlah besar partisi secara bersamaan. JindoTable juga menyediakan beberapa tindakan perlindungan untuk memastikan integritas dan keamanan data saat menggunakan perintah MoveTo untuk migrasi.

Prosedur

Penting Hanya satu proses MoveTo yang dapat berjalan pada satu waktu di kluster EMR. Jika Anda mencoba memulai proses MoveTo di kluster EMR di mana proses MoveTo lain sedang berjalan, permintaan Anda akan ditolak karena kunci konfigurasi tidak tersedia. Pesan yang berisi informasi tentang proses MoveTo yang sedang berjalan juga akan ditampilkan. Dalam hal ini, Anda dapat menghentikan proses MoveTo yang sedang berjalan dan memulai proses MoveTo baru, atau menunggu proses MoveTo yang sedang berjalan selesai.
  1. Masuk ke kluster Anda dalam mode SSH. Untuk informasi lebih lanjut, lihat Masuk ke Kluster.
  2. Jalankan perintah berikut untuk mendapatkan informasi bantuan:
    sudo jindo table -help moveTo

    Keluaran berikut dikembalikan:

    <dbName.tableName>      Tabel yang akan dipindahkan.
    <destination path>      Direktori dasar tujuan yang selalu berada pada
                              tingkat yang sama dengan 'lokasi tabel', di mana partisi
                              atau data tanpa partisi yang dipindahkan akan berada.
    <condition>/-fullTable  Kondisi filter untuk menentukan partisi mana yang harus
                              dipindahkan, mendukung operator umum (seperti '>') dan
                              UDF bawaan (seperti to_date) (UDF belum didukung...),
                              sementara -fullTable berarti bahwa semua partisi (atau
                              seluruh tabel tanpa partisi) harus dipindahkan. Satu tetapi hanya satu opsi harus ditentukan di antara -c
                              "<condition>" dan -fullTable.
    <before days>           Opsional, mengatakan bahwa tabel/partisi harus dipindahkan
                              hanya jika mereka dibuat (bukan diperbarui atau dimodifikasi)
                              lebih dari beberapa hari sebelumnya dari sekarang.
    <parallelism>           Konkurensi maksimum saat menyalin partisi, 1 secara default.
    <OSS storage policy>    Kebijakan penyimpanan untuk tujuan OSS, yang bisa Standard
                              (secara default), IA, Archive, atau ColdArchive. Tidak berlaku untuk tujuan selain OSS. CATATAN: jika Anda ingin menggunakan kebijakan penyimpanan ColdArchive, pastikan bahwa Penyimpanan Arsip Dingin telah diaktifkan untuk Bucket OSS Anda.
    
    -o/-overWrite           Menimpa jalur akhir tempat data akan dipindahkan.
                              Untuk tabel terpartisi ini menimpa lokasi partisi
                              yang merupakan subdirektori dari <destination path>; untuk
                              tabel tanpa partisi ini menimpa <destination path>
                              itu sendiri.
    -r/-removeSource        Biarkan data sumber dihapus ketika tabel/partisi yang sesuai
                              berhasil dipindahkan ke tujuan baru.
                              Jika tidak (secara default), data sumber akan dibiarkan seperti semula.
    -skipTrash              Berlaku hanya ketika [-r/-removeSource] diaktifkan. Jika
                              ada, data sumber akan segera dihapus dari sistem file,
                              melewati tempat sampah.
    -e/-explain             Jika ada, perintah tidak akan benar-benar memindahkan data, tetapi hanya
                              mencetak tabel/partisi yang akan dipindahkan untuk kondisi tertentu.
    <log directory>         Direktori untuk menempatkan file log, '/tmp/<current user>/' secara
                              default.
    • Sintaksis perintah
      sudo jindo table -moveTo \
        -t <dbName.tableName> \
        -d <destination path> \
        [-c "<condition>" | -fullTable] \
        [-b/-before <before days>] \
        [-p/-parallel <parallelism>] \
        [-s/-storagePolicy <OSS storage policy>] \
        [-o/-overWrite] \
        [-r/-removeSource] \
        [-skipTrash] \
        [-e/-explain] \
        [-l/-logDir <log directory>]
    • Deskripsi perintah
      ParameterDiperlukanDeskripsi
      -t <dbName.tableName>YaNama tabel yang ingin Anda migrasikan. Tentukan parameter ini dalam format Nama basis data.Nama tabel.

      Pisahkan nama basis data dan nama tabel dengan titik (.). Tabel dapat berupa tabel terpartisi atau tabel tanpa partisi.

      -d <destination path>YaJalur tujuan ke mana Anda ingin memigrasikan tabel. Parameter ini menentukan jalur tingkat tabel terlepas dari apakah Anda memigrasikan partisi tertentu atau seluruh tabel tanpa partisi. Jika Anda memigrasikan partisi, jalur lengkap partisi terdiri dari jalur tujuan dan nama partisi. Contoh: <destination path>/p1=v1/p2=v2/.
      -c "<condition>" | -fullTableTidakAnda harus menentukan salah satu variabel -c "<condition>" dan -fullTable.
      • Jika Anda menentukan -fullTable, seluruh tabel terpartisi atau tanpa partisi diarsipkan.
      • Jika Anda menentukan -c "<condition>", hanya partisi yang memenuhi kondisi filter yang diarsipkan. Operator umum, seperti tanda lebih besar (>), didukung.

        Sebagai contoh, jika kolom kunci partisi adalah kolom ds yang bertipe data String dan Anda ingin mengarsipkan partisi yang memiliki nama partisi lebih besar dari 'd', gunakan -c " ds > 'd' ".

      -b/before <before days>TidakHanya tabel atau partisi yang dibuat setidaknya sejumlah hari tertentu yang lalu yang dapat dimigrasikan.
      -p/-parallel <parallelism>TidakJumlah maksimum partisi atau tabel yang dapat dimigrasikan secara paralel.
      -s/-storagePolicy <OSS storage policy>TidakParameter ini tidak didukung oleh OSS-HDFS.
      -o/-overWriteTidakMenentukan apakah akan menimpa jalur tujuan secara paksa. Untuk tabel terpartisi, hanya jalur tujuan partisi yang ingin Anda migrasikan yang ditimpa.
      -r/-removeSourceTidakMenentukan apakah akan membersihkan jalur sumber setelah data dimigrasikan dan metadata diperbarui. Untuk tabel terpartisi, hanya jalur sumber partisi yang dimigrasikan yang dibersihkan.
      -skipTrashTidakMenentukan apakah akan melewati direktori Trash ketika jalur sumber dibersihkan.
      Catatan Anda harus menggunakan parameter ini bersama dengan parameter -r/-removeSource.
      -e/-explainTidakMode penjelasan. Dalam mode penjelasan, daftar partisi yang ingin Anda migrasikan ditampilkan, tetapi tidak ada data yang dimigrasikan.
      -l/-logDir <log directory>TidakDirektori tempat file log disimpan.

      Nilai default: /tmp/<current user>/.

  3. Migrasikan partisi ke OSS-HDFS.
    1. Kueri partisi yang ingin Anda migrasikan.
      Perintah yang berisi opsi -e hanya mencantumkan partisi yang ingin Anda migrasikan, tetapi tidak ada data yang dimigrasikan.
      sudo jindotable -moveTo -t tdb.test_table -d oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table -c " dt > 'v' " -e

      Keluaran perintah:

      Ditemukan 1 partisi untuk dipindahkan:
            dt=value-2
      MoveTo selesai untuk tabel tdb.test_table ke tujuan oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table dengan kondisi " dt > 'v' " (hanya penjelasan).
    2. Migrasikan partisi ke 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' " 

      Keluaran perintah:

      Ditemukan 1 partisi secara total, dan semuanya berhasil dipindahkan.
      Partisi yang berhasil dipindahkan:
          dt=value-2
      Tidak ada partisi yang gagal.
      MoveTo selesai untuk tabel tdb.test_table ke tujuan oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table dengan kondisi " dt > 'v' ".
    3. Kueri lokasi partisi untuk memeriksa apakah partisi telah dimigrasikan.
      sudo hive> desc formatted test_table partition (dt='value-2');

      Keluaran perintah:

      OK
      # col_name              data_type               comment
      id                      int
      content                 string
      
      # Partition Information
      # col_name              data_type               comment
      dt                      string
      
      # Detailed Partition Information
      Partition Value:        [value-2]
      Database:               tdb
      Table:                  test_table
      CreateTime:             UNKNOWN
      LastAccessTime:         UNKNOWN
      Location:               oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table/dt=value-2
    4. Opsional: Migrasikan partisi dari OSS-HDFS ke Hadoop Distributed File System (HDFS).
      sudo jindotable -moveTo -t tdb.test_table -d hdfs://<hdfs-path>/user/hive/warehouse/tdb.db/test_table  -c " dt > 'v' "

      Keluaran perintah:

      Tidak ada partisi yang berhasil dipindahkan.
      Partisi gagal:
          dt=value-2    Lokasi baru tidak kosong tetapi -overWrite tidak diaktifkan.
      MoveTo selesai untuk tabel tdb.test_table ke tujuan hdfs://<hdfs-path>/user/hive/warehouse/tdb.db/test_table dengan kondisi -c " dt > 'v' ".

      Pesan kesalahan Tidak ada partisi yang berhasil dipindahkan. dikembalikan karena direktori tujuan di HDFS tidak kosong. Jika Anda ingin membersihkan direktori tujuan, gunakan parameter -overWrite untuk menimpanya secara paksa. Dengan cara ini, partisi dapat dimigrasikan dari OSS-HDFS ke HDFS.

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

      Jika partisi dimigrasikan, keluaran perintah berikut dikembalikan:

      Ditemukan 1 partisi secara total, dan semuanya berhasil dipindahkan.
      Partisi yang berhasil dipindahkan:
          dt=value-2
      Tidak ada partisi yang gagal.
      MoveTo selesai untuk tabel tdb.test_table ke tujuan hdfs:///user/hive/warehouse/tdb.db/test_table dengan kondisi " dt > 'v' ", menimpa lokasi baru.

Penanganan pengecualian

Jika migrasi gagal dengan kesalahan Konflik ditemukan, lakukan operasi berikut untuk menangani masalah tersebut:

  • Pastikan tidak ada perintah selain perintah JindoTable MoveTo yang dijalankan untuk memigrasikan data ke jalur tujuan, seperti DistCp dan JindoDistCp.
  • Hapus direktori tujuan. Untuk tabel tanpa partisi, hapus direktori tingkat tabel. Untuk tabel terpartisi, hapus direktori tingkat partisi yang bertentangan.
  • Jangan hapus direktori sumber.