Hadoop 和 Spark 的 CompressionCodec 有什么区别?
数据小陈
结论
这两个同名接口属于不同生态,用途也不同,不能只凭类名互换。处理 Hadoop 文件输入输出时,通常使用 org.apache.hadoop.io.compress.CompressionCodec;配置 Spark 自身的内部数据压缩时,则使用 org.apache.spark.io.CompressionCodec。具体选择取决于调用该接口的 API 和数据存储位置。
在大数据处理中遇到这两个 codec 时,先看压缩发生在哪里:Hadoop 接口用于 Hadoop 的压缩流和文件 I/O,Spark 接口主要用于 Spark 内部场景,例如 block storage。Hadoop 接口提供创建压缩器、解压器及相关流的方法;Spark 接口定义了压缩输入流和输出流的方法。它们是不同的 Java 接口,某个实现能否用于特定 API,取决于该 API 要求的接口类型。
按使用位置选择
- Hadoop 文件或 Hadoop
OutputFormat:使用 Hadoop codec,例如org.apache.hadoop.io.compress.GzipCodec。Hadoop 的CompressionCodec接口封装了流式压缩和解压能力,并提供创建压缩流、解压流的方法。Hadoop CompressionCodec API - Spark 内部压缩:使用 Spark codec,并通过 Spark 配置选择,例如
spark.io.compression.codec。Spark 文档说明,该接口用于 block storage。其压缩格式不保证跨 Spark 版本兼容,供单个 Spark 应用内部使用。Spark CompressionCodec API Spark 配置文档 - Spark 读写文件:任务运行在 Spark 上,并不意味着文件读写默认使用
org.apache.spark.io.CompressionCodec。具体使用哪个 codec,取决于文件格式、数据源以及调用的 Hadoop 或 Spark API。
配置 Hadoop OutputFormat 的输出压缩时,常见配置项如下:
mapreduce.output.fileoutputformat.compress=true
mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec
Spark 内部压缩则通过 Spark 配置选择,例如:
spark.io.compression.codec=org.apache.spark.io.LZ4CompressionCodec
两组配置针对不同用途,不能互相替代。是否适用,还需结合 Spark 版本和具体读写 API 确认。
使用前的检查
- 查看目标 API 的参数或配置项要求 Hadoop codec 还是 Spark codec。
- 确认压缩发生在 Spark 内部数据传输或存储过程中,还是发生在输出文件上。
- 核对运行环境中的 Spark、Hadoop 版本,以及相应的 codec 实现是否可用。
- 如果文件需要由其他系统读取,确认该系统支持相同的压缩格式。不要默认 Spark 内部 codec 的数据格式能跨版本或跨系统兼容。
备注:内容仅供参考。
