HDFS-压缩

标签: hdfs 压缩 | 发表时间:2013-12-23 11:23 | 作者:zjhdreams
出处:http://www.iteye.com
http://marsorp.iteye.com/blog/1559613
文件压缩带来了两大益处1)减少存贮空间2)加速网络(磁盘)传输。基于大数据的传输,都需要经过压缩处理。
压缩格式
压缩格式 工具 算法 文件扩展名 可分块
DEFLATE N/A DEFLATE .deflate No
gzip gzip DEFLATE .gz No
bzip2 bzip2 bzip2 .bz2 Yes
LZO lzop LZO .lzo No
Snappy N/A Snappy .snappy No



压缩及解压缩



文件解压实例





Java代码 复制代码 收藏代码
1.package com.bigdata.io; 
2. 
3.import java.io.IOException; 
4.import java.io.InputStream; 
5.import java.io.OutputStream; 
6.import java.net.URI; 
7. 
8.import org.apache.hadoop.conf.Configuration; 
9.import org.apache.hadoop.fs.FileSystem; 
10.import org.apache.hadoop.fs.Path; 
11.import org.apache.hadoop.io.IOUtils; 
12.import org.apache.hadoop.io.compress.CompressionCodec; 
13.import org.apache.hadoop.io.compress.CompressionCodecFactory; 
14. 
15.public class FileDecompressor { 
16.     
17.    public static void main(String[] args) throws IOException { 
18.        String uri = args[0]; 
19.        Configuration conf = new Configuration(); 
20.        FileSystem fs = FileSystem.get(URI.create(uri),conf); 
21.        Path inputPath = new Path(uri); 
22.         
23.        CompressionCodecFactory factory = new CompressionCodecFactory(conf); 
24.        // io.compression.codecs 定义列表中的一个 
25.        CompressionCodec codec  = factory.getCodec(inputPath);  
26.        if(null == codec){ 
27.            System.err.println("No codec for " + uri); 
28.            System.exit(-1); 
29.        } 
30.         
31.        String outputUri = CompressionCodecFactory.removeSuffix(uri, codec.getDefaultExtension()); 
32.        InputStream in = null; 
33.        OutputStream out = null; 
34.        try{ 
35.            in = codec.createInputStream(fs.open(inputPath)); 
36.            out = fs.create(new Path(outputUri)); 
37.            IOUtils.copyBytes(in, out, conf); 
38.        }finally{ 
39.            IOUtils.closeStream(in); 
40.            IOUtils.closeStream(out); 
41.        } 
42.    } 
43.} 


  $hadoop jar stream.jar com.bigdata.io.FileDecompressor test.txt.gz 

   12/06/14 09:48:28 INFO util.NativeCodeLoader: Loaded the native-hadoop library

   12/06/14 09:48:28 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library



Native Libraries

Native gzip 库减少解压缩时间在50%,压缩时间在10%(同java实现的压缩算法)

禁用Native Library , 需要设置属性hadoop.native.lib 为 false







Java代码 复制代码 收藏代码
1.package com.bigdata.io; 
2. 
3.import java.io.IOException; 
4. 
5.import org.apache.hadoop.conf.Configuration; 
6.import org.apache.hadoop.io.IOUtils; 
7.import org.apache.hadoop.io.compress.CodecPool; 
8.import org.apache.hadoop.io.compress.CompressionCodec; 
9.import org.apache.hadoop.io.compress.CompressionOutputStream; 
10.import org.apache.hadoop.io.compress.Compressor; 
11.import org.apache.hadoop.util.ReflectionUtils; 
12. 
13.public class PooledStreamCompressor { 
14. 
15.    public static void main(String[] args) throws ClassNotFoundException { 
16.        String codecClassName = args[0]; 
17.        Class<?> codecClass = Class.forName(codecClassName); 
18.         
19.        Configuration conf = new Configuration(); 
20.        CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, conf); 
21.        Compressor compressor = null; 
22.         
23.        try { 
24.            compressor = CodecPool.getCompressor(codec); 
25.            CompressionOutputStream out = codec.createOutputStream(System.out, compressor); 
26.            IOUtils.copyBytes(System.in, out,4096,false); 
27.            out.finish(); 
28.        } catch (IOException e) { 
29.            e.printStackTrace(); 
30.        }finally{ 
31.            CodecPool.returnCompressor(compressor); 
32.        } 
33.    } 
34.} 

 


