简体   繁体   English

从主题读取时,Kafka LZ4 解压导致 lz4-java 中的 IllegalAccessError

[英]Kafka LZ4 decompression causes IllegalAccessError in lz4-java when reading from topic

On the project I am working on currently, we have four spring based apps that are writing and reading from various Kafka topics.在我目前正在从事的项目中,我们有四个基于 Spring 的应用程序,它们正在编写和读取各种 Kafka 主题。 Due to the large amount of data being sent, we have decided to enable LZ4 compression.由于要发送大量数据,我们决定启用 LZ4 压缩。 This worked perfectly fine for three of the apps, but caused a huge issue in the fourth.这对于其中三个应用程序来说非常有效,但在第四个应用程序中却引起了巨大的问题。

The flow is as follows: App A receives HTTP requests and converts the payload to Kafka messages.流程如下:App A 接收 HTTP 请求,将 payload 转换为 Kafka 消息。 App B reads the messages from app A, does some processing on them, and sends them further on two different topics to apps C and D. We enabled compression on the producers in both A and B by setting the compression type config to lz4.应用程序 B 从应用程序 A 读取消息,对其进行一些处理,然后将它们进一步发送到两个不同的主题到应用程序 C 和 D。我们通过将压缩类型配置设置为 lz4 对 A 和 B 中的生产者启用了压缩。 We then tested, and it worked fine for the messages from A to B, and also from B to D. However, when app C received a compressed message, the following error started being spammed:然后我们进行了测试,它对于从 A 到 B 以及从 B 到 D 的消息都可以正常工作。但是,当应用程序 C 收到压缩消息时,以下错误开始被垃圾邮件:

java.lang.IllegalAccessError: failed to access class net.jpountz.lz4.LZ4SafeUtils (class loader System@7452) from class net.jpountz.lz4.LZ4JavaSafeSafeDecompressor (class loader org.springframework.boot.loader.LaunchedURLClassLoader@11104)

I am not very familiar with classloaders, but it seems to me that although they belong to the same package, they seem to be loaded by different class loaders causing the access error?我对类加载器不是很熟悉,但在我看来,虽然它们属于同一个包,但它们似乎是由不同的类加载器加载的,导致访问错误?

The version of spring-kafka being used is 2.7.3, and the version of lz4-java is 1.7.1, imported as a dependency of spring-kafka.使用的spring-kafka的版本是2.7.3,lz4-java的版本是1.7.1,作为spring-kafka的依赖导入。

I do not understand why this issue is occurring only on one of the apps and not on the others, as all the configs are the same (shared and loaded via a commons library used by all four apps to create required beans).我不明白为什么这个问题只发生在其中一个应用程序上而不是其他应用程序上,因为所有配置都是相同的(通过所有四个应用程序用来创建所需 bean 的公共库共享和加载)。 Initially, in this app that presents this issue, we had another library being imported that used a modified version of lz4-java, so we thought that's where the issue is coming from.最初,在这个提出这个问题的应用程序中,我们导入了另一个使用修改版本的 lz4-java 的库,所以我们认为这就是问题的来源。 However, even after completely removing it, the same error posted above is received.但是,即使完全删除它,也会收到上面发布的相同错误。

Has anyone experienced a similar issue or could give me a lead as to what to do next to solve this issue?有没有人遇到过类似的问题,或者可以指导我下一步该怎么做才能解决这个问题?

Thank you.谢谢你。

Edit : The application is running in the cloud and this is the stack trace as seen in the application logs.编辑:应用程序正在云中运行,这是在应用程序日志中看到的堆栈跟踪。 The following block is spammed repeatedly until it is shut down or the compressed messages are removed from the topics that are being listened to.接下来的块会重复发送垃圾邮件,直到它被关闭或压缩消息从正在收听的主题中删除。

