Topik ini menjelaskan cara menggunakan alat salin data Jindo DistCp.
Prasyarat
Sebuah kluster E-MapReduce (EMR) versi 3.28.0 atau yang lebih baru telah dibuat. Untuk informasi tentang cara membuat kluster, lihat Buat sebuah kluster.
Menggunakan Jindo DistCp
Masuk ke node master dari kluster EMR dalam mode SSH.
Untuk informasi lebih lanjut, lihat Masuk ke sebuah kluster.
Jalankan perintah berikut untuk mendapatkan informasi bantuan:
jindo distcp --helpInformasi berikut dikembalikan:
--help - Cetak teks bantuan --src=VALUE - Direktori untuk menyalin file dari --dest=VALUE - Direktori untuk menyalin file ke --parallelism=VALUE - Paralelisme tugas salin --outputManifest=VALUE - Nama file manifest --previousManifest=VALUE - Jalur ke file manifest yang ada --requirePreviousManifest=VALUE - Memerlukan bahwa manifest sebelumnya hadir jika ditentukan --copyFromManifest - Salin dari manifest alih-alih mendaftar direktori --srcPrefixesFile=VALUE - File yang berisi daftar awalan URI sumber --srcPattern=VALUE - Hanya menyertakan file sumber yang cocok dengan pola ini --deleteOnSuccess - Hapus file input setelah penyalinan berhasil --outputCodec=VALUE - Kodek kompresi untuk file keluaran --groupBy=VALUE - Pola untuk mengelompokkan file masukan berdasarkan --targetSize=VALUE - Ukuran target untuk file keluaran --enableBalancePlan - Aktifkan rencana salin tugas untuk membuat keseimbangan --enableDynamicPlan - Aktifkan rencana salin tugas secara dinamis --enableTransaction - Aktifkan transaksi pada Pekerjaan secara eksplisit --diff - tampilkan perbedaan antara daftar file src dan dest
Saat menggunakan Jindo DistCp, Anda dapat menentukan opsi berikut untuk menyalin data:
--src dan --dest
--src menentukan direktori sumber. --dest menentukan direktori tujuan.
Secara default, Jindo DistCp menyalin semua file di direktori yang ditentukan oleh --src ke direktori yang ditentukan oleh --dest. Jika Anda tidak menentukan direktori root, Jindo DistCp secara otomatis membuat direktori root.
Sebagai contoh, Anda dapat menjalankan perintah berikut untuk menyalin file di direktori /opt/tmp HDFS ke Bucket OSS:
jindo distcp --src /opt/tmp --dest oss://<yourBucketName>/tmpyourBucketName adalah nama Bucket OSS Anda.
--parallelism
--parallelism menentukan parameter mapreduce.job.reduces untuk pekerjaan MapReduce yang dijalankan untuk menyalin file. Nilai defaultnya adalah 7. Anda dapat menyesuaikan --parallelism berdasarkan sumber daya kluster yang tersedia. Ini memungkinkan Anda menentukan berapa banyak tugas reduce yang dapat dijalankan secara paralel.
Sebagai contoh, Anda dapat menjalankan perintah berikut untuk menyalin file di direktori /opt/tmp HDFS ke Bucket OSS:
jindo distcp --src /opt/tmp --dest oss://<yourBucketName>/tmp --parallelism 20--srcPattern
--srcPattern menentukan ekspresi reguler yang menyaring file untuk operasi salin. Ekspresi reguler harus cocok dengan jalur penuh.
Sebagai contoh, jika Anda perlu menyalin semua file log di direktori /data/incoming/hourly_table/2017-02-01/03, atur --srcPattern menjadi .*\.log.
Jalankan perintah berikut untuk melihat file di direktori /data/incoming/hourly_table/2017-02-01/03:
hdfs dfs -ls /data/incoming/hourly_table/2017-02-01/03Informasi berikut dikembalikan:
Ditemukan 6 item
-rw-r----- 2 root hadoop 2252 2020-04-17 20:42 /data/incoming/hourly_table/2017-02-01/03/000151.sst
-rw-r----- 2 root hadoop 4891 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/1.log
-rw-r----- 2 root hadoop 4891 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/2.log
-rw-r----- 2 root hadoop 4891 2020-04-17 20:42 /data/incoming/hourly_table/2017-02-01/03/OPTIONS-000109
-rw-r----- 2 root hadoop 1016 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/emp01.txt
-rw-r----- 2 root hadoop 1016 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/emp06.txtJalankan perintah berikut untuk menyalin file log:
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --srcPattern .*\.log --parallelism 20Jalankan perintah berikut untuk melihat file di Bucket OSS tujuan:
hdfs dfs -ls oss://<yourBucketName>/hourly_table/2017-02-01/03Informasi berikut dikembalikan. Hanya file log di direktori sumber yang disalin.
Ditemukan 2 item
-rw-rw-rw- 1 4891 2020-04-17 20:52 oss://<yourBucketName>/hourly_table/2017-02-01/03/1.log
-rw-rw-rw- 1 4891 2020-04-17 20:52 oss://<yourBucketName>/hourly_table/2017-02-01/03/2.log--deleteOnSuccess
--deleteOnSuccess memungkinkan Jindo DistCp menghapus file yang disalin dari direktori sumber setelah operasi salin berhasil.
Sebagai contoh, Anda dapat menjalankan perintah berikut untuk menyalin file di /data/incoming/hourly_table ke Bucket OSS dan menghapus file yang disalin dari direktori sumber:
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --deleteOnSuccess --parallelism 20--outputCodec
--outputCodec menentukan kodek kompresi yang digunakan untuk mengompres file yang disalin secara online. Contoh:
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --outputCodec=gz --parallelism 20Jalankan perintah berikut untuk melihat file di direktori tujuan:
hdfs dfs -ls oss://<yourBucketName>/hourly_table/2017-02-01/03Informasi berikut dikembalikan. File di direktori tujuan dikompres dalam format GZ.
Ditemukan 6 item
-rw-rw-rw- 1 938 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/000151.sst.gz
-rw-rw-rw- 1 1956 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/1.log.gz
-rw-rw-rw- 1 1956 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/2.log.gz
-rw-rw-rw- 1 1956 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/OPTIONS-000109.gz
-rw-rw-rw- 1 506 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/emp01.txt.gz
-rw-rw-rw- 1 506 2020-04-17 20:58 oss://<yourBucketName>/hourly_table/2017-02-01/03/emp06.txt.gzAnda dapat mengatur parameter ini ke gzip, gz, lzo, lzop, snappy, none, atau keep. Nilai default: keep. Deskripsi untuk none dan keep:
none: Jindo DistCp tidak mengompres file yang disalin. Jika file telah dikompres, Jindo DistCp mendekompresnya.
keep: Jindo DistCp menyalin file tanpa mengubah kompresi.
Jika Anda ingin menggunakan kodek LZO di kluster Hadoop open source, Anda harus menginstal pustaka asli gplcompression dan paket hadoop-lzo.
--outputManifest dan --requirePreviousManifest
--outputManifest menghasilkan file manifest yang berisi informasi tentang semua file yang disalin oleh Jindo DistCp. Informasi tersebut mencakup file tujuan, file sumber, dan ukuran file.
Jika Anda ingin menghasilkan file manifest, atur --requirePreviousManifest ke false. Secara default, file dikompres dalam format GZ. Ini adalah satu-satunya format yang didukung.
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --outputManifest=manifest-2020-04-17.gz --requirePreviousManifest=false --parallelism 20Jalankan perintah berikut untuk melihat isi file:
hadoop fs -text oss://<yourBucketName>/hourly_table/manifest-2020-04-17.gz > before.lst
cat before.lst Informasi berikut dikembalikan:
{"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/000151.sst","baseName":"2017-02-01/03/000151.sst","srcDir":"oss://<yourBucketName>/hourly_table","size":2252}
{"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/1.log","baseName":"2017-02-01/03/1.log","srcDir":"oss://<yourBucketName>/hourly_table","size":4891}
{"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/2.log","baseName":"2017-02-01/03/2.log","srcDir":"oss://<yourBucketName>/hourly_table","size":4891}
{"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/OPTIONS-000109","baseName":"2017-02-01/03/OPTIONS-000109","srcDir":"oss://<yourBucketName>/hourly_table","size":4891}
{"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/emp01.txt","baseName":"2017-02-01/03/emp01.txt","srcDir":"oss://<yourBucketName>/hourly_table","size":1016}
{"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/emp06.txt","baseName":"2017-02-01/03/emp06.txt","srcDir":"oss://<yourBucketName>/hourly_table","size":1016}--outputManifest dan --previousManifest
--outputManifest menghasilkan file manifest yang berisi daftar file yang sebelumnya dan baru saja disalin. --previousManifest menghasilkan file manifest yang berisi daftar file yang sebelumnya disalin. Dengan cara ini, Anda dapat merekonstruksi seluruh riwayat operasi dan melihat file apa yang disalin oleh pekerjaan saat ini.
Sebagai contoh, dua file ditambahkan ke direktori sumber. Jalankan perintah berikut untuk menyalin file yang baru ditambahkan:
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --outputManifest=manifest-2020-04-18.gz --previousManifest=oss://<yourBucketName>/hourly_table/manifest-2020-04-17.gz --parallelism 20Jalankan perintah berikut untuk melihat file yang disalin:
hadoop fs -text oss://<yourBucketName>/hourly_table/manifest-2020-04-18.gz > current.lst
diff before.lst current.lst Informasi berikut dikembalikan:
3a4,5
> {"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/5.log","baseName":"2017-02-01/03/5.log","srcDir":"oss://<yourBucketName>/hourly_table","size":4891}
> {"path":"oss://<yourBucketName>/hourly_table/2017-02-01/03/6.log","baseName":"2017-02-01/03/6.log","srcDir":"oss://<yourBucketName>/hourly_table","size":4891}--copyFromManifest
Anda dapat menggunakan --copyFromManifest untuk menentukan file manifest yang sebelumnya dihasilkan oleh --outputManifest dan menyalin file yang terdaftar dalam file manifest ke direktori tujuan. Contoh:
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --previousManifest=oss://<yourBucketName>/hourly_table/manifest-2020-04-17.gz --copyFromManifest --parallelism 20--srcPrefixesFile
--srcPrefixesFile memungkinkan Jindo DistCp menyalin file di beberapa folder sekaligus.
Jalankan perintah berikut untuk melihat sub-folder di bawah hourly_table:
hdfs dfs -ls oss://<yourBucketName>/hourly_tableInformasi berikut dikembalikan:
Ditemukan 4 item
drwxrwxrwx - 0 1970-01-01 08:00 oss://<yourBucketName>/hourly_table/2017-02-01
drwxrwxrwx - 0 1970-01-01 08:00 oss://<yourBucketName>/hourly_table/2017-02-02Jalankan perintah berikut untuk menyalin semua file di bawah hourly_table ke folder tujuan. File bernama folders.txt dihasilkan. File ini berisi awalan yang sesuai dengan masing-masing sub-folder di bawah hourly_table.
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --srcPrefixesFile file:///opt/folders.txt --parallelism 20Jalankan perintah berikut untuk melihat isi file folders.txt:
cat folders.txt Informasi berikut dikembalikan:
hdfs://emr-header-1.cluster-50466:9000/data/incoming/hourly_table/2017-02-01
hdfs://emr-header-1.cluster-50466:9000/data/incoming/hourly_table/2017-02-02--groupBy dan -targetSize
Membaca sejumlah besar file kecil dari HDFS memengaruhi kinerja pemrosesan data. Oleh karena itu, kami sarankan Anda menggunakan Jindo DistCp untuk menggabungkan file kecil menjadi file besar dengan ukuran tertentu. Ini mengoptimalkan kinerja analisis dan mengurangi biaya.
Jalankan perintah berikut untuk melihat file di folder yang ditentukan:
hdfs dfs -ls /data/incoming/hourly_table/2017-02-01/03Informasi berikut dikembalikan:
Ditemukan 8 item
-rw-r----- 2 root hadoop 2252 2020-04-17 20:42 /data/incoming/hourly_table/2017-02-01/03/000151.sst
-rw-r----- 2 root hadoop 4891 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/1.log
-rw-r----- 2 root hadoop 4891 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/2.log
-rw-r----- 2 root hadoop 4891 2020-04-17 21:08 /data/incoming/hourly_table/2017-02-01/03/5.log
-rw-r----- 2 root hadoop 4891 2020-04-17 21:08 /data/incoming/hourly_table/2017-02-01/03/6.log
-rw-r----- 2 root hadoop 4891 2020-04-17 20:42 /data/incoming/hourly_table/2017-02-01/03/OPTIONS-000109
-rw-r----- 2 root hadoop 1016 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/emp01.txt
-rw-r----- 2 root hadoop 1016 2020-04-17 20:47 /data/incoming/hourly_table/2017-02-01/03/emp06.txtJalankan perintah berikut untuk menggabungkan file TXT di folder menjadi file dengan ukuran tidak lebih dari 10 MB:
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --targetSize=10 --groupBy='.*/([a-z]+).*.txt' --parallelism 20Jalankan perintah berikut untuk melihat file di direktori tujuan. Dua file TXT digabungkan menjadi satu.
hdfs dfs -ls oss://<yourBucketName>/hourly_table/2017-02-01/03/
Ditemukan 1 item
-rw-rw-rw- 1 2032 2020-04-17 21:18 oss://<yourBucketName>/hourly_table/2017-02-01/03/emp2--enableBalancePlan
Jika baik file kecil maupun besar akan disalin tetapi ukuran file tidak terlalu berbeda di antara file kecil dan di antara file besar, Anda dapat menggunakan --enableBalancePlan untuk mengoptimalkan rencana alokasi pekerjaan. Ini meningkatkan kinerja salin Jindo DistCp. Jika Anda tidak menentukan rencana aplikasi, file dialokasikan secara acak.
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --enableBalancePlan --parallelism 20Anda tidak dapat menggunakan opsi ini dalam perintah yang sama dengan --groupBy atau --targetSize.
--enableDynamicPlan
Jika file yang akan disalin sangat berbeda dalam ukuran dan sebagian besar file adalah file kecil, Anda dapat menggunakan --enableDynamicPlan untuk mengoptimalkan rencana alokasi pekerjaan. Ini meningkatkan kinerja salin Jindo DistCp.
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --enableDynamicPlan --parallelism 20Anda tidak dapat menggunakan opsi ini dalam perintah yang sama dengan --groupBy atau --targetSize.
--enableTransaction
--enableTransaction memastikan integritas tingkat pekerjaan dan dukungan transaksi di antara pekerjaan. Contoh:
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --enableTransaction --parallelism 20--diff
Setelah file disalin, Anda dapat menggunakan --diff untuk memeriksa perbedaan antara direktori sumber dan tujuan.
Contoh:
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --diffJika semua file disalin, informasi berikut dikembalikan:
INFO distcp.JindoDistCp: distcp telah selesai sepenuhnyaJika beberapa file tidak disalin, sebuah file manifest yang berisi daftar file-file tersebut dihasilkan di direktori tujuan. Kemudian, Anda dapat menggunakan --copyFromManifest dan --previousManifest untuk menyalin file dalam daftar ke direktori tujuan. Dengan cara ini, volume data dan jumlah file diverifikasi. Jika Jindo DistCp telah melakukan operasi kompresi atau dekompresi selama proses penyalinan, --diff tidak mengembalikan perbedaan ukuran file yang akurat.
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --dest oss://<yourBucketName>/hourly_table --previousManifest=file:///opt/manifest-2020-04-17.gz --copyFromManifest --parallelism 20Jika direktori tujuan Anda adalah direktori HDFS, Anda harus menentukan --dest dalam format /path, hdfs://hostname:ip/path, atau hdfs://headerIp:ip/path. Format lain, seperti hdfs:///path dan hdfs:/path, tidak didukung.
Periksa DistCp Counters
Jalankan perintah berikut untuk memeriksa DistCp Counters dalam informasi counter MapReduce:
Distcp Counters
Bytes Destination Copied=11010048000
Bytes Source Read=11010048000
Files Copied=1001
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0Jika Jindo DistCp telah melakukan operasi kompresi atau dekompresi selama proses penyalinan, nilai Bytes Destination Copied dan Bytes Source Read mungkin berbeda.
Gunakan pasangan AccessKey untuk mengakses OSS
Jika Anda ingin mengakses OSS dari instance di luar EMR atau akses tanpa AccessKey tidak didukung, Anda dapat menggunakan pasangan AccessKey untuk mengakses OSS. Atur parameter --key, --secret, dan --endPoint dalam perintah untuk menentukan pasangan AccessKey.
Contoh:
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --key <yourAccessKeyId> --secret <yourAccessKeySecret> --endPoint oss-cn-hangzhou.aliyuncs.com --parallelism 20yourAccessKeyId adalah ID AccessKey dari akun Alibaba Cloud Anda. yourAccessKeySecret adalah Rahasia AccessKey dari akun Alibaba Cloud Anda.
Tulis data ke OSS IA atau penyimpanan Arsip
Saat Anda menggunakan tugas DistCp untuk menulis data ke OSS, Anda dapat menulis data ke penyimpanan Arsip atau Infrequent Access (IA) OSS.
Contoh kelas penyimpanan Arsip (
--archive):jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --policy archive --parallelism 20Contoh kelas penyimpanan IA (
--ia):jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --policy ia --parallelism 20
Bersihkan file residu
Saat Anda menjalankan tugas DistCp, file yang tidak diunggah dengan benar mungkin dihasilkan di direktori tujuan Anda. File-file tersebut dikelola oleh OSS berdasarkan uploadId dan mungkin tidak terlihat oleh pengguna. Dalam hal ini, Anda dapat menentukan parameter --cleanUpPending dalam perintah. Dengan cara ini, sistem secara otomatis membersihkan file residu setelah tugas selesai. Sebagai alternatif, Anda juga dapat membersihkan file di konsol OSS.
Contoh:
jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --cleanUpPending --parallelism 20