Topik ini menjelaskan cara memperbaiki masalah yang terkait dengan pekerjaan Hive.
Menemukan pengecualian
Jika terjadi pengecualian, seperti pengecualian kinerja saat menjalankan pekerjaan di klien Hive, Anda dapat mengikuti langkah-langkah berikut untuk menemukan pengecualian:
Periksa log klien Hive.
Log pekerjaan yang dikirimkan menggunakan Hive CLI disimpan di direktori /tmp/hive/$USER/hive.log atau /tmp/$USER/hive.log pada kluster atau node gateway.
Log pekerjaan yang dikirimkan menggunakan Hive Beeline atau Java Database Connectivity (JDBC) disimpan di direktori tempat log HiveServer disimpan. Dalam banyak kasus, direktori tersebut adalah /var/log/emr/hive atau /mnt/disk1/log/hive.
Periksa log aplikasi YARN yang dikirimkan oleh pekerjaan Hive. Anda dapat menjalankan perintah yarn untuk mendapatkan log.
yarn logs -applicationId application_xxx_xxx -appOwner userName
Masalah terkait memori
Kesalahan kehabisan memori (OOM) terjadi karena memori kontainer tidak mencukupi
Pesan kesalahan: java.lang.OutOfMemoryError: GC overhead limit exceeded atau java.lang.OutOfMemoryError: Java heap space
Solusi: Tingkatkan memori kontainer. Untuk pekerjaan Hive yang berjalan pada MapReduce (MR), Anda juga perlu meningkatkan memori heap Java Virtual Machine (JVM).
Pekerjaan Hive yang berjalan pada MR: Pada tab Configure halaman layanan YARN, klik tab mapred-site.xml dan tingkatkan nilai parameter memori mapper dan reducer berikut.
mapreduce.map.memory.mb=4096 mapreduce.reduce.memory.mb=4096Anda juga perlu mengubah nilai JVM
-Xmxdari parameter mapreduce.map.java.opts dan mapreduce.reduce.java.opts menjadi 80% dari nilai yang ditentukan untuk parameter mapreduce.map.memory.mb dan mapreduce.reduce.memory.mb, masing-masing.mapreduce.map.java.opts=-Xmx3276m (Pertahankan nilai opsi lainnya untuk parameter.) mapreduce.reduce.java.opts=-Xmx3276m (Pertahankan nilai opsi lainnya untuk parameter.)Pekerjaan Hive yang berjalan pada Tez
Jika memori kontainer Tez tidak mencukupi, klik tab hive-site.xml pada tab Configure halaman layanan Hive dan tingkatkan nilai parameter hive.tez.container.size.
hive.tez.container.size=4096Jika memori Tez AppMaster tidak mencukupi, klik tab tez-site.xml pada tab Configure halaman layanan Tez dan tingkatkan nilai parameter tez.am.resource.memory.mb.
tez.am.resource.memory.mb=4096
Pekerjaan Hive yang berjalan pada Spark: Pada tab Configure halaman layanan Spark, klik tab
spark-defaults.confdan tingkatkan nilai parameter spark.executor.memory.spark.executor.memory=4g
Kontainer dibunuh oleh YARN karena penggunaan memori berlebihan
Pesan kesalahan: Container killed by YARN for exceeding memory limits
Penyebab: Memori yang digunakan oleh tugas Hive melebihi memori yang diminta pekerjaan dari YARN. Memori ini mencakup memori heap JVM, memori off-heap JVM, dan memori yang digunakan oleh proses anak. Sebagai contoh, jika ukuran heap proses JVM Tugas Map dari pekerjaan Hive yang berjalan pada MR adalah 4 GB (mapreduce.map.java.opts=-Xmx4g), dan memori yang diminta pekerjaan dari YARN adalah 3 GB (mapreduce.map.memory.mb=3072), kontainer akan dibunuh oleh YARN NodeManager.
Solusi:
Untuk pekerjaan Hive yang berjalan pada MR, tingkatkan nilai parameter mapreduce.map.memory.mb dan mapreduce.reduce.memory.mb. Pastikan nilai parameter setidaknya 1,25 kali nilai JVM
-Xmxdari parameter mapreduce.map.java.opts dan mapreduce.reduce.java.opts.Untuk pekerjaan Hive yang berjalan pada Spark, tingkatkan nilai parameter spark.executor.memoryOverhead. Pastikan nilai parameter setidaknya 25% dari nilai parameter spark.executor.memory.
Kesalahan OOM terjadi karena ukuran buffer sortir terlalu besar
Pesan kesalahan:
Error running child: java.lang.OutOfMemoryError: Java heap space at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.init(MapTask.java:986)Penyebab: Ukuran buffer sortir melebihi ukuran memori yang dialokasikan oleh tugas Hive ke kontainer. Sebagai contoh, ukuran memori untuk kontainer adalah 1300 MB, tetapi ukuran buffer sortir adalah 1024 MB.
Solusi: Tingkatkan ukuran memori kontainer atau kurangi ukuran buffer sortir.
tez.runtime.io.sort.mb (Hive on Tez) mapreduce.task.io.sort.mb (Hive on MR)
Kesalahan OOM terjadi karena pernyataan GroupBy
Pesan kesalahan:
22/11/28 08:24:43 ERROR Executor: Exception in task 1.0 in stage 0.0 (TID 0) java.lang.OutOfMemoryError: GC overhead limit exceeded at org.apache.hadoop.hive.ql.exec.GroupByOperator.updateAggregations(GroupByOperator.java:611) at org.apache.hadoop.hive.ql.exec.GroupByOperator.processHashAggr(GroupByOperator.java:813) at org.apache.hadoop.hive.ql.exec.GroupByOperator.processKey(GroupByOperator.java:719) at org.apache.hadoop.hive.ql.exec.GroupByOperator.process(GroupByOperator.java:787) at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:897) at org.apache.hadoop.hive.ql.exec.SelectOperator.process(SelectOperator.java:95) at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:897) at org.apache.hadoop.hive.ql.exec.TableScanOperator.process(TableScanOperator.java:130) at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:148) at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:547)Penyebab: Tabel hash yang dihasilkan oleh pernyataan GroupBy menggunakan memori berlebihan.
Solusi:
Kurangi ukuran split menjadi 128 MB, 64 MB, atau kurang, atau tingkatkan konkurensi pekerjaan. Sebagai contoh, Anda dapat menetapkan parameter
mapreduce.input.fileinputformat.split.maxsizemenjadi134217728atau 67108864.Tingkatkan konkurensi mapper dan reducer.
Tingkatkan memori kontainer. Untuk informasi lebih lanjut, lihat Kesalahan Kehabisan Memori (OOM) Terjadi karena Memori Kontainer Tidak Mencukupi.
Kesalahan OOM terjadi saat membaca file Snappy
Penyebab: Format file Snappy standar yang ditulis oleh layanan seperti Log Service berbeda dengan format file Snappy Hadoop. Secara default, EMR memproses file Snappy Hadoop. Akibatnya, kesalahan OOM dilaporkan ketika EMR memproses file Snappy standar.
Solusi: Konfigurasikan parameter berikut untuk pekerjaan Hive:
set io.compression.codec.snappy.native=true;
Kesalahan terkait metadata
Operasi untuk menghapus tabel partisi besar timeout
Pesan kesalahan:
FAILED: Execution ERROR, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.thrift.transport.TTransportException: java.net.SocketTimeoutException: Read timeoutPenyebab: Tabel partisi berisi jumlah partisi yang berlebihan. Akibatnya, operasi penghapusan memerlukan waktu lama, dan jaringan timeout ketika klien Hive mengakses layanan Metastore.
Solusi:
Pada tab Configure halaman layanan Hive di konsol EMR, klik tab hive-site.xml dan tingkatkan periode timeout untuk klien Hive mengakses layanan Metastore.
hive.metastore.client.socket.timeout=1200sHapus beberapa partisi secara batch. Sebagai contoh, Anda dapat menjalankan pernyataan berulang kali untuk menghapus partisi yang memenuhi kondisi tertentu.
alter table [NamaTabel] DROP IF EXISTS PARTITION (ds<='20220720')
Pekerjaan gagal saat pernyataan insert overwrite dieksekusi untuk menyisipkan data ke partisi dinamis
Pesan kesalahan: Saat pernyataan
insert overwritedieksekusi dalam pekerjaan untuk menyisipkan data ke partisi dinamis, atau pekerjaan serupa yang berisi pernyataaninsert overwritedijalankan, kesalahan "Exception when loading xxx in table" terjadi. Pesan kesalahan berikut muncul dalam log HiveServer:Error in query: org.apache.hadoop.hive.ql.metadata.HiveException: Directory oss://xxxx could not be cleaned up.;Penyebab: Metadata tidak konsisten dengan data. Metadata berisi informasi tentang partisi, tetapi direktori partisi tidak dapat ditemukan dalam sistem penyimpanan data. Akibatnya, kesalahan terjadi saat operasi pembersihan dilakukan.
Solusi: Perbaiki masalah metadata dan jalankan pekerjaan lagi.
Kesalahan "java.lang.IllegalArgumentException: java.net.UnknownHostException: emr-header-1.xxx" terjadi saat pekerjaan Hive membaca atau menghapus tabel
Penyebab: Jika kluster EMR menggunakan Data Lake Formation (DLF) atau metadatabase terpadu (didukung di konsol EMR lama) sebagai backend penyimpanan, jalur awal database yang Anda buat adalah jalur HDFS kluster EMR. Contoh:
hdfs://master-1-1.xxx:9000/user/hive/warehouse/test.dbatauhdfs://emr-header-1.cluster-xxx:9000/user/hive/warehouse/test.db. Dalam hal ini, tabel Hive yang Anda buat dalam database juga disimpan di jalur HDFS. Contoh:hdfs://master-1-1.xxx:9000/user/hive/warehouse/test.db/test_tbl. Jika Anda menggunakan Hive di kluster di konsol EMR baru untuk membaca data dari atau menulis data ke tabel atau database Hive yang dibuat oleh kluster di konsol EMR lama, kluster baru mungkin gagal terhubung ke kluster lama. Selain itu, jika kluster lama dilepaskan, kesalahan "java.net.UnknownHostException" dikembalikan.Solusi:
Solusi 1: Jika data dalam tabel Hive kluster EMR lama adalah data sementara atau data uji, ubah jalur tabel Hive ke jalur Object Storage Service (OSS) dan jalankan perintah drop table atau drop database lagi untuk menghapus tabel atau database Hive.
-- Hive SQL alter table test_tbl set location 'oss://bucket/not/exists' drop table test_tbl; alter table test_pt_tbl partition (pt=xxx) set location 'oss://bucket/not/exists'; alter table test_pt_tbl drop partition pt=xxx); alter database test_db set location 'oss://bucket/not/exists' drop datatabase test_dbSolusi 2: Jika data dalam tabel Hive kluster EMR lama valid tetapi tidak dapat diakses dari kluster baru, data disimpan di HDFS. Dalam hal ini, migrasikan data ke OSS dan buat tabel.
hadoop fs -cp hdfs://emr-header-1.xxx/old/path oss://bucket/new/path hive -e "create table new_tbl like old_tbl location 'oss://bucket/new/path'"
Masalah terkait UDF Hive dan paket pihak ketiga
Konflik terjadi karena paket pihak ketiga yang ditempatkan di direktori lib Hive
Penyebab: Paket pihak ketiga Hive ditempatkan di direktori $HIVE_HOME/lib, atau paket JAR Hive asli diganti.
Solusi: Jika paket pihak ketiga Hive ditempatkan di direktori $HIVE_HOME/lib, hapus paket pihak ketiga dari direktori tersebut. Jika paket JAR Hive asli diganti, tempatkan kembali paket JAR Hive asli ke direktori tersebut.
Hive gagal menggunakan fungsi reflect
Penyebab: Otentikasi Ranger diaktifkan.
Solusi: Hapus fungsi reflect dari daftar hitam yang dikonfigurasikan dalam file
hive-site.xml.hive.server2.builtin.udf.blacklist=empty_blacklist
Pekerjaan berjalan lambat karena UDF kustom
Penyebab: Jika pekerjaan berjalan lambat tetapi tidak ada log kesalahan yang dikembalikan, masalah tersebut mungkin disebabkan oleh kinerja rendah UDF kustom Hive.
Solusi: Identifikasi masalah kinerja menggunakan thread dump dari tugas Hive dan optimalkan UDF kustom Hive.
Pengecualian terjadi saat Hive mengurai fungsi grouping()
Gejala: Saat fungsi
grouping()digunakan dalam pernyataan SQL, pesan kesalahan berikut dilaporkan:grouping() requires at least 2 argument, got 1Pesan kesalahan menunjukkan bahwa pengecualian terjadi dalam penguraian argumen fungsi
grouping().Penyebab: Masalah ini disebabkan oleh bug terkenal dalam Hive open source. Penguraian fungsi
grouping()di Hive bersifat case-sensitive. Jika Anda menggunakangrouping()alih-alihGROUPING(), Hive mungkin gagal mengenali fungsi, mengakibatkan kesalahan penguraian argumen.Solusi: Ubah
grouping()dalam pernyataan SQL menjadiGROUPING().
Masalah terkait kompatibilitas mesin
Hasil eksekusi berbeda karena zona waktu Hive berbeda dari Spark
Gejala: Hive menggunakan UTC, dan Spark menggunakan zona waktu lokal. Akibatnya, hasil eksekusi berbeda.
Solusi: Ubah zona waktu Spark menjadi UTC. Sisipkan kode sampel berikut ke dalam Spark SQL:
spark.sql.session.timeZone=UTCAnda juga dapat menambahkan konfigurasi berikut ke file konfigurasi Spark:
spark.sql.session.timeZone=UTC
Masalah terkait versi Hive
Pekerjaan Hive berjalan lambat pada Spark karena alokasi sumber daya dinamis diaktifkan (cacat yang diketahui)
Penyebab: Hive open source memiliki cacat, dan parameter spark.dynamicAllocation.enabled diatur ke true saat Anda terhubung ke Spark menggunakan Beeline. Akibatnya, jumlah partisi shuffle dihitung sebagai 1.
Solusi: Nonaktifkan alokasi sumber daya dinamis untuk pekerjaan Hive yang berjalan pada Spark. Atau, jalankan pekerjaan Hive pada Tez.
spark.dynamicAllocation.enabled=false
Tez melempar pengecualian saat parameter hive.optimize.dynamic.partition.hashjoin diatur ke true (cacat yang diketahui)
Pesan kesalahan:
Vertex failed, vertexName=Reducer 2, vertexId=vertex_1536275581088_0001_5_02, diagnostics=[Task failed, taskId=task_1536275581088_0001_5_02_000009, diagnostics=[TaskAttempt 0 failed, info=[Error: Error while running task ( failure ) : attempt_1536275581088_0001_5_02_000009_0:java.lang.RuntimeException: java.lang.RuntimeException: cannot find field _col1 from [0:key, 1:value] at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:296) at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:250)Penyebab: Hive open source memiliki cacat.
Solusi: Setel parameter hive.optimize.dynamic.partition.hashjoin ke false.
hive.optimize.dynamic.partition.hashjoin=false
MapJoinOperator melempar pengecualian NullPointerException (cacat yang diketahui)
Pesan kesalahan:

Penyebab: Parameter hive.auto.convert.join.noconditionaltask diatur ke true.
Solusi: Setel parameter hive.auto.convert.join.noconditionaltask ke false.
hive.auto.convert.join.noconditionaltask=false
Hive melempar pengecualian IllegalStateException saat pekerjaan Hive berjalan pada Tez (cacat yang diketahui)
Pesan kesalahan:
java.lang.RuntimeException: java.lang.IllegalStateException: Was expecting dummy store operator but found: FS[17] at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:296) at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:250) at org.apache.tez.runtime.LogicalIOProcessorRuntimeTask.run(LogicalIOProcessorRuntimeTask.java:374) at org.apache.tez.runtime.task.TaskRunner2Callable$1.run(TaskRunner2Callable.java:73) at org.apache.tez.runtime.task.TaskRunner2Callable$1.run(TaskRunner2Callable.java:61) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730) at org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:61) at org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:37) at org.apache.tez.common.CallableWithNdc.call(CallableWithNdc.java:36)Penyebab: Hive open source memiliki cacat. Masalah ini terjadi saat parameter tez.am.container.reuse.enabled diatur ke true.
Solusi: Setel parameter tez.am.container.reuse.enabled ke false untuk pekerjaan Hive.
set tez.am.container.reuse.enabled=false;
Masalah lainnya
Hasil yang diperoleh dengan mengeksekusi pernyataan select count(1) adalah 0
Penyebab: Pernyataan
select count(1)menggunakan statistik tabel Hive, tetapi statistik pada tabel ini tidak akurat.Solusi: Setel parameter hive.compute.query.using.stats ke false.
hive.compute.query.using.stats=falseAnda juga dapat menjalankan perintah analyze untuk mengumpulkan ulang statistik tabel Hive.
analyze table <table_name> compute statistics;
Kesalahan terjadi saat pekerjaan Hive dikirimkan pada instance Elastic Compute Service (ECS) yang dikelola sendiri
Jika Anda mengirimkan pekerjaan Hive pada instance ECS yang dikelola sendiri, kesalahan terjadi. Kirim pekerjaan Hive pada kluster gateway EMR atau menggunakan EMR CLI. Untuk informasi lebih lanjut, lihat Gunakan EMR-CLI untuk Menerapkan Gateway.
Pengecualian terjadi pada pekerjaan karena skew data
Gejala:
Ruang disk habis oleh data shuffle.
Beberapa tugas memerlukan waktu lama untuk dieksekusi.
Kesalahan OOM terjadi di beberapa tugas atau kontainer.
Solusi:
Aktifkan optimalisasi skew join Hive.
set hive.optimize.skewjoin=true;Tingkatkan konkurensi mapper dan reducer.
Tingkatkan memori kontainer. Untuk informasi lebih lanjut, lihat Kesalahan Kehabisan Memori (OOM) Terjadi karena Memori Kontainer Tidak Mencukupi.
Kesalahan "Terlalu banyak penghitung: 121 maks=120" terjadi
Gejala: Kesalahan dilaporkan saat Anda menggunakan Hive SQL untuk menjalankan pekerjaan pada mesin Tez atau MR.
Penyebab: Jumlah penghitung dalam pekerjaan saat ini melebihi batas atas default.
Solusi: Pada tab Configure halaman layanan YARN di konsol EMR, cari parameter mapreduce.job.counters.max, tingkatkan nilai parameter tersebut, lalu kirimkan pekerjaan Hive lagi. Jika Anda menggunakan Beeline atau JDBC untuk mengirimkan pekerjaan, Anda harus memulai ulang HiveServer.