Topik ini menjelaskan cara melakukan troubleshooting dan menyelesaikan kegagalan job Hive.
Failure troubleshooting
Jika Anda mengalami kegagalan job atau masalah performa pada client, ikuti langkah-langkah berikut:
-
Periksa log client Hive.
-
Untuk job yang dikirim melalui Hive CLI, log client terletak di /tmp/hive/$USER/hive.log atau /tmp/$USER/hive.log pada kluster atau node Gateway.
-
Untuk job yang dikirim melalui Hive Beeline atau JDBC, log terdapat di log layanan HiveServer (biasanya di /var/log/emr/hive atau /mnt/disk1/log/hive).
-
-
Periksa log Aplikasi YARN untuk job Hive menggunakan perintah yarn.
yarn logs -applicationId application_xxx_xxx -appOwner userName
Memory-related errors
Out-of-memory (OOM) errors due to insufficient container memory
Log error: java.lang.OutOfMemoryError: GC overhead limit exceeded atau java.lang.OutOfMemoryError: Java heap space.
Solusi: Tingkatkan memori container. Untuk job Hive on MapReduce (MR), tingkatkan juga ukuran heap JVM.
-
Hive on MR: Pada halaman konfigurasi layanan YARN, klik tab mapred-site.xml dan tingkatkan memori mapper serta reducer.
mapreduce.map.memory.mb=4096 mapreduce.reduce.memory.mb=4096Perbarui juga parameter JVM
-Xmxdi mapreduce.map.java.opts dan mapreduce.reduce.java.opts menjadi 80% dari nilai mapreduce.map.memory.mb dan mapreduce.reduce.memory.mb.mapreduce.map.java.opts=-Xmx3276m (keep other parameters unchanged) mapreduce.reduce.java.opts=-Xmx3276m (keep other parameters unchanged) -
Hive on Tez
-
Jika container Tez kehabisan memori, pada halaman konfigurasi layanan Hive, klik tab hive-site.xml dan tingkatkan memori container Tez.
hive.tez.container.size=4096 -
Jika AM Tez kehabisan memori, pada halaman konfigurasi layanan Tez, klik tab tez-site.xml dan tingkatkan memori AM Tez.
tez.am.resource.memory.mb=4096
-
-
Hive on Spark: Tingkatkan memori Spark Executor di
spark-defaults.conf.spark.executor.memory=4g
Container killed by YARN due to excessive memory usage
Log error: Container killed by YARN for exceeding memory limits.
Akar penyebab: Tugas Hive menggunakan lebih banyak memori (termasuk heap JVM, memori off-heap, dan proses anak) daripada yang diminta dari YARN. Misalnya, pada Hive on MR, jika ukuran heap JVM Map Task (mapreduce.map.java.opts=-Xmx4g) melebihi alokasi memori YARN (mapreduce.map.memory.mb=3072, atau 3 GB), YARN NodeManager akan menghentikan container tersebut.
Solusi:
-
Untuk job Hive on MR, tingkatkan mapreduce.map.memory.mb dan mapreduce.reduce.memory.mb, pastikan nilainya minimal 1,25 kali nilai
-Xmxdi mapreduce.map.java.opts dan mapreduce.reduce.java.opts. -
Untuk job Hive on Spark, tingkatkan nilai parameter spark.executor.memoryOverhead dan pastikan nilainya minimal 25% dari nilai parameter spark.executor.memory.
OOM caused by SortBuffer set too large
-
Log error:
Error running child: java.lang.OutOfMemoryError: Java heap space at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.init(MapTask.java:986) -
Akar penyebab: Ukuran Sort Buffer melebihi kapasitas memori Container Hive Task. Misalnya, memori container diatur ke 1300 MB, tetapi SortBuffer diatur ke 1024 MB.
-
Solusi: Tingkatkan memori container atau kurangi ukuran SortBuffer.
tez.runtime.io.sort.mb (Hive on Tez) mapreduce.task.io.sort.mb (Hive on MR)
OOM caused by certain GroupBy statements
-
Log error:
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) -
Akar penyebab: HashTable GroupBy mengonsumsi terlalu banyak memori, sehingga menyebabkan OOM.
-
Solusi:
-
Kurangi ukuran split menjadi 128 MB, 64 MB, atau lebih kecil untuk meningkatkan konkurensi job:
mapreduce.input.fileinputformat.split.maxsize=134217728ataumapreduce.input.fileinputformat.split.maxsize=67108864. -
Tingkatkan konkurensi mapper dan reducer.
-
Tingkatkan memori container. Untuk detailnya, lihat Out-of-memory (OOM) errors due to insufficient container memory.
-
OOM when reading Snappy files
-
Akar penyebab: File Snappy standar yang ditulis oleh layanan seperti LogService menggunakan format yang berbeda dengan file Snappy ekosistem Hadoop. EMR secara default menggunakan format Snappy versi modifikasi Hadoop dan melemparkan OutOfMemoryError saat memproses file Snappy standar.
-
Solusi: Konfigurasikan parameter berikut untuk job Hive.
set io.compression.codec.snappy.native=true;
Metadata-related errors
Timeout when dropping large partitioned tables
-
Log error:
FAILED: Execution ERROR, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.thrift.transport.TTransportException: java.net.SocketTimeoutException: Read timeout -
Akar penyebab: Tabel memiliki terlalu banyak partisi. Proses penghapusan memakan waktu lama, sehingga menyebabkan timeout jaringan pada client Hive Metastore.
-
Solusi:
-
Pada halaman konfigurasi layanan Hive di Konsol EMR, klik tab hive-site.xml dan tingkatkan timeout socket client metastore.
hive.metastore.client.socket.timeout=1200s -
Hapus partisi secara bertahap, misalnya dengan menjalankan perintah drop bersyarat beberapa kali.
alter table [TableName] DROP IF EXISTS PARTITION (ds<='20220720')
-
insert overwrite with dynamic partitions causes job failure
-
Pesan error: Saat menggunakan operasi
insert overwritepada partisi dinamis atau menjalankan job serupa yang mencakup operasiinsert overwrite, muncul errorException when loading xxx in table, dan pesan error berikut muncul di log HiveServer.Error in query: org.apache.hadoop.hive.ql.metadata.HiveException: Directory oss://xxxx could not be cleaned up.; -
Akar penyebab: Metadata dan data tidak konsisten. Metadata berisi catatan partisi, tetapi sistem penyimpanan data tidak memiliki path yang sesuai, sehingga menyebabkan error "path not found" selama proses pembersihan.
-
Solusi: Perbaiki masalah metadata sebelum menjalankan ulang job.
Hive throws java.lang.IllegalArgumentException: java.net.UnknownHostException: emr-header-1.xxx when reading or dropping tables
-
Akar penyebab: Saat kluster EMR menggunakan metadata terpadu DLF atau database meta terpadu (fitur lama), path awal database yang dibuat adalah path HDFS dari kluster EMR saat ini (misalnya,
hdfs://master-1-1.xxx:9000/user/hive/warehouse/test.dbatauhdfs://emr-header-1.cluster-xxx:9000/user/hive/warehouse/test.db). Path tabel Hive mewarisi path database dan juga menggunakan path HDFS dari kluster saat ini (misalnya,hdfs://master-1-1.xxx:9000/user/hive/warehouse/test.db/test_tbl). Jika Anda menggunakan Hive di kluster EMR baru untuk membaca atau menulis data ke tabel atau database Hive yang dibuat oleh kluster EMR lama, kluster baru mungkin gagal terhubung ke kluster lama. Selain itu, jika kluster lama telah dirilis, error "java.net.UnknownHostException" akan dikembalikan. -
Solusi:
-
Metode 1: Jika data tabel Hive bersifat sementara atau data uji, ubah lokasi tabel Hive ke path OSS dan jalankan perintah drop table atau drop database.
-- 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_db -
Metode 2: Jika data tabel Hive valid tetapi tidak dapat diakses dari kluster baru, transfer data HDFS dari kluster EMR lama ke OSS dan buat tabel baru.
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'"
-
Hive UDFs and third-party packages
Conflicts caused by placing third-party packages in the Hive lib directory
-
Akar penyebab: Menempatkan paket pihak ketiga atau mengganti JAR Hive di direktori lib Hive ($HIVE_HOME/lib) sering menyebabkan konflik. Hindari praktik ini.
-
Solusi: Hapus paket pihak ketiga dari $HIVE_HOME/lib dan kembalikan JAR Hive asli.
Hive cannot use the reflect function
-
Akar penyebab: Fungsi reflect mungkin tidak tersedia saat otentikasi Ranger diaktifkan.
-
Solusi: Hapus reflect dari blacklist dengan mengonfigurasi
hive-site.xml.hive.server2.builtin.udf.blacklist=empty_blacklist
Custom UDFs slow down job execution
-
Akar penyebab: Job Hive berjalan lambat tanpa log error yang jelas, kemungkinan disebabkan oleh performa buruk pada UDF kustom.
-
Solusi: Lakukan thread dump pada tugas Hive untuk mengidentifikasi hotspot performa dan optimalkan UDF kustom tersebut.
grouping() function fails
-
Gejala: Penggunaan fungsi
grouping()menghasilkan error berikut:grouping() requires at least 2 argument, got 1Error ini menunjukkan adanya kesalahan parsing pada pemanggilan fungsi
grouping(). -
Akar penyebab: Ini adalah bug yang dikenal di Hive open-source. Parser Hive bersifat case-sensitive untuk fungsi
grouping(). Penggunaan huruf kecilgrouping()menyebabkan Hive salah mengenali fungsi tersebut, sehingga mengakibatkan parsing argumen yang salah. -
Solusi: Ubah fungsi
grouping()dalam SQL Anda menjadi huruf kapitalGROUPING().
Engine compatibility issues
Inconsistent results due to Hive and Spark timezone differences
-
Gejala: from_unix_time Hive menggunakan UTC, sedangkan Spark menggunakan zona waktu lokal. Perbedaan zona waktu ini menghasilkan hasil yang tidak konsisten.
-
Solusi: Atur zona waktu Spark ke UTC dengan menambahkan kode berikut di Spark SQL:
set spark.sql.session.timeZone=UTC;Atau tambahkan pengaturan berikut ke file konfigurasi Spark:
spark.sql.session.timeZone=UTC
Known bugs in older Hive versions
Hive on Spark with dynamic partitioning runs slowly (known bug)
-
Akar penyebab: Bug di Hive open-source menyebabkan Beeline mengaktifkan spark.dynamicAllocation.enabled, yang memaksa Hive menghitung partisi shuffle sebagai 1.
-
Solusi: Nonaktifkan alokasi sumber daya dinamis untuk job Hive on Spark atau gunakan Hive on Tez sebagai gantinya.
spark.dynamicAllocation.enabled=false
Tez fails when hive.optimize.dynamic.partition.hashjoin is enabled (known bug)
-
Log error:
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) ]]] -
Akar penyebab: Bug di Hive open-source.
-
Solusi: Sebagai solusi sementara, nonaktifkan pengaturan tersebut.
hive.optimize.dynamic.partition.hashjoin=false
MapJoinOperator throws NullPointerException (known bug)
-
Log error.
2022-05-06 18:37:26,664 ERROR [main] org.apache.hadoop.hive.ql.exec.mr.ExecMapper: java.lang.NullPointerException at org.apache.hadoop.hive.ql.exec.MapJoinOperator.loadHashTable(MapJoinOperator.java:313) at org.apache.hadoop.hive.ql.exec.MapJoinOperator.cleanUpInputFileChangedOp(MapJoinOperator.java:345) at org.apache.hadoop.hive.ql.exec.Operator.cleanUpInputFileChanged(Operator.java:1124) at org.apache.hadoop.hive.ql.exec.Operator.cleanUpInputFileChanged(Operator.java:1128) at org.apache.hadoop.hive.ql.exec.Operator.cleanUpInputFileChanged(Operator.java:1128) at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:540) at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:148) at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:175) 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:1911) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:169) -
Akar penyebab: Mengaktifkan hive.auto.convert.join.noconditionaltask memicu error ini.
-
Solusi: Nonaktifkan pengaturan terkait.
hive.auto.convert.join.noconditionaltask=false
Hive on Tez throws IllegalStateException (known bug)
-
Log error:
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) -
Akar penyebab: Bug di Hive open-source yang terjadi saat reuse Hive AM diaktifkan. EMR Hive belum memperbaiki masalah ini.
-
Solusi: Nonaktifkan reuse ApplicationMaster Tez untuk job individual.
set tez.am.container.reuse.enabled=false;
Other errors
select count(1) returns 0
-
Akar penyebab:
select count(1)menggunakan statistik tabel Hive, tetapi statistik tersebut tidak akurat. -
Solusi: Nonaktifkan penggunaan statistik.
hive.compute.query.using.stats=falseAtau hitung ulang statistik tabel menggunakan perintah analyze.
analyze table <table_name> compute statistics;
Hive job submission fails on self-managed ECS instances
Mengirim job Hive dari instance ECS yang dikelola sendiri (di luar EMR) menyebabkan error yang tidak dapat diprediksi. Gunakan kluster EMR Gateway atau deploy lingkungan Gateway menggunakan EMR-CLI. Untuk informasi lebih lanjut, lihat Deploy a Gateway environment using EMR-CLI.
Job failures due to data skew
-
Perilaku abnormal:
-
Data shuffle memenuhi ruang disk.
-
Tugas tertentu membutuhkan waktu jauh lebih lama untuk berjalan.
-
Tugas atau container tertentu mengalami OOM.
-
-
Solusi:
-
Aktifkan optimasi skew join Hive.
set hive.optimize.skewjoin=true; -
Tingkatkan konkurensi mapper dan reducer.
-
Tingkatkan memori container. Untuk detailnya, lihat Out-of-memory (OOM) errors due to insufficient container memory.
-
How to handle “Too many counters: 121 max=120”?
-
Deskripsi: Saat menjalankan job SQL Hive dengan engine Tez atau MR, Anda mengalami error ini.
-
Analisis: Job melebihi batas counter default.
-
Solusi: Pada tab Configure layanan YARN di Konsol EMR, cari parameter mapreduce.job.counters.max dan tingkatkan nilainya. Setelah memperbarui, kirim ulang job Hive. Jika Anda mengirim job melalui Beeline atau JDBC, restart layanan HiveServer.