[container-1-C-1] essageListenerContainer$ListenerConsumer : Consumer exception
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT org.springframework.kafka.KafkaException: Seek to current after exception; nested exception is org.apache.kafka.common.KafkaException: Received exception when fetching the next record from ETD-NewUserContextSystemData.ibsoetdcfsubacc4.eb419dde-795b-48a2-977a-8117ac15cb4e-2. If needed, please seek past the record to continue consumption.
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.springframework.kafka.listener.SeekToCurrentBatchErrorHandler.handle(SeekToCurrentBatchErrorHandler.java:79) ~[spring-kafka-2.7.3.jar:2.7.3]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.springframework.kafka.listener.RecoveringBatchErrorHandler.handle(RecoveringBatchErrorHandler.java:124) ~[spring-kafka-2.7.3.jar:2.7.3]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.handleConsumerException(KafkaMessageListenerContainer.java:1603) [spring-kafka-2.7.3.jar:2.7.3]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:1210) [spring-kafka-2.7.3.jar:2.7.3]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_301]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_301]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at java.lang.Thread.run(Thread.java:836) [?:1.8.0_301]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT Caused by: org.apache.kafka.common.KafkaException: Received exception when fetching the next record from ETD-NewUserContextSystemData.ibsoetdcfsubacc4.eb419dde-795b-48a2-977a-8117ac15cb4e-2. If needed, please seek past the record to continue consumption.
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher$CompletedFetch.fetchRecords(Fetcher.java:1611) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher$CompletedFetch.access$1700(Fetcher.java:1432) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher.fetchRecords(Fetcher.java:684) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher.fetchedRecords(Fetcher.java:635) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.KafkaConsumer.pollForFetches(KafkaConsumer.java:1303) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1237) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1210) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doPoll(KafkaMessageListenerContainer.java:1410) ~[spring-kafka-2.7.3.jar:2.7.3]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1249) ~[spring-kafka-2.7.3.jar:2.7.3]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:1161) ~[spring-kafka-2.7.3.jar:2.7.3]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     ... 3 more
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT Caused by: org.apache.kafka.common.KafkaException: java.lang.IllegalAccessError: failed to access class net.jpountz.lz4.LZ4SafeUtils (class loader System@7452) from class net.jpountz.lz4.LZ4JavaSafeSafeDecompressor (class loader org.springframework.boot.loader.LaunchedURLClassLoader@11104)
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.common.record.CompressionType$4.wrapForInput(CompressionType.java:113) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.common.record.DefaultRecordBatch.compressedIterator(DefaultRecordBatch.java:261) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.common.record.DefaultRecordBatch.streamingIterator(DefaultRecordBatch.java:346) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher$CompletedFetch.nextFetchedRecord(Fetcher.java:1554) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher$CompletedFetch.fetchRecords(Fetcher.java:1591) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher$CompletedFetch.access$1700(Fetcher.java:1432) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher.fetchRecords(Fetcher.java:684) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher.fetchedRecords(Fetcher.java:635) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.KafkaConsumer.pollForFetches(KafkaConsumer.java:1303) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1237) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1210) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doPoll(KafkaMessageListenerContainer.java:1410) ~[spring-kafka-2.7.3.jar:2.7.3]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1249) ~[spring-kafka-2.7.3.jar:2.7.3]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:1161) ~[spring-kafka-2.7.3.jar:2.7.3]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     ... 3 more
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT Caused by: java.lang.IllegalAccessError: failed to access class net.jpountz.lz4.LZ4SafeUtils (class loader System@7452) from class net.jpountz.lz4.LZ4JavaSafeSafeDecompressor (class loader org.springframework.boot.loader.LaunchedURLClassLoader@11104)
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at net.jpountz.lz4.LZ4JavaSafeSafeDecompressor.decompress(LZ4JavaSafeSafeDecompressor.java:71) ~[lz4-java-1.7.1.jar:2.9.16-38a800d98fb18a51ecde14f570bbf28d81b66bbc]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at net.jpountz.lz4.LZ4SafeDecompressor.decompress(LZ4SafeDecompressor.java:74) ~[lz4-java-1.7.1.jar:2.9.16-38a800d98fb18a51ecde14f570bbf28d81b66bbc]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at net.jpountz.lz4.LZ4Factory.<init>(LZ4Factory.java:214) ~[lz4-java-1.7.1.jar:2.9.16-38a800d98fb18a51ecde14f570bbf28d81b66bbc]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at net.jpountz.lz4.LZ4Factory.instance(LZ4Factory.java:51) ~[lz4-java-1.7.1.jar:2.9.16-38a800d98fb18a51ecde14f570bbf28d81b66bbc]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at net.jpountz.lz4.LZ4Factory.safeInstance(LZ4Factory.java:105) ~[lz4-java-1.7.1.jar:2.9.16-38a800d98fb18a51ecde14f570bbf28d81b66bbc]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at net.jpountz.lz4.LZ4Factory.fastestJavaInstance(LZ4Factory.java:141) ~[lz4-java-1.7.1.jar:2.9.16-38a800d98fb18a51ecde14f570bbf28d81b66bbc]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at net.jpountz.lz4.LZ4Factory.fastestInstance(LZ4Factory.java:169) ~[lz4-java-1.7.1.jar:2.9.16-38a800d98fb18a51ecde14f570bbf28d81b66bbc]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.common.record.KafkaLZ4BlockInputStream.<clinit>(KafkaLZ4BlockInputStream.java:50) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.common.record.CompressionType$4.wrapForInput(CompressionType.java:110) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.common.record.DefaultRecordBatch.compressedIterator(DefaultRecordBatch.java:261) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.common.record.DefaultRecordBatch.streamingIterator(DefaultRecordBatch.java:346) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher$CompletedFetch.nextFetchedRecord(Fetcher.java:1554) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher$CompletedFetch.fetchRecords(Fetcher.java:1591) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher$CompletedFetch.access$1700(Fetcher.java:1432) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher.fetchRecords(Fetcher.java:684) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.internals.Fetcher.fetchedRecords(Fetcher.java:635) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.KafkaConsumer.pollForFetches(KafkaConsumer.java:1303) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1237) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1210) ~[kafka-clients-2.6.2.jar:?]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doPoll(KafkaMessageListenerContainer.java:1410) ~[spring-kafka-2.7.3.jar:2.7.3]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1249) ~[spring-kafka-2.7.3.jar:2.7.3]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:1161) ~[spring-kafka-2.7.3.jar:2.7.3]
   2021-09-24T10:42:29.30+0300 [APP/PROC/WEB/1] OUT     ... 3 more

