我正在使用openjdk:8-alpine for 部署kafka streams应用程序。我正在使用窗口,它崩溃了,错误如下:
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使用muslibc,但rocksdb不支持它。向rocksdb添加musl libc支持的问题:facebook/rocksdb#3143。
question:is there 有没有openjdk docker镜像,我可以用它运行kafka流应用程序,而不会给rocksdb带来问题?
编辑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
3条答案
按热度按时间dnph8jn41#
对我有效的解决方案是改变 Docker 的形象
openjdk:8-alpine
至adoptopenjdk/openjdk8:alpine-slim
.adoptopenjdk/openjdk8:alpine-slim
与glibc兼容。我是从http://blog.gilliard.lol/2018/11/05/alpine-jdk11-images.html.
希望它能帮助别人。
wsxa1bj12#
你链接的票,https://issues.apache.org/jira/browse/kafka-4988,使我们对这个问题有了更多的了解。
如前所述,rocksdb似乎与muslibc不兼容,需要glibc。
安装
libc6-compact
可能不行:它在muslibc上提供了一个兼容层,模仿glibc库结构并实现了一些缺少的功能,但这与安装glibc本身并不相同。glibc是一个复杂的实现,因此在兼容库和实际的glibc之间可能没有一对一的关联。请参阅此处了解一些细微的musl/glibc差异。阅读票证注解,可能是错误的库
librocksdbjni.so
,它依赖于libstdc++6。因此,我将尝试以下方法(使用
openjdk:8-alpine
作为你的基本形象):确保
libstdc++
Package 已安装;手动安装glibc,就像在这个dockerfile(anapsix/docker-alpine-java的glibc-dockerfile的精简版本)中所做的那样。
ubby3x7f3#
您可以为alpine发行版构建glibc,而不是更改默认的docker基本映像。更棒的是,您可以从sasha gerrand的github页面获取预构建的apk。以下是我们添加到dockerfile中的内容,以使这些都能与他的预构建apk一起工作: