温馨提示×

Hadoop数据压缩Linux上如何配置

小樊
51
2025-10-18 16:11:45
栏目: 智能运维

Hadoop数据压缩在Linux上的配置指南

1. 准备工作:选择压缩格式

Hadoop原生支持多种压缩格式,需根据压缩比、速度、是否支持split等需求选择:

  • Snappy:高速压缩/解压(适合MapReduce中间数据,如map输出),但压缩率较低(约50%),不支持split。
  • Gzip:高压缩比(约68%),速度适中,Hadoop原生支持,但不支持split(适合小文件,如单文件<128MB)。
  • Bzip2:最高压缩比(约72%),但速度慢,支持split,适合归档大文件。
  • LZO:平衡速度与压缩率(约51%),支持split(需建索引),但需额外安装。
  • Zstandard(Zstd):兼顾速度与压缩比(比Snappy更高),需Hadoop 2.7+支持。

2. 安装压缩编解码器依赖

根据选择的格式安装对应库(以Snappy、Gzip为例):

  • Snappy(推荐用于中间数据):
    # Debian/Ubuntu
    sudo apt-get install libsnappy-dev
    # CentOS/RHEL
    sudo yum install snappy-devel
    
  • Gzip(Linux自带,无需额外安装):
    # 检查是否安装
    gzip --version
    
  • LZO(需支持split):
    # 安装lzo-devel和lzop
    sudo yum install lzo-devel lzop
    # 编译Hadoop时需开启LZO支持(参考Hadoop官方文档)
    

3. 配置Hadoop核心参数

修改Hadoop配置文件(位于$HADOOP_HOME/etc/hadoop/),启用压缩功能:

3.1 配置core-site.xml(全局压缩编解码器)
<configuration>
    <!-- 指定Hadoop支持的压缩编解码器,多个用逗号分隔 -->
    <property>
        <name>io.compression.codecs</name>
        <value>org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec</value>
    </property>
</configuration>
3.2 配置mapred-site.xml(MapReduce作业压缩)
<configuration>
    <!-- 启用Map输出压缩(减少shuffle数据量) -->
    <property>
        <name>mapreduce.map.output.compress</name>
        <value>true</value>
    </property>
    <!-- Map输出压缩编解码器(推荐Snappy,速度快) -->
    <property>
        <name>mapreduce.map.output.compress.codec</name>
        <value>org.apache.hadoop.io.compress.SnappyCodec</value>
    </property>
    <!-- 启用最终输出压缩(如作业输出到HDFS) -->
    <property>
        <name>mapreduce.output.fileoutputformat.compress</name>
        <value>true</value>
    </property>
    <!-- 最终输出压缩编解码器(如归档选Bzip2,小文件选Gzip) -->
    <property>
        <name>mapreduce.output.fileoutputformat.compress.codec</name>
        <value>org.apache.hadoop.io.compress.BZip2Codec</value>
    </property>
</configuration>
3.3 配置hdfs-site.xml(HDFS块大小优化)
<configuration>
    <!-- 调整块大小(默认128MB),大文件适合更大的块 -->
    <property>
        <name>dfs.blocksize</name>
        <value>134217728</value> <!-- 128MB -->
    </property>
    <!-- 增加NameNode/Datanode处理线程数(提升并发) -->
    <property>
        <name>dfs.namenode.handler.count</name>
        <value>100</value>
    </property>
    <property>
        <name>dfs.datanode.handler.count</name>
        <value>100</value>
    </property>
</configuration>

4. 重启Hadoop服务

使配置生效:

# 根据实际服务名调整(如hadoop-namenode、hadoop-datanode等)
sudo systemctl restart hadoop-namenode
sudo systemctl restart hadoop-datanode
sudo systemctl restart hadoop-resourcemanager
sudo systemctl restart hadoop-nodemanager

5. 验证压缩功能

5.1 命令行上传压缩文件到HDFS
# 使用Snappy压缩上传本地文件
hadoop fs -put -f -D mapreduce.output.fileoutputformat.compress=true \
-D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec \
localfile.txt /user/hadoop/output/compressed_snappy/
5.2 查看压缩文件
# 列出HDFS中的压缩文件
hadoop fs -ls /user/hadoop/output/compressed_snappy/
# 下载并解压文件
hadoop fs -get /user/hadoop/output/compressed_snappy/localfile.txt.snappy ./localfile.txt
# 使用gunzip解压(如果是Gzip格式)
gunzip localfile.txt.gz
5.3 运行MapReduce作业验证

编写MapReduce程序(如WordCount),在驱动类中设置压缩配置:

Configuration conf = new Configuration();
conf.set("mapreduce.output.fileoutputformat.compress", "true");
conf.set("mapreduce.output.fileoutputformat.compress.codec", "org.apache.hadoop.io.compress.SnappyCodec");
Job job = Job.getInstance(conf, "WordCount");
// 其他配置...
System.exit(job.waitForCompletion(true) ? 0 : 1);

提交作业后,检查输出目录是否生成压缩文件(如.snappy后缀)。

注意事项

  • LZO索引:若使用LZO格式,需为压缩文件创建索引(使用lzopindex命令),并在MapReduce作业中指定LzoTextInputFormat
  • 压缩比与性能权衡:高压缩比(如Bzip2)会增加CPU开销和作业时间,适合归档;低压缩比(如Snappy)适合实时处理。
  • 兼容性:确保压缩格式与Hadoop版本兼容(如Zstd需Hadoop 2.7+)。

0