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
- Masuk ke kluster Anda dalam mode SSH. Untuk informasi lebih lanjut, lihat Masuk ke Kluster.
- Jalankan perintah berikut untuk mendapatkan informasi bantuan:
sudo jindo table -help moveToKeluaran 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
Parameter Diperlukan Deskripsi -t <dbName.tableName> Ya Nama 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> Ya Jalur 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>" | -fullTable Tidak Anda 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> Tidak Hanya tabel atau partisi yang dibuat setidaknya sejumlah hari tertentu yang lalu yang dapat dimigrasikan. -p/-parallel <parallelism> Tidak Jumlah maksimum partisi atau tabel yang dapat dimigrasikan secara paralel. -s/-storagePolicy <OSS storage policy> Tidak Parameter ini tidak didukung oleh OSS-HDFS. -o/-overWrite Tidak Menentukan apakah akan menimpa jalur tujuan secara paksa. Untuk tabel terpartisi, hanya jalur tujuan partisi yang ingin Anda migrasikan yang ditimpa. -r/-removeSource Tidak Menentukan apakah akan membersihkan jalur sumber setelah data dimigrasikan dan metadata diperbarui. Untuk tabel terpartisi, hanya jalur sumber partisi yang dimigrasikan yang dibersihkan. -skipTrash Tidak Menentukan apakah akan melewati direktori Trash ketika jalur sumber dibersihkan. Catatan Anda harus menggunakan parameter ini bersama dengan parameter -r/-removeSource.-e/-explain Tidak Mode penjelasan. Dalam mode penjelasan, daftar partisi yang ingin Anda migrasikan ditampilkan, tetapi tidak ada data yang dimigrasikan. -l/-logDir <log directory> Tidak Direktori tempat file log disimpan. Nilai default: /tmp/<current user>/.
- Jika Anda menentukan
- Sintaksis perintah
- Migrasikan partisi ke OSS-HDFS.
- 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' " -eKeluaran 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). - 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' ". - 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 - 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.
- Kueri partisi yang ingin Anda migrasikan.
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.