全部产品
Search
文档中心

E-MapReduce:Menggunakan Jindo DistCp

更新时间:Jun 24, 2025

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

  1. Masuk ke node master dari kluster EMR dalam mode SSH.

    Untuk informasi lebih lanjut, lihat Masuk ke sebuah kluster.

  2. Jalankan perintah berikut untuk mendapatkan informasi bantuan:

    jindo distcp --help

    Informasi 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

--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>/tmp
null

yourBucketName 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/03

Informasi 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.txt

Jalankan perintah berikut untuk menyalin file log:

jindo distcp --src /data/incoming/hourly_table --dest oss://<yourBucketName>/hourly_table --srcPattern .*\.log --parallelism 20

Jalankan perintah berikut untuk melihat file di Bucket OSS tujuan:

hdfs dfs -ls oss://<yourBucketName>/hourly_table/2017-02-01/03

Informasi 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 20

Jalankan perintah berikut untuk melihat file di direktori tujuan:

hdfs dfs -ls oss://<yourBucketName>/hourly_table/2017-02-01/03

Informasi 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.gz

Anda 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.

null

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 20

Jalankan 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 20

Jalankan 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_table

Informasi 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-02

Jalankan 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 20

Jalankan 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/03

Informasi 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.txt

Jalankan 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 20

Jalankan 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 20
null

Anda 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 20
null

Anda 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 --diff

Jika semua file disalin, informasi berikut dikembalikan:

INFO distcp.JindoDistCp: distcp telah selesai sepenuhnya

Jika 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 20
null

Jika 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=0
null

Jika 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 20

yourAccessKeyId 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 20
  • Contoh 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