全部产品
Search
文档中心

E-MapReduce:Optimalkan Pekerjaan Hive

更新时间:Jun 24, 2025

Anda dapat menyesuaikan sumber daya memori dan vCPU serta jumlah tugas untuk mengoptimalkan pekerjaan Hive. Topik ini menjelaskan cara mengoptimalkan pekerjaan Hive.

Solusi Optimasi

Kategori

Solusi Optimasi

Optimalkan kode

Optimalkan kode

Ubah parameter

Optimalkan kode

  • Bersihkan Data

    1. Saat membaca data dari tabel terpartisi, filter data berdasarkan partisi untuk menghindari pemindaian tabel penuh.

    2. Filter data sebelum melakukan operasi JOIN.

    3. Untuk menghindari perhitungan berulang, buat tabel antara untuk menyimpan hasil komputasi sementara yang digunakan berulang kali.

  • Optimalkan Kode dengan Beberapa Operator DISTINCT

    • Kode Sebelum Optimasi

      Penggunaan beberapa operator DISTINCT dapat menyebabkan ekspansi data.

      SELECT k,
             COUNT(DISTINCT CASE WHEN a > 1 THEN user_id END) user1,
             COUNT(DISTINCT CASE WHEN a > 2 THEN user_id END) user2,
             COUNT(DISTINCT CASE WHEN a > 3 THEN user_id END) user3,
             COUNT(DISTINCT CASE WHEN a > 4 THEN user_id END) user4
      FROM t  
      GROUP BY k;
    • Kode Setelah Optimasi

      Gunakan dua klausa GROUP BY untuk menggantikan operator DISTINCT. Gunakan satu klausa GROUP BY dalam query internal untuk menghapus duplikat dan mengurangi jumlah data. Gunakan klausa GROUP BY lainnya dalam query eksternal untuk mendapatkan jumlah.

      SELECT k,
             SUM(CASE WHEN user1 > 0 THEN 1 ELSE 0 END) AS user1,
             SUM(CASE WHEN user2 > 0 THEN 1 ELSE 0 END) AS user2,
             SUM(CASE WHEN user3 > 0 THEN 1 ELSE 0 END) AS user3,
             SUM(CASE WHEN user4 > 0 THEN 1 ELSE 0 END) AS user4
      FROM 
              (SELECT k,
                      user_id,
                      COUNT(CASE WHEN a > 1 THEN user_id END) user1,
                      COUNT(CASE WHEN a > 2 THEN user_id END) user2,
                      COUNT(CASE WHEN a > 3 THEN user_id END) user3,
                      COUNT(CASE WHEN a > 4 THEN user_id END) user4
              FROM t
              GROUP BY k, user_id  
              ) tmp 
      GROUP BY k;
  • Tangani Kemiringan Data dalam Operasi GROUP BY

    Gunakan salah satu metode berikut untuk memproses kunci yang miring:

    • Jika kunci miring muncul dalam operasi GROUP BY, lakukan langkah-langkah berikut:

      1. Aktifkan agregasi pada tahap map: Konfigurasikan parameter Hive untuk mengaktifkan agregasi pada tahap map guna mengurangi jumlah data yang ditransfer ke tahap reduce.

        set hive.map.aggr=true;
        set hive.groupby.mapaggr.checkinterval=100000;  --Jumlah entri data yang di-aggregasi pada tahap map.
      2. Distribusikan kunci secara acak dan agregasikan mereka beberapa kali, atau tentukan langsung reducer.

        set hive.groupby.skewindata=true;

        Jika Anda mengatur hive.groupby.skewindata ke true, rencana kueri yang dihasilkan mencakup dua pekerjaan MapReduce. Pada pekerjaan pertama, hasil keluaran tugas map didistribusikan secara acak ke tugas reduce. Tugas reduce kemudian mengagregasi data dan menghasilkan keluaran. Dengan cara ini, entri data dengan kunci yang sama dalam operasi GROUP BY mungkin didistribusikan ke tugas reduce yang berbeda untuk mencapai keseimbangan beban. Pada pekerjaan kedua, hasil pra-pemrosesan didistribusikan ke tugas reduce berdasarkan kunci, sehingga entri data dengan kunci yang sama dalam operasi GROUP BY didistribusikan ke tugas reduce yang sama, lalu hasil agregasi akhir dihasilkan.

    • Jika kunci miring muncul saat menggabungkan dua tabel besar, randomize kunci miring tersebut.

      Sebagai contoh, tabel bernama log dan bmw_users digabungkan. Tabel log berisi sejumlah besar nilai null di kolom user_id, sedangkan tabel bmw_users tidak memiliki nilai null di kolom user_id. Dalam kasus ini, Anda dapat merandomize nilai null sebelum mengasosiasikan nilai-nilai tersebut. Dengan cara ini, nilai null didistribusikan ke tugas reduce yang berbeda. Contoh:

      SELECT * FROM log a LEFT OUTER 
      JOIN bmw_users b ON 
      CASE WHEN a.user_id IS NULL THEN CONCAT('dp_hive',RAND()) ELSE a.user_id=b.user_id END;
    • Jika kunci miring muncul dalam operasi GROUP BY saat menggabungkan tabel kecil dan tabel besar, gunakan MAP JOIN.

