Gunakan perintah MoveTo dari JindoTable untuk memigrasikan tabel Apache Hive dan partisinya ke OSS-HDFS. Perintah ini menyalin data yang mendasarinya dan secara otomatis memperbarui Hive metastore sehingga kueri tetap berfungsi tanpa modifikasi setelah migrasi.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster E-MapReduce (EMR) yang menjalankan versi 3.36.0 atau lebih baru (tidak termasuk 3.39.x), atau versi 5.2.0 atau lebih baru (tidak termasuk 5.5.x)
Tabel Hive terpartisi dengan data yang telah ditulis. Contoh dalam topik ini menggunakan tabel bernama
test_tabledengan kunci partisidt.OSS-HDFS diaktifkan pada bucket Anda, dengan izin akses yang telah dikonfigurasi. Lihat Connect non-EMR clusters to OSS-HDFS.
Cara kerja
MoveTo melakukan migrasi tabel atau partisi Hive dalam dua langkah: menyalin data ke jalur tujuan, lalu memperbarui lokasi partisi di Hive metastore. Karena pembaruan metadata dilakukan secara otomatis, kueri downstream akan mengarah ke lokasi baru tanpa intervensi manual. JindoTable juga menyediakan langkah-langkah protektif untuk memastikan integritas data dan keamanan selama migrasi.
Untuk mempersempit cakupan migrasi, berikan kondisi filter bersama parameter -c. Misalnya, migrasikan hanya partisi yang nilai kuncinya melebihi ambang batas tertentu atau hanya partisi yang dibuat sebelum tanggal tertentu.
Hanya satu proses MoveTo yang dapat berjalan pada satu kluster dalam satu waktu. Jika Anda memulai proses kedua saat proses pertama sedang berjalan, permintaan tersebut akan ditolak karena kunci konfigurasi sedang digunakan. Tunggu hingga proses yang sedang berjalan selesai, atau hentikan proses tersebut dan mulai yang baru.
Sebelum menjalankan migrasi penuh, gunakan flag -e (explain) untuk melihat pratinjau partisi yang akan dipindahkan tanpa mentransfer data apa pun. Ini memastikan cakupan migrasi sebelum Anda menjalankannya.
Migrasikan partisi ke OSS-HDFS
Login ke kluster EMR Anda melalui SSH. Lihat Log on to a cluster.
Lihat pratinjau partisi yang akan dimigrasikan menggunakan mode explain. Ganti
" dt > 'v' "dengan kondisi filter yang sesuai dengan partisi Anda.sudo jindotable -moveTo \ -t tdb.test_table \ -d oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table \ -c " dt > 'v' " \ -eOutput yang diharapkan:
Found 1 partitions to move: dt=value-2 MoveTo finished for table tdb.test_table to destination oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table with condition " dt > 'v' " (explain only).Jalankan migrasi. Hapus flag
-euntuk memindahkan data.sudo jindotable -moveTo \ -t tdb.test_table \ -d oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table \ -c " dt > 'v' "Output yang diharapkan:
Found 1 partitions in total, and all are successfully moved. Successfully moved partitions: dt=value-2 No failed partition. MoveTo finished for table tdb.test_table to destination oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table with condition " dt > 'v' ".Verifikasi lokasi partisi.
sudo hive> desc formatted test_table partition (dt='value-2');Dalam output, pastikan bahwa
Locationmengarah ke jalur OSS-HDFS:Location: oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table/dt=value-2(Opsional) Migrasikan kembali partisi ke Hadoop Distributed File System (HDFS). Jika direktori tujuan di HDFS sudah berisi data, migrasi akan gagal dengan pesan error
New location is not empty but -overWrite is not enabled. Tambahkan-ountuk menimpa data tersebut.sudo jindotable -moveTo \ -t tdb.test_table \ -d hdfs://<hdfs-path>/user/hive/warehouse/tdb.db/test_table \ -c " dt > 'v' " \ -oOutput yang diharapkan:
Found 1 partitions in total, and all are successfully moved. Successfully moved partitions: dt=value-2 No failed partition. MoveTo finished for table tdb.test_table to destination hdfs:///user/hive/warehouse/tdb.db/test_table with condition " dt > 'v' ", overwriting new locations.
Parameter
Baik sudo jindo table -moveTo maupun sudo jindotable -moveTo menerima parameter yang sama.
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>]| Parameter | Wajib | Deskripsi | Catatan |
|---|---|---|---|
-t <dbName.tableName> | Ya | Tabel yang akan dimigrasikan, dalam format database.table. Contoh: tdb.test_table | Mendukung tabel partisi maupun tabel non-partisi |
-d <destination path> | Ya | Jalur tujuan tingkat tabel. Contoh: oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/data/tdb.test_table | Untuk tabel terpartisi, jalur lengkap partisi adalah <destination path>/<partition key>=<value> |
-c "<condition>" | Salah satu dari -c atau -fullTable wajib digunakan | Kondisi filter untuk memilih partisi. Contoh: -c " dt > 'v' " | Mendukung operator umum seperti >. User-Defined Functions (UDFs) belum didukung. Tidak dapat digunakan bersamaan dengan -fullTable |
-fullTable | Salah satu dari -c atau -fullTable wajib digunakan | Migrasikan seluruh tabel, termasuk semua partisinya | Tidak dapat digunakan bersamaan dengan -c |
-b/-before <before days> | Tidak | Migrasikan hanya tabel atau partisi yang dibuat setidaknya N hari yang lalu. Contoh: -b 30 | Berdasarkan waktu pembuatan, bukan waktu modifikasi terakhir |
-p/-parallel <parallelism> | Tidak | Jumlah maksimum migrasi partisi konkuren. Default: 1. Contoh: -p 4 | |
-s/-storagePolicy <OSS storage policy> | Tidak | Kelas penyimpanan OSS untuk tujuan. Nilai yang valid: Standard (default), IA, Archive, ColdArchive. Contoh: -s IA | Tidak berlaku untuk tujuan OSS-HDFS. Untuk menggunakan ColdArchive, aktifkan Cold Archive pada bucket terlebih dahulu |
-o/-overWrite | Tidak | Menimpa jalur tujuan jika sudah berisi data | Untuk tabel terpartisi, hanya jalur tujuan partisi yang dimigrasikan yang akan ditimpa |
-r/-removeSource | Tidak | Menghapus jalur sumber setelah migrasi berhasil | Untuk tabel terpartisi, hanya jalur sumber partisi yang dimigrasikan yang akan dihapus |
-skipTrash | Tidak | Melewati direktori Trash saat menghapus jalur sumber, sehingga data langsung dihapus dari sistem file | Harus digunakan bersamaan dengan -r/-removeSource |
-e/-explain | Tidak | Mode explain: mencantumkan partisi yang akan dimigrasikan tanpa memindahkan data apa pun | Gunakan ini untuk memverifikasi cakupan sebelum menjalankan migrasi penuh |
-l/-logDir <log directory> | Tidak | Direktori untuk file log. Default: /tmp/<current user>/. Contoh: -l /var/log/jindo |
Untuk mendapatkan bantuan dari command line, jalankan:
sudo jindo table -help moveToPemecahan Masalah
Conflicts found
Jika migrasi gagal dengan error Conflicts found:
Pastikan tidak ada alat lain—seperti DistCp atau JindoDistCp—yang sedang menulis data ke jalur tujuan yang sama pada waktu yang bersamaan.
Hapus direktori tujuan yang bertentangan:
Untuk tabel non-partisi: hapus direktori tingkat tabel.
Untuk tabel terpartisi: hapus direktori tingkat partisi yang bertentangan.
Jangan menghapus direktori sumber.
Setelah konflik terselesaikan, jalankan kembali perintah MoveTo.
Destination directory not empty
Jika Anda melihat pesan New location is not empty but -overWrite is not enabled, artinya jalur tujuan sudah berisi data. Tambahkan -o ke perintah untuk menimpanya.