SparkStreaming下Python报net.jpountz.lz4.LZ4BlockInputStream的解决

SparkStreaming下Python报net.jpountz.lz4.LZ4BlockInputStream的解决

这几天在测试SparkStreaming,连接Kafka一直报这个错,

Python
18/08/30 21:09:00 ERROR Utils: Uncaught exception in thread stdout writer for <span class="wp_keywordlink"><a href="http://www.168seo.cn/python" title="python">python</a></span> java.lang.NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream.<init>(Ljava/io/InputStream;Z)V at org.apache.spark.io.LZ4CompressionCodec.compressedInputStream(CompressionCodec.scala:122) at org.apache.spark.serializer.SerializerManager.wrapForCompression(SerializerManager.scala:163) at org.apache.spark.serializer.SerializerManager.wrapStream(SerializerManager.scala:124) at org.apache.spark.shuffle.BlockStoreShuffleRjareader$$anonfun$2.apply(BlockStoreShuffleReader.scala:50)
1
2
3
4
5
6
7
18 / 08 / 30 21 : 09 : 00 ERROR Utils : Uncaught exception in thread stdout writer for python
java . lang . NoSuchMethodError : net . jpountz . lz4 . LZ4BlockInputStream . < init > ( Ljava / io / InputStream ; Z ) V
         at org . apache . spark . io . LZ4CompressionCodec . compressedInputStream ( CompressionCodec . scala : 122 )
         at org . apache . spark . serializer . SerializerManager . wrapForCompression ( SerializerManager . scala : 163 )
         at org . apache . spark . serializer . SerializerManager . wrapStream ( SerializerManager . scala : 124 )
         at org . apache . spark . shuffle . BlockStoreShuffleRjareader $ $ anonfun $ 2.apply ( BlockStoreShuffleReader . scala : 50 )
 

连接同事用java写进去的都OK,用client端或NiFi都抱着个错.

开始一直怀疑jar包版本的问题, 用了最新的spark-streaming-kafka-0-8-assembly_2.10-2.2.2.jar 也是出错.

最后查到这个文档,设置这个参数就可以了:

Python
.config("spark.io.compression.codec", "snappy")
1
2
. config ( "spark.io.compression.codec" , "snappy" )
 

修改了wordcount例子就可以了:

Python
from pyspark import SparkConf,SparkContext from pyspark.streaming import StreamingContext from pyspark.streaming.kafka import KafkaUtils if __name__ == "__main__": if len(sys.argv) != 3: print("Usage: kafka_wordcount.py <zk> <topic>", file=sys.stderr) exit(-1) #sc = SparkContext(appName="PythonStreamingKafkaWordCount") conf = SparkConf().setAppName("PythonStreamingKafkaWordCount").set('spark.io.compression.codec','snappy') sc = SparkContext(conf=conf) ssc = StreamingContext(sc, 20)
1
2
3
4
5
6
7
8
9
10
11
12
from pyspark import SparkConf , SparkContext
from pyspark . streaming import StreamingContext
from pyspark . streaming . kafka import KafkaUtils
if __name__ == "__main__" :
     if len ( sys . argv ) != 3 :
         print ( "Usage: kafka_wordcount.py <zk> <topic>" , file = sys . stderr )
         exit ( - 1 )
     #sc = SparkContext(appName="PythonStreamingKafkaWordCount")
     conf = SparkConf ( ) . setAppName ( "PythonStreamingKafkaWordCount" ) . set ( 'spark.io.compression.codec' , 'snappy' )
     sc = SparkContext ( conf = conf )
     ssc = StreamingContext ( sc , 20 )
 

调用命令:

Python
bin/spark-submit --jars /pythontest/scripts/spark-streaming-kafka-0-8-assembly_2.10-2.2.2.jar examples/src/main/<span class="wp_keywordlink"><a href="http://www.168seo.cn/python" title="python">python</a></span>/streaming/kafka_wordcount30.py testnode:2181 sengtest
1
2
bin / spark - submit -- jars    / pythontest / scripts / spark - streaming - kafka - 0 - 8 - assembly_2 . 10 - 2.2.2.jar examples / src / main / python / streaming / kafka_wordcount30 . py testnode : 2181 sengtest
 

最后终于解决了




  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