Ubah parameter memori

Anda dapat mengubah parameter yang dijelaskan dalam tabel berikut untuk mengoptimalkan sumber daya memori pada tahap map dan reduce.

  • Tahap Map

    Parameter

    Deskripsi

    Contoh

    mapreduce.map.java.opts

    Wajib. Memori heap Java Virtual Machine (JVM).

    -Xmx2048m

    mapreduce.map.memory.mb

    Wajib. Ruang memori yang ditempati oleh proses JVM. Anda dapat menggunakan rumus berikut untuk menghitung nilainya: Memori heap + Memori non-heap. Contoh: 2048 + 256.

    2304

  • Tahap Reduce

    Parameter

    Deskripsi

    Contoh

    mapreduce.reduce.java.opts

    Wajib. Memori heap JVM.

    -Xmx2048m

    mapreduce.reduce.memory.mb

    Wajib. Ruang memori yang ditempati oleh proses JVM. Anda dapat menggunakan rumus berikut untuk menghitung nilainya: Memori heap + Memori non-heap. Contoh: 2048 + 256.

    2304

Ubah parameter vCPU

Anda dapat mengubah parameter yang dijelaskan dalam tabel berikut untuk mengoptimalkan sumber daya vCPU pada tahap map dan reduce.

Parameter

Deskripsi

mapreduce.map.cpu.vcores

Jumlah maksimum vCPU yang dapat digunakan dalam setiap tugas map.

mapreduce.reduce.cpu.vcores

Jumlah maksimum vCPU yang dapat digunakan dalam setiap tugas reduce.

null

Parameter ini tidak berlaku dalam skenario antrian adil. Dalam kebanyakan kasus, parameter ini digunakan untuk membatasi jumlah vCPU yang dapat digunakan pengguna atau aplikasi dalam kluster besar.

Sesuaikan jumlah tugas

  • Sesuaikan Jumlah Tugas Map

    Dalam sistem komputasi terdistribusi, jumlah blok data dalam data mentah adalah salah satu faktor yang menentukan jumlah tugas map. Dalam kebanyakan kasus, setiap tugas map membaca satu blok data. Namun, penyesuaian manual diperlukan dalam beberapa skenario. Jika ada banyak file kecil, Anda dapat mengurangi jumlah tugas map untuk meningkatkan pemanfaatan sumber daya. Jika jumlah file sedikit tetapi ukuran setiap file besar, Anda dapat meningkatkan jumlah tugas map untuk mengurangi beban kerja setiap tugas map.

    Parameter yang menentukan jumlah tugas map meliputi mapred.map.tasks, mapred.min.split.size, dan dfs.block.size.

    1. Sebagian besar file Hive disimpan di HDFS, dan semua file di HDFS disimpan sebagai blok data. Oleh karena itu, jumlah blok data tempat file Hive dibagi mungkin setara dengan jumlah default tugas map awal untuk file Hive. Parameter default_mapper_num menentukan jumlah default tugas map awal. Ukuran total data dibagi dengan ukuran maksimum default setiap blok data di HDFS sama dengan nilai parameter default_mapper_num.

      Rumus:

      default_mapper_num = total_size/dfs.block.size
    2. Sistem menghitung ukuran split default berdasarkan rumus berikut:

      default_split_size = max(mapred.min.split.size, min(mapred.max.split.size, dfs.block.size))

      Dalam rumus di atas, mapred.min.split.size menentukan ukuran split minimum dalam pekerjaan Hive, dan mapred.max.split.size menentukan ukuran split maksimum dalam pekerjaan Hive.

    3. Sistem membagi data menjadi blok data berdasarkan rumus berikut:

      split_num = total_size/default_split_size;
    4. Sistem menghitung jumlah tugas map berdasarkan rumus berikut:

      map_task_num = min(split_num, max(mapred.map.tasks, default_mapper_num))

      Dalam proses perhitungan kompleks ini, berbagai faktor digunakan untuk memastikan bahwa jumlah tugas map tidak terlalu besar atau terlalu kecil. Jika Anda ingin meningkatkan jumlah tugas map, Anda dapat mengurangi nilai mapred.min.split.size. Dengan cara ini, nilai default_split_size dikurangi, yang lebih lanjut menyebabkan nilai split_num meningkat. Anda juga dapat meningkatkan nilai mapred.map.tasks.

      null

      Pekerjaan Hive on Tez dan Hive on MapReduce memiliki mekanisme komputasi yang berbeda. Misalnya, jika Anda menggunakan pekerjaan Hive on Tez dan pekerjaan Hive on MapReduce untuk menjalankan kueri yang sama pada data yang sama, jumlah tugas map yang dihasilkan oleh pekerjaan tersebut sangat berbeda. Alasan utamanya adalah Tez menggabungkan input split menjadi grup dan menghasilkan satu tugas map untuk setiap grup alih-alih setiap input split.

  • Sesuaikan Jumlah Tugas Reduce

    • Gunakan parameter hive.exec.reducers.bytes.per.reducer untuk menentukan jumlah byte yang diproses oleh setiap tugas reduce.

      Sistem menghitung jumlah tugas reduce berdasarkan rumus berikut:

      reducer_num = min(total_size/hive.exec.reducers.bytes.per.reducers, hive.exec.reducers.max)

    • Gunakan parameter mapred.reduce.tasks untuk menentukan jumlah tugas reduce.

      null

      Jika Anda menggunakan mesin Tez, Anda dapat menjalankan perintah set hive.tez.auto.reducer.parallelism = true; untuk mengaktifkan paralelisme reducer otomatis. Dengan cara ini, Tez secara dinamis menyesuaikan jumlah tugas reduce berdasarkan ukuran output verteks.

      Operasi untuk memulai dan menginisialisasi tugas reduce memerlukan waktu dan sumber daya, seperti halnya operasi untuk memulai dan menginisialisasi tugas map. Selain itu, setiap tugas reduce menghasilkan satu file keluaran. Jika sejumlah besar file kecil dihasilkan dan digunakan sebagai input tugas lain, lebih banyak file kecil akan dihasilkan.

