Ubuntu Hadoop 怎样进行数据压缩
导读:Ubuntu Hadoop 数据压缩实操指南 一 常用压缩格式与选型 压缩在大数据场景可显著减少磁盘/网络 I/O与存储空间,但会增加CPU消耗;需在压缩比与速度间权衡。 常见格式对比(压缩比与速度趋势):压缩比(由低到高)一般为:Sna...
Ubuntu Hadoop 数据压缩实操指南
一 常用压缩格式与选型
- 压缩在大数据场景可显著减少磁盘/网络 I/O与存储空间,但会增加CPU消耗;需在压缩比与速度间权衡。
- 常见格式对比(压缩比与速度趋势):压缩比(由低到高)一般为:Snappy < LZ4 < LZO < GZIP < BZIP2;解压速度趋势相反(Snappy 最快,BZIP2 最慢)。是否可分割(splittable)直接影响并行度:BZIP2 原生可分割,LZO 需建索引后可分割,GZIP/Snappy/LZ4 不可分割。
- 典型场景建议:
- 中间数据(Map 输出/Shuffle):优先Snappy/LZO(速度快,提升吞吐)。
- 归档/冷数据:优先GZIP/BZIP2(压缩比高,节省存储)。
- 大文件且需并行处理:选LZO 并建索引或BZIP2。
二 环境准备与可用编解码器检查
- 安装系统依赖(示例为 Ubuntu):
- Snappy:
sudo apt-get install -y libsnappy-dev - LZO:
sudo apt-get install -y liblzo2-2 liblzo2-dev
- Snappy:
- 检查 Hadoop 可用的 native 压缩库:
hadoop checknative。若状态为 false,需安装对应 native 库或调整库路径。 - 在 Hadoop 配置中声明编解码器(core-site.xml)。示例启用常见编解码器:
如需使用 LZO,还需添加:< configuration> < property> < name> io.compression.codecs< /name> < value> org.apache.hadoop.io.compress.SnappyCodec, org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.BZip2Codec, org.apache.hadoop.io.compress.Lz4Codec, com.hadoop.compression.lzo.LzoCodec, com.hadoop.compression.lzo.LzopCodec < /value> < /property> < /configuration>io.compression.codec.lzo.class=com.hadoop.compression.lzo.LzoCodec。
三 在 MapReduce 中启用压缩
- 中间数据压缩(Shuffle/Map 输出):
Configuration conf = new Configuration(); conf.setBoolean("mapreduce.map.output.compress", true); conf.set("mapreduce.map.output.compress.codec", "org.apache.hadoop.io.compress.SnappyCodec"); // 或 Lz4Codec - 作业最终输出压缩:
conf.setBoolean("mapreduce.output.fileoutputformat.compress", true); conf.setString("mapreduce.output.fileoutputformat.compress.codec", "org.apache.hadoop.io.compress.GzipCodec"); // 归档用 Gzip/BZip2 - 命令行临时指定压缩(示例输出为 Snappy):
hadoop jar your-job.jar \ -D mapreduce.output.fileoutputformat.compress=true \ -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec \ input output - 验证:查看输出文件大小、作业日志与
hadoop checknative输出。
四 在 Hive 与 Spark 中使用压缩
- Hive
- 中间与最终输出:
SET hive.exec.compress.output=true; SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec; SET mapreduce.map.output.compress=true; SET mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec; - 存储格式建议:列式格式如 ORC/Parquet 自带压缩与编码(如 ZLIB/SNAPPY),通常无需额外配置;创建表时可指定
STORED AS ORC TBLPROPERTIES ("orc.compress"="SNAPPY")。
- 中间与最终输出:
- Spark(以 Spark SQL 为例)
- 写入压缩 Parquet/ORC:
spark.sql("SET spark.sql.parquet.compression.codec=snappy") df.write.mode("overwrite").parquet("hdfs:///path/out") - Shuffle 压缩:
-- Spark 3.x spark.conf.set("spark.shuffle.compress", "true") spark.conf.set("spark.io.compression.codec", "snappy")
- 写入压缩 Parquet/ORC:
五 LZO 索引与常见问题处理
- LZO 分割前提是对文件建立索引,否则按不可分割处理,影响并行度。索引工具与用法示例:
建索引后,配合# 使用 hadoop-lzo 提供的索引工具(需先部署 hadoop-lzo) hadoop jar /path/hadoop-lzo.jar com.hadoop.compression.lzo.LzoIndexer /data/file.lzoLzoCodec与正确的 InputFormat 即可实现分片读取。 - 常见问题
- 编解码器不可用:运行
hadoop checknative排查 native 库;确认core-site.xml已正确声明编解码器;必要时在hadoop-env.sh中补充HADOOP_CLASSPATH指向相关 JAR。 - 不可分割格式导致并发不足:大文件避免使用 GZIP/Snappy 作为输入;改用 BZIP2 或 LZO(已索引)。
- 性能与资源:压缩提升 I/O 但消耗 CPU;在 CPU 紧张时可改用 LZ4/Snappy,在存储紧张时优先 GZIP/BZIP2。
- 编解码器不可用:运行
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu Hadoop 怎样进行数据压缩
本文地址: https://pptw.com/jishu/784758.html
