Openjdk:8-Alpineを使用してKafka Streamsアプリケーションをデプロイしています。Windowingを使用していますが、以下のエラーでクラッシュします:
Exception in thread "app-4a382bdc55ae-StreamThread-1" Java.lang.UnsatisfiedLinkError: /tmp/librocksdbjni94709417646402513.so: Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /tmp/librocksdbjni94709417646402513.so)
at Java.lang.ClassLoader$NativeLibrary.load(Native Method)
at Java.lang.ClassLoader.loadLibrary0(ClassLoader.Java:1941)
at Java.lang.ClassLoader.loadLibrary(ClassLoader.Java:1824)
at Java.lang.Runtime.load0(Runtime.Java:809)
at Java.lang.System.load(System.Java:1086)
at org.rocksdb.NativeLibraryLoader.loadLibraryFromJar(NativeLibraryLoader.Java:78)
at org.rocksdb.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.Java:56)
at org.rocksdb.RocksDB.loadLibrary(RocksDB.Java:64)
at org.rocksdb.RocksDB.<clinit>(RocksDB.Java:35)
at org.rocksdb.Options.<clinit>(Options.Java:22)
at org.Apache.kafka.streams.state.internals.RocksDBStore.openDB(RocksDBStore.Java:116)
at org.Apache.kafka.streams.state.internals.Segment.openDB(Segment.Java:43)
at org.Apache.kafka.streams.state.internals.Segments.getOrCreateSegment(Segments.Java:91)
at org.Apache.kafka.streams.state.internals.RocksDBSegmentedBytesStore.put(RocksDBSegmentedBytesStore.Java:100)
at org.Apache.kafka.streams.state.internals.RocksDBSessionStore.put(RocksDBSessionStore.Java:122)
at org.Apache.kafka.streams.state.internals.ChangeLoggingSessionBytesStore.put(ChangeLoggingSessionBytesStore.Java:78)
at org.Apache.kafka.streams.state.internals.ChangeLoggingSessionBytesStore.put(ChangeLoggingSessionBytesStore.Java:33)
at org.Apache.kafka.streams.state.internals.CachingSessionStore.putAndMaybeForward(CachingSessionStore.Java:177)
at org.Apache.kafka.streams.state.internals.CachingSessionStore.access$000(CachingSessionStore.Java:38)
at org.Apache.kafka.streams.state.internals.CachingSessionStore$1.apply(CachingSessionStore.Java:88)
at org.Apache.kafka.streams.state.internals.NamedCache.flush(NamedCache.Java:142)
at org.Apache.kafka.streams.state.internals.NamedCache.flush(NamedCache.Java:100)
at org.Apache.kafka.streams.state.internals.ThreadCache.flush(ThreadCache.Java:127)
at org.Apache.kafka.streams.state.internals.CachingSessionStore.flush(CachingSessionStore.Java:193)
at org.Apache.kafka.streams.state.internals.MeteredSessionStore.flush(MeteredSessionStore.Java:169)
at org.Apache.kafka.streams.processor.internals.ProcessorStateManager.flush(ProcessorStateManager.Java:244)
at org.Apache.kafka.streams.processor.internals.AbstractTask.flushState(AbstractTask.Java:195)
at org.Apache.kafka.streams.processor.internals.StreamTask.flushState(StreamTask.Java:332)
at org.Apache.kafka.streams.processor.internals.StreamTask$1.run(StreamTask.Java:312)
at org.Apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.Java:208)
at org.Apache.kafka.streams.processor.internals.StreamTask.commit(StreamTask.Java:307)
at org.Apache.kafka.streams.processor.internals.StreamTask.commit(StreamTask.Java:297)
at org.Apache.kafka.streams.processor.internals.AssignedTasks$1.apply(AssignedTasks.Java:67)
at org.Apache.kafka.streams.processor.internals.AssignedTasks.applyToRunningTasks(AssignedTasks.Java:357)
at org.Apache.kafka.streams.processor.internals.AssignedTasks.commit(AssignedTasks.Java:347)
at org.Apache.kafka.streams.processor.internals.TaskManager.commitAll(TaskManager.Java:403)
at org.Apache.kafka.streams.processor.internals.StreamThread.maybeCommit(StreamThread.Java:994)
at org.Apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.Java:811)
at org.Apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.Java:750)
at org.Apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.Java:720)
上記の問題を検索して、私は https://issues.Apache.org/jira/browse/KAFKA-4988 に出くわしました。しかし、それは役に立ちませんでした。
そのため、Alpineはmusl-libcを使用しますが、RocksDBではサポートされていません。 RocksDBにmusl-libcのサポートを追加する問題: facebook/rocksdb#314 。
質問:Kafka Streamアプリケーションを実行でき、rocksdbの問題が発生しないopenjdk dockerイメージはありますか?
編集-1:RUN apk add --no-cache bash libc6-compat
を試しましたが、以下のエラーで失敗します:
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x000000000011e336, pid=1, tid=0x00007fc6a3cc8ae8
#
# JRE version: OpenJDK Runtime Environment (8.0_181-b13) (build 1.8.0_181-b13)
# Java VM: OpenJDK 64-Bit Server VM (25.181-b13 mixed mode linux-AMD64 compressed oops)
# Derivative: IcedTea 3.9.0
# Distribution: Custom build (Tue Oct 23 11:27:22 UTC 2018)
# Problematic frame:
# C 0x000000000011e336
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
リンクしたチケット https://issues.Apache.org/jira/browse/KAFKA-4988 は、問題に関する多くの洞察を提供します。
前述のように、RocksDBはmusl libcと互換性がなく、glibcが必要になるようです。
libc6-compact
をインストールしても、機能しない場合があります。これは、glibcライブラリ構造を模倣し、いくつかの欠落している機能を実装するmusl libc上の互換性レイヤーを提供しますが、glibc自体をインストールすることと同じではありません。 glibcは複雑な実装であるため、互換性ライブラリと実際のglibcの間に1対1の相関関係がない場合があります。いくつかの微妙なmusl/glibcの違いについては、 ここ を参照してください。
チケットのコメントを読むと、障害のあるライブラリはlibrocksdbjni.so
である可能性があります。これは、libstdc ++ 6に依存します。
したがって、次のことを試してみます(ベースイメージとしてopenjdk:8-Alpine
を使用)。
libstdc++
パッケージがインストールされていることを確認してください。デフォルトのDockerベースイメージを変更するのではなく、Alpineディストリビューション用のglibcを構築できます。それよりもさらに良いことに、 Sasha Gerrandのgithubページ からビルド済みのapkを取得することができます。これをDockerfileに追加して、これをすべて彼のビルド済みapkで機能させる方法は次のとおりです。
# # GLIBC - Kafka Dependency (RocksDB)
# Used by Kafka for default State Stores.
# glibc's apk was built for Alpine Linux and added to our repository
# from this source: https://github.com/sgerrand/Alpine-pkg-glibc/
ARG GLIBC_APK=glibc-2.30-r0.apk
COPY ${KAFKA_DIR}/${GLIBC_APK} opt/
RUN apk add --no-cache --allow-untrusted opt/${GLIBC_APK}
# C++ Std Lib - Kafka Dependency (RocksDB)
RUN apk add --no-cache libstdc++