Jalankan tugas di berbagai tahap secara paralel

Anda dapat menjalankan tugas di berbagai tahap pekerjaan secara paralel. Hive menerjemahkan kueri menjadi satu atau lebih tahap. Sebuah pekerjaan mungkin berisi beberapa tahap, dan tahap-tahap tersebut mungkin independen satu sama lain. Jika tugas independen di berbagai tahap dijalankan secara paralel, waktu keseluruhan yang digunakan untuk menjalankan pekerjaan berkurang.

Anda dapat mengonfigurasi parameter yang dijelaskan dalam tabel berikut untuk mengaktifkan pelaksanaan tugas secara paralel dan menentukan jumlah maksimum tugas yang dapat berjalan secara paralel.

Parameter

Deskripsi

hive.exec.parallel

Nilai default: false. Jika Anda mengatur parameter hive.exec.parallel ke true, tugas independen di berbagai tahap dapat berjalan secara paralel.

hive.exec.parallel.thread.number

Nilai default: 8. Jumlah maksimum thread yang dapat berjalan secara paralel.

Ambil tugas

Anda dapat mengonfigurasi parameter hive.fetch.task.conversion untuk mengonversi kueri Hive menjadi tugas fetch. Ini membantu mencegah overhead memulai program MapReduce dan mengurangi waktu eksekusi pernyataan.

Parameter

Deskripsi

hive.fetch.task.conversion

Nilai default: none. Nilai valid:

  • none: Tidak ada kueri yang dikonversi menjadi tugas fetch.

    Program MapReduce dijalankan saat Anda mengeksekusi pernyataan.

  • minimal: Tugas fetch hanya dapat digunakan dalam pernyataan SELECT, FILTER, dan LIMIT.

  • more: Nilai ini lebih kuat daripada minimal. Jika Anda menggunakan nilai ini, tugas fetch juga dapat digunakan dalam SELECT untuk kolom tertentu dan FILTER pada kolom kunci non-partisi. Kolom virtual (alias) juga didukung.

Aktifkan eksekusi kueri vektorisasi

Anda dapat mengonfigurasi parameter yang dijelaskan dalam tabel berikut untuk mengaktifkan eksekusi kueri vektorisasi. Ini membantu meningkatkan kinerja kueri.

Parameter

Deskripsi

hive.vectorized.execution.enabled

Nilai default: true. Nilai true menunjukkan bahwa eksekusi kueri vektorisasi diaktifkan.

hive.vectorized.execution.reduce.enabled

Nilai default: true. Nilai true menunjukkan bahwa eksekusi kueri vektorisasi diaktifkan untuk tugas reduce.

Gabungkan file kecil

Jika sejumlah besar file kecil dihasilkan, kinerja penyimpanan file dan efisiensi pemrosesan data terpengaruh. Anda dapat menggabungkan file keluaran tugas map dan reduce untuk mengurangi jumlah file kecil.

Anda dapat mengonfigurasi parameter yang dijelaskan dalam tabel berikut untuk menggabungkan file kecil.

Parameter

Deskripsi

hive.merge.mapfiles

Nilai default: true. Menentukan apakah akan menggabungkan file keluaran tugas map.

hive.merge.mapredfiles

Nilai default: false. Menentukan apakah akan menggabungkan file keluaran tugas reduce.

hive.merge.size.per.task

Nilai default: 256000000. Unit: byte. Ukuran file tempat file kecil digabungkan.

Contoh Konfigurasi

SET hive.merge.mapfiles = true;
SET hive.merge.mapredfiles = true;
SET hive.merge.size.per.task = 536870912; -- 512 MB