<think> 首先,用户的问题是关于解决一个特定的错误:'Exception in thread "main" net.jpountz.lz4.LZ4Exception: Error decoding offset 2869 of input buffer'。用户提到了多个引用,这些引用描述了类似的错误,但上下文不同。 现在,回顾系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] 在回答结构上,需要清晰,逐步解决问题,保证真实可靠。用户提供了几个引用,我需要参考它们,但不是直接复制;要基于这些信息综合回答。 关键引用内容: - [^1]: 提到Java异常NoSuchMethodError,涉及LZ4BlockInputStream。 - [^2]: 在Spark环境中出现类似错误,涉及Spark的压缩编解码器。 - [^3]: 在Kylin cube Kafka streaming中出现,建议检查依赖包版本冲突。 - [^4]: 在Spark Streaming Python中,建议设置spark.io.compression.codec为snappy。 用户当前的错误是关于LZ4Exception在解码偏移2869时的错误。这是一个数据解码错误,通常与数据损坏或版本不匹配有关。 步骤分析问题: 1. **理解错误**:LZ4Exception表示在处理LZ4压缩数据时出错。具体是解码输入缓冲区的偏移2869时失败。这可能是由于: - 数据本身损坏。 - LZ4库版本不兼容。 - 压缩和解压缩使用不同的设置或库。 2. **常见原因**: - 依赖冲突:不同版本的LZ4库在类路径中冲突。 - 数据问题:输入数据没有被正确压缩或已损坏。 - 配置问题:压缩编解码器设置不正确。 3. **解决方案基于引用**: - 从[^3],建议检查依赖包版本冲突。Kylin案例中,缺失或版本不匹配的LZ4包导致错误。 - 从[^4],在Spark中,可以更改压缩编解码器为snappy来避免LZ4问题。 - 从[^2],错误涉及Spark的SerializerManager,暗示库不兼容。 4. **一般解决步骤**: - **检查依赖**:确保所有相关依赖(如lz4-java)版本一致且兼容。使用Maven或Gradle解决冲突。 - **验证数据**:如果可能,检查输入数据是否完整未被损坏。 - **更改配置**:如在Spark中,设置`spark.io.compression.codec`为其他算法如snappy(如[^4]所述)。 - **更新库**:确保使用最新或兼容版本的LZ4库。 5. **针对用户错误**: - 用户在错误中提到"Error decoding offset 2869",这表明在特定位置解码失败,可能数据问题或库bug。 - 建议:首先尝试更新LZ4库;其次,检查数据源;如果使用框架如Spark,应用配置更改。 回答结构: - 先解释错误原因。 - 分步骤提供解决方案。 - 引用参考信息。 - 最后生成相关问题。 生成相关问题:基于此错误,可能的后续问题如解决依赖冲突、特定框架配置等。 确保使用中文。 </think> ### 解决 net.jpountz.lz4.LZ4Exception: Error decoding offset 2869 of input buffer 错误的方法 这个错误通常发生在处理 LZ4 压缩数据时,表示在输入缓冲区的偏移量 2869 处解码失败。根本原因可能是数据损坏、LZ4 库版本冲突或配置不兼容。以下基于问题描述和相关引用,提供逐步解决方案。 #### 错误原因分析 - **数据损坏或格式错误**:输入数据可能在传输或存储过程中损坏,导致 LZ4 解码失败(常见于 Kafka、Spark 等流处理场景)。 - **依赖库冲突**:项目中使用的 LZ4 库(如 `lz4-java`)版本不一致或不兼容,引发 `NoSuchMethodError` 或解码异常[^3]。 - **压缩编解码器配置问题**:框架(如 Spark)的压缩设置与数据实际压缩格式不匹配[^4]。 #### 逐步解决方案 1. **检查并修复数据源**: - 验证输入数据是否完整。例如,在 Kafka 中检查消息是否损坏;在 Spark 中重放数据流测试。 - 如果数据来自外部源,尝试重新生成或修复数据文件。 - 工具建议:使用 `lz4` 命令行工具测试数据解压:`lz4 -d input.lz4`,观察是否错。 2. **解决依赖冲突**: - **统一 LZ4 库版本**:确保所有依赖使用兼容的 `lz4-java` 版本(如 1.8.0)。检查项目构建文件(如 Maven `pom.xml` 或 Gradle `build.gradle`): ```xml <!-- 示例:Maven 依赖声明 --> <dependency> <groupId>org.lz4</groupId> <artifactId>lz4-java</artifactId> <version>1.8.0</version> <!-- 推荐稳定版本 --> </dependency> ``` - **排除冲突依赖**:使用依赖树命令(如 `mvn dependency:tree`)查找冲突版本,并在构建文件中排除旧版本: ```xml <dependency> <groupId>com.example</groupId> <artifactId>some-library</artifactId> <exclusions> <exclusion> <groupId>net.jpountz.lz4</groupId> <artifactId>lz4</artifactId> </exclusion> </exclusions> </dependency> ``` - **部署环境检查**:在集群环境(如 Hadoop/YARN)中,确保所有节点 lib 目录包含一致的 LZ4 JAR 文件[^3]。 3. **更改压缩编解码器配置**: - 在 Spark 或 Kafka 等框架中,将压缩算法切换到兼容的替代方案(如 Snappy),避免 LZ4 问题: ```scala // Spark 配置示例 val spark = SparkSession.builder() .appName("MyApp") .config("spark.io.compression.codec", "snappy") // 使用 Snappy 替代 LZ4 .getOrCreate() ``` Python 应用中类似配置[^4]: ```python from pyspark import SparkConf conf = SparkConf().set("spark.io.compression.codec", "snappy") ``` - **验证配置生效**:运行任务后检查日志,确认无 LZ4 相关错误。 4. **更新库和框架版本**: - 升级 LZ4 库到最新版(如 `lz4-java:1.8.0`),修复已知解码 Bug。 - 同步升级相关框架(如 Spark、Kafka)到兼容版本。例如: - Spark 2.4+ 建议搭配 `lz4-java:1.8.0`。 - 参考官方文档验证版本矩阵。 5. **调试与日志分析**: - 启用详细日志:在 JVM 参数中添加 `-Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG`,捕获解码过程细节。 - 捕获堆栈跟踪:分析错误日志中的完整堆栈,定位调用 LZ4 的代码位置(如 Spark 的 `BlockStoreShuffleReader`[^2])。 #### 注意事项 - 如果问题在特定偏移(如 2869)反复出现,优先检查数据源是否在该位置存在损坏。 - 在分布式环境中(如 Spark on YARN),确保所有节点依赖一致[^3]。 - 测试建议:先在本地环境复现问题,缩小范围后再部署到生产。 通过以上步骤,大多数 LZ4Exception 问题可解决。如果仍失败,提供更多上下文(如完整日志)以便深入分析。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值