全部产品
Search
文档中心

E-MapReduce:Memperbaiki masalah terkait pekerjaan Hive

更新时间:Jul 02, 2025

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:

  1. 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.

  2. 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=4096

    Anda juga perlu mengubah nilai JVM -Xmx dari 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=4096
    • Jika 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.conf dan 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:

  1. 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 -Xmx dari parameter mapreduce.map.java.opts dan mapreduce.reduce.java.opts.

  2. 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:

    1. Kurangi ukuran split menjadi 128 MB, 64 MB, atau kurang, atau tingkatkan konkurensi pekerjaan. Sebagai contoh, Anda dapat menetapkan parameter mapreduce.input.fileinputformat.split.maxsize menjadi 134217728 atau 67108864.

    2. Tingkatkan konkurensi mapper dan reducer.

    3. 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 timeout
  • Penyebab: Tabel partisi berisi jumlah partisi yang berlebihan. Akibatnya, operasi penghapusan memerlukan waktu lama, dan jaringan timeout ketika klien Hive mengakses layanan Metastore.

  • Solusi:

    1. 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=1200s
    2. Hapus 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 overwrite dieksekusi dalam pekerjaan untuk menyisipkan data ke partisi dinamis, atau pekerjaan serupa yang berisi pernyataan insert overwrite dijalankan, 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.db atau hdfs://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_db
    • Solusi 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 1

    Pesan 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 menggunakan grouping() alih-alih GROUPING(), Hive mungkin gagal mengenali fungsi, mengakibatkan kesalahan penguraian argumen.

  • Solusi: Ubah grouping() dalam pernyataan SQL menjadi GROUPING().

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=UTC

    Anda 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:Error message

  • 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=false

    Anda 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:

    1. Aktifkan optimalisasi skew join Hive.

      set hive.optimize.skewjoin=true;
    2. Tingkatkan konkurensi mapper dan reducer.

    3. 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.