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 | |
Ubah parameter |
Optimalkan kode
Bersihkan Data
Saat membaca data dari tabel terpartisi, filter data berdasarkan partisi untuk menghindari pemindaian tabel penuh.
Filter data sebelum melakukan operasi JOIN.
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:
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.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.
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.sizeSistem 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.
Sistem membagi data menjadi blok data berdasarkan rumus berikut:
split_num = total_size/default_split_size;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.
nullPekerjaan 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.
nullJika 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:
|
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