I was facing the same issue like you.我和你一样面临同样的问题。 I faced the issue when running my program on Linux system.我在 Linux 系统上运行我的程序时遇到了这个问题。 The root cause of the issue might be: your Linux OS kernel does not support method calling from .so file (not sure if you are using Linux or IBM AIX).问题的根本原因可能是:您的 Linux 操作系统内核不支持从 .so 文件调用方法(不确定您使用的是 Linux 还是 IBM AIX)。 The .so file is automatically loaded when lz4 jar file is loaded into the classpath based on the OS kernel version.当 lz4 jar 文件加载到基于 OS 内核版本的类路径时,.so 文件会自动加载。

You can run the command line "uname -a" or "uname -mrs" to check the OS kernel version.您可以运行命令行“uname -a”或“uname -mrs”来检查操作系统内核版本。

If you open the lz4 jar file, you will see .so files for each OS under "util" package.如果您打开 lz4 jar 文件,您将在“util”包下看到每个操作系统的 .so 文件。 My thought is that your (and my) OS kernel was not added in the support list of the library.我的想法是您的(和我的)操作系统内核未添加到库的支持列表中。 We might need to check the library's Jira issue list to see if they confirm that this is an issue and they are going to fix it.我们可能需要检查图书馆的 Jira 问题列表,看看他们是否确认这是一个问题并且他们会修复它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM