All Products
Search
Document Center

MaxCompute:Gabungkan file kecil

Last Updated:Sep 02, 2026

Sistem file terdistribusi menyimpan data dalam blok. File dengan ukuran lebih kecil dari blok 64 MB dianggap sebagai file kecil. Sistem terdistribusi tak terhindarkan menghasilkan file kecil dari berbagai sumber, seperti output pekerjaan SQL, mesin terdistribusi lainnya, atau data yang dikumpulkan melalui Tunnel. Menggabungkan file-file kecil ini mengoptimalkan kinerja sistem. Topik ini menjelaskan cara menggabungkan file kecil di MaxCompute.

Informasi latar belakang

Jumlah file kecil yang berlebihan dapat menyebabkan masalah berikut:

  • MaxCompute memproses satu file besar lebih efisien dibandingkan banyak file kecil. Jumlah file kecil yang berlebihan dapat menurunkan kinerja eksekusi secara keseluruhan.

  • Terlalu banyak file kecil dapat memberi beban pada sistem file Pangu dan mengurangi efisiensi penyimpanan.

Oleh karena itu, penting untuk menggabungkan file kecil yang dihasilkan selama komputasi guna mengoptimalkan penyimpanan dan kinerja. MaxCompute menyediakan beberapa fitur andal untuk menangani file kecil:

  • Secara default, setelah pekerjaan selesai, sistem secara otomatis menugaskan task Fuxi untuk menggabungkan file kecil jika kondisi tertentu terpenuhi. Proses ini dikenal sebagai MergeTask.

  • Secara default, satu instans Fuxi dapat memproses hingga 100 file kecil. Parameter odps.sql.mapper.merge.limit.size mengontrol ukuran total file yang akan dibaca.

  • MaxCompute secara berkala melakukan pemindaian terhadap metadatabase di latar belakang dan menggabungkan file kecil untuk tabel atau partisi yang berisi banyak file tersebut. Proses ini transparan bagi pengguna.

Namun demikian, penemuan metadata mungkin tetap menunjukkan banyak file kecil yang belum digabung. Misalnya, jika sebuah tabel terus-menerus ditulis, operasi penggabungan otomatis tidak dapat dijalankan. Dalam kasus ini, Anda harus menghentikan terlebih dahulu pekerjaan penulisan, lalu menggabungkan file kecil tersebut secara manual.

Perhatian

  • Menggabungkan file kecil mengonsumsi sumber daya komputasi. Jika instans Anda menggunakan metode penagihan pay-as-you-go, Anda akan dikenai biaya untuk operasi ini. Aturan penagihan sama dengan aturan untuk pekerjaan SQL pay-as-you-go. Untuk informasi selengkapnya, lihat Compute pricing (pay-as-you-go).

  • Perintah untuk menggabungkan file kecil tidak mendukung tabel transaksional. Untuk menggabungkan file kecil dalam tabel transaksional, lihat COMPACTION.

Periksa jumlah file dalam tabel

  • Sintaks

    DESC EXTENDED <table_name> [PARTITION (<pt_spec>)];
  • Parameter

    • table_name

      Wajib diisi. Nama tabel yang akan diperiksa.

    • pt_spec

      Opsional. Partisi yang akan diperiksa. Formatnya adalah (partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...).

  • Contoh

    Sebuah partisi contoh dari tabel odl_bpm_wfc_task_log memiliki 3.607 file. Ukuran partisi tersebut adalah 274 MB (287.869.658 byte), dan ukuran rata-rata file sekitar 0,07 MB. File kecil dalam partisi ini perlu digabungkan.

    odps@ admin_task_project>desc extended jxbwarehouse.odl_bpm_wfc_task_log partition(new_dts_sync_modifytime_year='2022',new_dts_sync_modifytime_month='11',new_dts_sync_modifytime_day='27');
    +--------------------------------------------------------------------------------------------+
    | PartitionSize: 287869658                                                                   |
    +--------------------------------------------------------------------------------------------+
    | CreateTime:               2022-11-27 00:00:46                                              |
    | LastDDLTime:              2022-11-27 00:00:46                                              |
    | LastModifiedTime:         2022-11-27 23:59:47                                              |
    +--------------------------------------------------------------------------------------------+
    | IsExstore:                false                                                            |
    | IsArchived:               false                                                            |
    | PhysicalSize:             863608974                                                        |
    | FileNum:                  3607                                                             |
    +--------------------------------------------------------------------------------------------+

