Topik ini mencakup masalah umum yang mungkin Anda temui saat menjalankan Apache Druid di E-MapReduce (EMR), termasuk kegagalan pengindeksan dan error runtime yang sering muncul.
Atasi kegagalan pengindeksan
Ikuti langkah-langkah berikut untuk mendiagnosis kegagalan pengindeksan, mulai dari lapisan terluar menuju ke dalam.
Pengindeksan Batch
-
Jalankan perintah curl dan periksa output-nya. Jika output menampilkan error atau tidak ada sama sekali, periksa format file input Anda. Untuk memeriksa respons API mentah, tambahkan flag
-vke perintah curl. -
Buka halaman Overlord dan periksa status eksekusi pekerjaan. Jika pekerjaan gagal, lihat log langsung di halaman tersebut.
-
Jika tidak ada log yang muncul di halaman Overlord, buka halaman YARN dan periksa apakah pekerjaan indeks telah dibuat. Langkah ini berlaku untuk pekerjaan berbasis Hadoop.
-
Jika Anda masih belum dapat mengidentifikasi penyebabnya, masuk ke kluster EMR Druid dan periksa log Overlord:
/mnt/disk1/log/druid/overlord-emr-header-1.cluster-xxxx.logUntuk kluster dengan Ketersediaan tinggi (HA), periksa Overlord yang menerima pengiriman pekerjaan tersebut.
-
Jika pekerjaan telah dikirim ke MiddleManager tetapi MiddleManager mengembalikan kegagalan, temukan node pekerja yang ditugaskan untuk pekerjaan tersebut di Overlord, masuk ke node tersebut, dan periksa log MiddleManager:
/mnt/disk1/log/druid/middleManager-emr-header-1.cluster-xxxx.log
Pengindeksan Real-time Tranquility
Mulailah dengan memeriksa log Tranquility untuk memastikan apakah pesan diterima atau dibuang. Kemudian ikuti langkah 2 hingga 5 dari prosedur pengindeksan batch di atas.
Sebagian besar error pengindeksan termasuk dalam dua kategori:
-
Error konfigurasi kluster: Parameter memori JVM, konektivitas lintas kluster, akses mode keamanan tinggi, dan principal Kerberos.
-
Error pekerjaan: Format file deskripsi pekerjaan, penguraian data masukan, dan pengaturan lain di tingkat pekerjaan seperti
ioConfig.
Error umum dan solusinya
Gagal startup layanan
Penyebab: Memori yang tersedia pada mesin tidak mencukupi untuk parameter JVM yang dikonfigurasi pada komponen Druid — misalnya, ukuran heap yang besar atau jumlah thread yang tinggi pada mesin dengan memori terbatas.
Solusi: Periksa log komponen untuk mengidentifikasi parameter mana yang berlebihan, lalu kurangi nilainya. Memori JVM terdiri dari dua bagian: heap memory dan direct memory. Untuk panduan penyetelan, lihat Apache Druid Performance FAQ.
Tugas YARN gagal dengan error konflik JAR
Error:
Error: class com.fasterxml.jackson.datatype.guava.deser.HostAndPortDeserializer overrides final method deserialize.(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object;
Penyebab: Dependensi Druid bentrok dengan file JAR yang sudah ada di kluster Hadoop.
Solusi: Tambahkan salah satu properti berikut ke bagian tuningConfig pada konfigurasi pekerjaan pengindeksan:
| Properti | Efek |
|---|---|
mapreduce.job.classloader: "true" |
Memungkinkan pekerjaan MapReduce menggunakan class loader mandiri |
mapreduce.job.user.classpath.first: "true" |
Memberikan prioritas kepada MapReduce untuk menggunakan paket JAR Anda |
Anda dapat memilih salah satu dari dua item konfigurasi ini. Contoh:
"tuningConfig": {
"jobProperties": {
"mapreduce.job.classloader": "true"
}
}
Untuk informasi lebih lanjut, lihat Apache Druid: Working with different versions of Hadoop.
Tugas Reduce tidak dapat membuat direktori segments
Solusi: Periksa konfigurasi deep storage Anda — khususnya bidang type dan directory:
-
Jika
typebernilailocal: Pastikan direktori tersebut ada dan akun EMR Druid memiliki izin menulis. -
Jika
typebernilaihdfs: Tulis path sebagai URI HDFS lengkap, misalnyahdfs://<hdfs_master>:9000/. Untukhdfs_master, gunakan alamat IP. Jika Anda harus menggunakan hostname, gunakan hostname lengkap — misalnya,emr-header-1.cluster-xxxxxxxxbukanemr-header-1.
Untuk pengindeksan batch Hadoop pada kluster EMR Druid standalone, deep storage harus diatur ke "hdfs". Menggunakan "local" menyebabkan pekerjaan MapReduce masuk ke kondisi tidak terdefinisi karena kluster YARN remote tidak dapat menulis ke path lokal pada mesin yang berbeda.
Gagal membuat direktori dalam 10.000 percobaan
Penyebab: Path java.io.tmp yang ditentukan dalam konfigurasi JVM tidak ada.
Solusi: Buat direktori tersebut dan pastikan akun EMR Druid memiliki izin untuk mengaksesnya.
com.twitter.finagle.NoBrokersAvailableException: Tidak ada host yang tersedia untuk disco!firehose:druid:overlord
Penyebab: Ketidaksesuaian koneksi ZooKeeper antara Druid dan Tranquility.
Solusi: Pastikan kedua layanan menggunakan string koneksi ZooKeeper yang sama.
Path ZooKeeper default untuk EMR Druid adalah /druid, sehingga nilai zookeeper.connect dalam konfigurasi Tranquility Anda harus menyertakan /druid.
Jika Anda menggunakan Tranquility dengan Kafka, terdapat dua pengaturan ZooKeeper terpisah:
| Pengaturan | Terhubung ke |
|---|---|
zookeeper.connect |
ZooKeeper kluster EMR Druid |
kafka.zookeeper.connect |
ZooKeeper kluster Kafka |
Kedua kluster ZooKeeper ini mungkin berbeda. Pastikan setiap pengaturan mengarah ke kluster yang benar.
MiddleManager tidak dapat menemukan com.hadoop.compression.lzo.LzoCodec
Penyebab: Kluster Hadoop EMR dikonfigurasi dengan kompresi LZO, tetapi file yang diperlukan tidak berada di direktori dependensi Druid.
Solusi: Salin JAR LZO dan library native-nya dari HADOOP_HOME/lib pada kluster EMR ke druid.extensions.hadoopDependenciesDir Druid (default: DRUID_HOME/hadoop-dependencies).
Pengindeksan gagal dengan GPLNativeCodeLoader IOException
Error:
2018-02-01T09:00:32,647 ERROR [task-runner-0-priority-0] com.hadoop.compression.lzo.GPLNativeCodeLoader - could not unpack the binaries
java.io.IOException: No such file or directory
at java.io.UnixFileSystem.createFileExclusively(Native Method) ~[?:1.8.0_151]
at java.io.File.createTempFile(File.java:2024) ~[?:1.8.0_151]
at java.io.File.createTempFile(File.java:2070) ~[?:1.8.0_151]
at com.hadoop.compression.lzo.GPLNativeCodeLoader.unpackBinaries(GPLNativeCodeLoader.java:115) [hadoop-lzo-0.4.21-SNAPSHOT.jar:?]
Penyebab: Path java.io.tmp tidak ada.
Solusi: Buat direktori tersebut dan pastikan akun EMR Druid memiliki izin untuk mengaksesnya.