UnsatisfiedLinkError:/tmp/snappy-1.1.4-libsnappyjava.so加载共享库时出错ld-linux-x86-64.so.2:没有这样的文件或目录

el3*_*323 14 java apache-kafka snappy apache-kafka-streams

我正在尝试在kubernetes中运行Kafka Streams应用程序.当我启动pod时,我得到以下异常:

Exception in thread "streams-pipe-e19c2d9a-d403-4944-8d26-0ef27ed5c057-StreamThread-1"
java.lang.UnsatisfiedLinkError: /tmp/snappy-1.1.4-5cec5405-2ce7-4046-a8bd-922ce96534a0-libsnappyjava.so: 
Error loading shared library ld-linux-x86-64.so.2: No such file or directory 
(needed by /tmp/snappy-1.1.4-5cec5405-2ce7-4046-a8bd-922ce96534a0-libsnappyjava.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.xerial.snappy.SnappyLoader.loadNativeLibrary(SnappyLoader.java:179)
        at org.xerial.snappy.SnappyLoader.loadSnappyApi(SnappyLoader.java:154)
        at org.xerial.snappy.Snappy.<clinit>(Snappy.java:47)
        at org.xerial.snappy.SnappyInputStream.hasNextChunk(SnappyInputStream.java:435)
        at org.xerial.snappy.SnappyInputStream.read(SnappyInputStream.java:466)
        at java.io.DataInputStream.readByte(DataInputStream.java:265)
        at org.apache.kafka.common.utils.ByteUtils.readVarint(ByteUtils.java:168)
        at org.apache.kafka.common.record.DefaultRecord.readFrom(DefaultRecord.java:292)
        at org.apache.kafka.common.record.DefaultRecordBatch$1.readNext(DefaultRecordBatch.java:264)
        at org.apache.kafka.common.record.DefaultRecordBatch$RecordIterator.next(DefaultRecordBatch.java:563)
        at org.apache.kafka.common.record.DefaultRecordBatch$RecordIterator.next(DefaultRecordBatch.java:532)
        at org.apache.kafka.clients.consumer.internals.Fetcher$PartitionRecords.nextFetchedRecord(Fetcher.java:1060)
        at org.apache.kafka.clients.consumer.internals.Fetcher$PartitionRecords.fetchRecords(Fetcher.java:1095)
        at org.apache.kafka.clients.consumer.internals.Fetcher$PartitionRecords.access$1200(Fetcher.java:949)
        at org.apache.kafka.clients.consumer.internals.Fetcher.fetchRecords(Fetcher.java:570)
        at org.apache.kafka.clients.consumer.internals.Fetcher.fetchedRecords(Fetcher.java:531)
        at org.apache.kafka.clients.consumer.KafkaConsumer.pollOnce(KafkaConsumer.java:1146)
        at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1103)
        at org.apache.kafka.streams.processor.internals.StreamThread.pollRequests(StreamThread.java:851)
        at org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:808)
        at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:774)
        at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:744)
Run Code Online (Sandbox Code Playgroud)

以前我尝试使用docker容器启动kafka和kafka-streams-app,它们工作得非常好.这是我第一次尝试使用Kubernetes.

这是我的DockerFile StreamsApp:

FROM openjdk:8u151-jdk-alpine3.7

COPY /target/streams-examples-0.1.jar /streamsApp/

COPY /target/libs /streamsApp/libs

CMD ["java", "-jar", "/streamsApp/streams-examples-0.1.jar"]
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能解决这个问题?请帮助我.

编辑:

/ # ldd /usr/bin/java 
    /lib/ld-musl-x86_64.so.1 (0x7f03f279a000)
Error loading shared library libjli.so: No such file or directory (needed by /usr/bin/java)
    libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7f03f279a000)
Error relocating /usr/bin/java: JLI_Launch: symbol not found
Run Code Online (Sandbox Code Playgroud)

Iva*_*bas 20

这个问题有两种解决方案:

  1. 您可以使用其他一些带有预安装snappy-java库的基本映像。例如openjdk:8-jre-slim对我来说很好用

  2. 另一种解决方案是仍然使用openjdk:8-jdk-alpine图像作为基础图像,然后snappy-java手动安装lib:

FROM openjdk:8-jdk-alpine
RUN apk update && apk add --no-cache gcompat
...
Run Code Online (Sandbox Code Playgroud)


Kay*_* Wu 19

就我而言,安装缺少的libc6-compat无效。应用程序仍然抛出java.lang.UnsatisfiedLinkError

然后我在docker中找到了/lib64/ld-linux-x86-64.so.2存在,它是的链接/lib/libc.musl-x86_64.so.1,但/lib仅包含ld-musl-x86_64.so.1,而不是ld-linux-x86-64.so.2

因此,我在目录中添加了一个名为ld-linux-x86-64.so.2linked 的文件并解决了问题。ld-musl-x86_64.so.1/lib

我使用的Dockerfile:

FROM openjdk:8-jre-alpine
COPY entrypoint.sh /entrypoint.sh
RUN apk update && \
  apk add --no-cache libc6-compat && \
  ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2 && \
  mkdir /app && \
  chmod a+x /entrypoint.sh
COPY build/libs/*.jar /app
ENTRYPOINT ["/entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

结论:

RUN apk update && apk add --no-cache libc6-compat
ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2
Run Code Online (Sandbox Code Playgroud)

  • 安装`gcompat`代替提供`/ lib / ld-linux-x86-64.so.2`的`libc6-compat`应该足够了:https://pkgs.alpinelinux.org/contents?file=ld -linux-x86-64.so.2&pat​​h =&name =&branch = edge (11认同)

ras*_*spy 17

错误消息指出*libsnappyjava.so找不到ld-linux-x86-64.so.2.这是一个glibc动态加载器,而Alpine镜像不能与glibc一起运行.您可以尝试通过在Dockerfile中安装libc6-compat包来运行它,例如:

RUN apk update && apk add --no-cache libc6-compat
Run Code Online (Sandbox Code Playgroud)

  • 这并没有解决问题,我仍然遇到 UnsatisfiedLinkError。@HenningCash 提到的解决方案解决了这个问题。 (5认同)