全部产品
Search
文档中心

MaxCompute:Menggabungkan file kecil

更新时间:Sep 16, 2025

Sistem file terdistribusi menyimpan data berdasarkan blok. File dengan ukuran kurang dari 64 MB disebut sebagai file kecil. Dalam banyak kasus, file kecil dihasilkan dalam sistem file terdistribusi, seperti hasil komputasi pernyataan SQL, hasil komputasi mesin terdistribusi, atau data yang dikumpulkan menggunakan perintah Tunnel. Anda dapat menggabungkan file kecil untuk mengoptimalkan kinerja sistem. Topik ini menjelaskan cara menggabungkan file kecil di MaxCompute.

Informasi latar belakang

Jika terlalu banyak file kecil, masalah berikut dapat terjadi:

  • Kinerja pemrosesan secara keseluruhan menurun karena efisiensi pemrosesan MaxCompute pada satu file besar lebih tinggi dibandingkan dengan beberapa file kecil.

  • Terlalu banyak file kecil meningkatkan beban kerja pada Sistem File Terdistribusi Apsara, memengaruhi penggunaan penyimpanan.

Oleh karena itu, file kecil perlu digabungkan selama komputasi data untuk mengatasi masalah tersebut. Kemampuan pemrosesan MaxCompute pada file kecil ditingkatkan melalui aspek berikut:

  • Setelah pekerjaan selesai, MaxCompute secara otomatis mengalokasikan tugas Fuxi untuk menggabungkan file kecil ketika kondisi tertentu terpenuhi. Dalam hal ini, MergeTask muncul saat MaxCompute menggabungkan file kecil.

  • Secara default, satu instance Fuxi dapat memproses hingga 100 file kecil. Anda juga dapat mengonfigurasi parameter odps.sql.mapper.merge.limit.size untuk mengelola total ukuran file yang dapat dibaca.

  • MaxCompute secara berkala memindai metadatabase. Selama proses pemindaian, MaxCompute menggabungkan file kecil dalam tabel atau partisi yang berisi sejumlah besar file kecil. Proses ini terlihat oleh pengguna.

Jika metadata menunjukkan bahwa sejumlah besar file kecil belum digabungkan, Anda harus menggabungkan file tersebut secara manual. Sebagai contoh, jika data terus ditulis ke tabel yang berisi sejumlah besar file kecil dan file kecil tersebut tidak dapat digabungkan secara otomatis, Anda harus menghentikan pekerjaan penulisan dan menggabungkan file kecil secara manual.

Peringatan

  • Sumber daya komputasi digunakan untuk menggabungkan file kecil. Jika Anda menggunakan instans bayar sesuai pemakaian, biaya akan dikenakan. Aturan penagihan konsisten dengan aturan penagihan bayar sesuai pemakaian untuk pernyataan SQL. Untuk informasi lebih lanjut, lihat Pricing Komputasi (bayar sesuai pemakaian).

  • Perintah yang digunakan untuk menggabungkan file kecil tidak mendukung tabel transaksional. Untuk informasi lebih lanjut tentang cara menggabungkan file kecil ke dalam tabel transaksional, lihat COMPACTION.

Lihat jumlah file dalam tabel

  • Sintaksis

    Anda dapat menjalankan perintah berikut untuk melihat jumlah file dalam tabel:

    desc extended <table_name> [partition (<pt_spec>)];
  • Parameter

    • table_name: wajib. Nama tabel yang file-nya ingin Anda lihat.

    • pt_spec: opsional. Partisi dalam tabel terpartisi yang ingin Anda lihat. Nilai parameter ini dalam format (partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...).

  • Hasil Sampel

    Gambar berikut menunjukkan hasil sampel. Partisi sampel dari tabel odl_bpm_wfc_task_log berisi 3.607 file. Ukuran partisi adalah 274 MB (287.869.658 byte). Ukuran rata-rata file adalah sekitar 0,07 MB. Dalam hal ini, file kecil perlu digabungkan.

    结果示例

Solusi

Jika metadata menunjukkan bahwa partisi berisi lebih dari 100 file dan ukuran rata-rata file kurang dari 64 MB, Anda dapat menggunakan salah satu metode berikut untuk menggabungkan file kecil:

  • Menggabungkan File Kecil Menggunakan Perintah

    Jalankan perintah berikut untuk menggabungkan file kecil:

    ALTER TABLE <table_name> [partition (<pt_spec>)] MERGE SMALLFILES;

    Setelah file kecil dalam tabel odl_bpm_wfc_task_log digabungkan, jumlah file berkurang menjadi 19 dan ukuran data yang disimpan berkurang menjadi 37 MB. Ini secara signifikan meningkatkan efisiensi penyimpanan. Gambar berikut menunjukkan detailnya.即时合并

    Dalam kebanyakan kasus, Anda dapat menggunakan parameter default untuk menggabungkan file kecil. MaxCompute juga menyediakan parameter spesifik untuk memenuhi kebutuhan bisnis Anda. Konfigurasi berikut sering digunakan:

    • set odps.merge.cross.paths=true|false

      Menentukan apakah akan menggabungkan file lintas jalur. Jika ada beberapa partisi dalam tabel, file dalam proses MergeAction yang dihasilkan secara terpisah untuk setiap partisi digabungkan selama proses penggabungan. Jika parameter odps.merge.cross.paths diatur ke true, jumlah jalur tidak berubah, tetapi file kecil di setiap jalur digabungkan secara terpisah.

    • set odps.merge.smallfile.filesize.threshold = 64

      Menentukan ambang batas untuk ukuran file kecil yang dapat digabungkan. Jika ukuran file melebihi ambang batas ini, file tersebut tidak digabungkan dengan file kecil lainnya. Unit: MB. Parameter ini opsional. Jika Anda tidak mengonfigurasi parameter ini, Anda dapat menggunakan variabel global odps_g_merge_filesize_threshold. Nilai default variabel ini adalah 32 dan unitnya adalah MB. Jika Anda mengonfigurasi variabel ini, tentukan nilai yang lebih besar dari 32.

    • set odps.merge.maxmerged.filesize.threshold = 500

      Menentukan ambang batas untuk ukuran file keluaran setelah penggabungan. Jika ukuran file keluaran lebih besar dari ambang batas ini, file keluaran baru dibuat. Unit: MB. Parameter ini opsional. Jika Anda tidak mengonfigurasi parameter ini, Anda dapat mengonfigurasi variabel global odps_g_max_merged_filesize_threshold. Nilai default variabel ini adalah 500 dan unitnya adalah MB. Jika Anda mengonfigurasi variabel ini, tentukan nilai yang lebih besar dari 500.

  • Menggabungkan File Kecil Menggunakan Skrip PyODPS

    Anda dapat menggunakan PyODPS untuk mengirimkan tugas secara asinkron guna menggabungkan file kecil yang dihasilkan oleh tugas pada hari sebelumnya. Contoh skrip:

    import os
    from odps import ODPS
    
    # Setel variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID ke ID AccessKey Anda.
    # Setel variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET ke Rahasia AccessKey Anda.
    # Kami sarankan Anda tidak langsung menggunakan ID AccessKey atau Rahasia AccessKey Anda.
    o = ODPS(
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
        project='your-default-project',
        endpoint='your-end-point',
    )
    
    # Ganti $table_name dengan nama tabel yang diperlukan.
    table_name = $table_name
    t = odps.get_table(table_name)
    
    # Konfigurasikan opsi penggabungan.
    hints = {'odps.merge.maxmerged.filesize.threshold': 256}
    
    #contoh untuk multi partisi
    insts = []
    # iterate_partitions digunakan untuk mencantumkan semua partisi di bawah ds=$datetime. Format partisi mungkin berbeda untuk setiap partisi.
    for partition in t.iterate_partitions(spec="ds=%s" % $datetime):
        instance=odps.run_merge_files(table_name, str(partition), hints=hints)
    		# Klik Waiting Queue di Logview ini untuk menemukan Logview tempat perintah dijalankan.
        print(instance.get_logview_address())
        insts.append(instance)
    
    # Tunggu hasil partisi.
    for inst in insts:
        inst.wait_for_completion()

    Anda harus menginstal PyODPS sebelum menjalankan skrip di atas. Untuk informasi lebih lanjut tentang cara menginstal PyODPS, lihat PyODPS.

Contoh

Sistem stabilitas data menentukan bahwa tabel fisik tbcdm.dwd_tb_log_pv_di berisi sejumlah besar file kecil dan file kecil tersebut perlu digabungkan. Tabel metadata tbcdm.dws_rmd_merge_task_1d menunjukkan bahwa sebagian besar partisi dalam tabel berisi lebih dari 1.000 file, bahkan mencapai lebih dari 7.000 file. Namun, ukuran rata-rata file beberapa partisi bahkan kurang dari 1 MB. Gambar berikut menunjukkan informasi tabel metadata bernama tbcdm.dws_rmd_merge_task_1d. 使用示例Jalankan perintah berikut untuk menggabungkan file kecil:

set odps.merge.cross.paths=true;
set odps.merge.smallfile.filesize.threshold=128;
set odps.merge.max.filenumber.per.instance = 2000;
alter table tbcdm.dwd_tb_log_pv_di partition (ds='20151116') merge smallfiles;

Gambar berikut menunjukkan hasil setelah file kecil digabungkan.优化结果