Solusi

Deteksi metadata dapat mengidentifikasi partisi yang cocok untuk penggabungan file. Penggabungan direkomendasikan jika suatu partisi berisi lebih dari 100 file dan ukuran rata-rata file kurang dari 64 MB. Tersedia dua solusi.

  • Penggabungan langsung

    Anda dapat menggunakan perintah berikut untuk melakukan penggabungan langsung.

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

    Setelah menjalankan operasi penggabungan langsung pada tabel odl_bpm_wfc_task_log, jumlah file berkurang menjadi 19 dan ukuran penyimpanan berkurang menjadi 37 MB. Hal ini menunjukkan bahwa penggabungan file kecil juga secara signifikan meningkatkan efisiensi penyimpanan.

    Dalam kebanyakan kasus, parameter default sudah cukup untuk menggabungkan file kecil. Namun, MaxCompute menyediakan beberapa parameter untuk memenuhi kebutuhan kustom. Berikut adalah parameter umum:

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

      Menentukan apakah akan menggabungkan file lintas path. Jika sebuah tabel memiliki banyak partisi, proses penggabungan akan menghasilkan MergeAction terpisah untuk setiap partisi. Oleh karena itu, mengatur odps.merge.cross.paths menjadi true tidak mengubah jumlah path. Parameter ini hanya menggabungkan file kecil dalam setiap path secara terpisah.

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

      Menentukan ambang batas ukuran file kecil yang akan digabungkan, dalam satuan MB. File yang lebih besar dari ambang batas ini tidak akan digabungkan. Anda tidak perlu mengatur parameter ini. Jika tidak diatur, variabel global odps_g_merge_filesize_threshold akan digunakan, yang memiliki nilai default 32 MB. Jika Anda mengatur parameter ini, nilainya harus lebih besar dari 32 MB.

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

      Menentukan ukuran file output setelah penggabungan, dalam satuan MB. Jika file output melebihi ambang batas ini, file output baru akan dibuat. Anda tidak perlu mengatur parameter ini. Jika tidak diatur, variabel global odps_g_max_merged_filesize_threshold akan digunakan, yang memiliki nilai default 500 MB. Jika Anda mengatur parameter ini, nilainya harus lebih besar dari 500 MB.

  • Penggabungan menggunakan skrip PyODPS

    Anda dapat menggunakan PyODPS untuk mengirimkan task secara asinkron guna menggabungkan file kecil yang dihasilkan oleh pekerjaan hari sebelumnya. Kode berikut merupakan contoh skrip:

    import os
    from odps import ODPS
    
    # Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID diatur ke Access Key ID Anda.
    # Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET diatur ke Access Key Secret Anda.
    # Jangan gunakan string Access Key ID dan Access Key Secret secara langsung.
    o = ODPS(
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
        project='your-default-project',
        endpoint='your-end-point',
    )
    
    # Catatan: Ganti $table_name dengan nama tabel Anda.
    table_name = $table_name
    t = o.get_table(table_name)
    
    # Atur opsi penggabungan.
    hints = {'odps.merge.maxmerged.filesize.threshold': 256}
    
    # Contoh untuk beberapa partisi
    insts = []
    # iterate_partitions mencantumkan semua partisi di bawah ds=$datetime. Format partisi dapat bervariasi.
    for partition in t.iterate_partitions(spec="ds=%s" % $datetime):
        instance=o.run_merge_files(table_name, str(partition), hints=hints)
    		# Klik Waiting Queue di Logview ini untuk menemukan Logview eksekusi sebenarnya.
        print(instance.get_logview_address())
        insts.append(instance)
    
    # Tunggu hasil partisi.
    for inst in insts:
        inst.wait_for_completion()

    Untuk menjalankan skrip ini, Anda harus menginstal PyODPS terlebih dahulu. Untuk petunjuk instalasi, lihat PyODPS.

Kasus penggunaan

tbcdm.dwd_tb_log_pv_di adalah tabel fisik yang diidentifikasi oleh sistem stabilitas data sebagai memerlukan penggabungan file kecil. Menurut tabel metadata tbcdm.dws_rmd_merge_task_1d, sebagian besar partisi tabel ini berisi lebih dari 1.000 file — beberapa bahkan melebihi 7.000 — namun ukuran rata-rata file kurang dari 1 MB.

Anda dapat menggunakan perintah berikut untuk menggabungkan file kecil menggunakan solusi penggabungan langsung.

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;