echo "Text" | hadoop jar stream.jar com.bigdata.io.PooledStreamCompressor org.apache.hadoop.io.compress.GzipCodec | gunzip -

12/06/14 10:57:49 INFO util.NativeCodeLoader: Loaded the native-hadoop library

12/06/14 10:57:49 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library

12/06/14 10:57:49 INFO compress.CodecPool: Got brand-new compressor

Text




使用压缩格式规则



      压缩格式的使用取决于你的应用程序。你想最大化您的应用程序的速度,或者是你更关注关于保持存储成本下降?在一般情况下,你应该尝试不同的策略,根据数据集和基准测试,找到最好的办法。

      对于大文件,如日志文件,选项有:

      1.存储成非压缩格式

      2.使用一个支持块分割的压缩格式,比如bzip2(当然bzip2比较慢)或者可以使用LZO(被索引后支持块分割)

      3.把应用分割成大快,每个大快可以支持任意的压缩格式(不用关心在HDFS中是否可以分割)。在这种情况,你需要计算一下你的压缩后的尺寸,要同HDFS Block的大小相匹配

      4.使用Sequence 文件,支持压缩及分块

      5.使用Avro数据文件,支持压缩及分块,就像Sequence文件,但比Sequence要更高级,可以被多种语言支持

      对于大文件,你不应该使用不支持分块的压缩。因为,你失去了地方,使MapReduce应用非常没有效率

      为了归档目的,考虑Hadoop 归档格式,虽然他不支持压缩。
MapReduce中使用压缩

步骤:

      1.设置mapred.output.compress=true

      2.设置mapred.output.compression.codec=the classname of the above list

      或者

      FileOutputFormat.setCompressOutput(job,true)

      FileOutputFormat.setOutputCompressorClass(job,GzipCodec.class)



Java代码 复制代码 收藏代码
1.public class MaxTemperatureWithCompression { 
2.  public static void main(String[] args) throws Exception { 
3.    if (args.length != 2) { 
4.    System.err.println("Usage: MaxTemperatureWithCompression <input path> " + 
5.    "<output path>"); 
6.    System.exit(-1); 
7.    } 
8.    Job job = new Job(); 
9.    job.setJarByClass(MaxTemperature.class); 
10.    FileInputFormat.addInputPath(job, new Path(args[0])); 
11.    FileOutputFormat.setOutputPath(job, new Path(args[1])); 
12.    job.setOutputKeyClass(Text.class); 
13.    job.setOutputValueClass(IntWritable.class); 
14.<span style="color: rgb(255, 0, 0);">    FileOutputFormat.setCompressOutput(job, true); 
15.    FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);</span> 
16.    job.setMapperClass(MaxTemperatureMapper.class); 
17.    job.setCombinerClass(MaxTemperatureReducer.class); 
18.    job.setReducerClass(MaxTemperatureReducer.class); 

Java代码 复制代码 收藏代码
1.<span style="white-space: normal;"><pre class="java" name="code">System.exit(job.waitForCompletion(true) ? 0 : 1);</pre> 
2.</span> 
3.    } 
4.} 

复制代码收藏代码

   对于SequenceFile格式

   默认压缩类型是RECORD,建议更改为BLOCk,压缩一组record

   SqeuenceFileOutputFormat.setOutputCompressionType()设置这个压缩类型


MapReduce压缩属性汇总


Property name Type Default value Description
mapred.output.compress boolean false Compress outputs
mapred.output.compression.codec Class name org.apache.hadoop.io.compress.DefaultCodec The compression codec to use for outputs
mapred.output.compression.type String RECORD Type type of compression to use for SequenceFile outputs:NONE,RECORD,or BLOCK.

Map阶段压缩输出(即中间结果是否压缩)

建议使用性能比较好的LZO、Snappy

Map 输出压缩属性汇总
Property name Type Default value Description
mapred.compress.map.output boolean false Compress map outputs
mapred.map.output.compression.codec Class org.apache.hadoop.io.compress.DefaultCodec The compression codec to use for map outputs.
Map阶段使用压缩样例

Java代码 复制代码 收藏代码
1.Configuration conf = new Configuration(); 
2.conf.setBoolean("mapred.compress.map.output", true); 
3.conf.setClass("mapred.map.output.compression.codec", GzipCodec.class, 
4.CompressionCodec.class); 
5.Job job = new Job(conf); 

 

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hdfs 压缩] 推荐:

HDFS-压缩

