web-dev-qa-db-ja.com

openjdk:8の代替-Alpine for Kafka Streams

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
7
mukesh210

リンクしたチケット 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++ パッケージがインストールされていることを確認してください。
  • このように、glibcを手動でインストールします Dockerfileanapsix/docker-Alpine-Java によるglibcDockerfileの削除バージョン)。
0
valiano

デフォルトの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++
0
stackunderflow