- - Java - 编程语言 - ITeye博客
文件压缩带来了两大益处1)减少存贮空间2)加速网络(磁盘)传输. 基于大数据的传输,都需要经过压缩处理. 压缩格式 工具 算法 文件扩展名 可分块. Java代码 复制代码 收藏代码. 24.        // io.compression.codecs 定义列表中的一个 . Native gzip 库减少解压缩时间在50%,压缩时间在10%(同java实现的压缩算法).

HDFS架构

- - 数据库 - ITeye博客
       在阅读了GFS的论文之后,对GFS的框架有了基本的了解,进一步学习自然是对HDFS的解析,不得不说,之前对GFS的一些了解,对理解HDFS还是很有帮助的,毕竟后者是建立在前者之上的分布式文件系统,二者在框架上可以找到很多的共同点,建议初次接触HFDS的技术人员可以先把GFS的那篇论文啃个两三遍,毕竟磨刀不砍柴工.

Hadoop剖析之HDFS

- - CSDN博客数据库推荐文章
Hadoop的分布式文件系统(HDFS)是Hadoop的很重要的一部分,本文先简单介绍HDFS的几个特点,然后再分析背后的原理,即怎样实现这种特点的. 这是HDFS最核心的特性了,把大量数据部署在便宜的硬件上,即使其中某些磁盘出现故障,HDFS也能很快恢复丢失的数据. 这个的意思是HDFS适合一次写入,多次读取的程序,文件写入后,就不需要修改了.

Hoop:Hadoop HDFS的RESTFul封装

- Vent - NoSQLFan
Hoop是对Hadoop HDFS Proxy 的改良重写,为Hadoop HDFS提供了HTTP(S)的访问接口. 通过标准的HTTP协议访问你的HDFS系统. 在运行不同版本的HDFS之间进行数据交换(这克服了一些RPC方式因版本不同而产生的兼容性问题). 将对HDFS的操作置于防火墙的保护下.

[转]HDFS用户指南

- - 小鸥的博客
本文档可以作为使用Hadoop分布式文件系统用户的起点,无论是将HDFS应用在一个Hadoop集群中还是作为一个单独的分布式文件系统使用. HDFS被设计成可以马上在许多环境中工作起来,那么一些HDFS的运行知识肯定能大大地帮助你对一个集群做配置改进和诊断. HDFS是Hadoop应用的主要分布式存储.

HDFS 读文件分析

- - 经验沉淀 知识结晶
UNIX Domain Socket是在socket架构上发展起来的用于同一台主机的进程间通讯(IPC),它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和 应答等,只是将应用层数据从一个进程拷贝到另一个进程. UNIX Domain Socket有SOCK_DGRAM或SOCK_STREAM两种工作模式,类似于UDP和TCP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱.

Hadoop之HDFS子框架

- - CSDN博客云计算推荐文章
由图片可以看到HDFS主要包含这样几个功能组件. Namenode:存储文档的元数据信息,还有整个文件系统的目录结构. DataNode:存储文档块信息,并且文档块之间是有冗余备份的. 这里面提到了文档块的概念,同本地文件系统一样,HDFS也是按块存储的,只不过块的大小设置的相对大一些,默认为64M.

hdfs-ha热备原理

- - 开源软件 - ITeye博客
下面的总结来自于: http://dongxicheng.org/hadoop-hdfs/hdfs-ha-federation-deploy/ .            Hadoop 2.0中的HDFS增加了两个重大特性,HA和Federaion. HA即为High Availability,用于解决NameNode单点故障问题,该特性通过热备的方式为主NameNode提供一个备用者,一旦主NameNode出现故障,可以迅速切换至备NameNode,从而实现不间断对外提供服务.

Kafka+Storm+HDFS整合实践

- -
原文地址: http://shiyanjun.cn/archives/934.html. 在基于Hadoop平台的很多应用场景中,我们需要对数据进行离线和实时分析,离线分析可以很容易地借助于Hive来实现统计分析,但是对于实时的 需求Hive就不合适了. 实时应用场景可以使用Storm,它是一个实时处理系统,它为实时处理类应用提供了一个计算模型,可以很容易地进行编程处理.

HDFS数据完整性

- - CSDN博客推荐文章
为了保证数据的完整性,一般采用数据校验技术:. 2、md5,sha1等校验技术. 3、CRC-32循环冗余校验技术. 1、HDFS以透明方式校验所有写入的数据,可以通过io.bytes.per.checksum属性设置,字节数默认是512 字节,创建一个单独的校验和,如果节点检测数据错误,就会报 CheckSumException异常.