fs hadoop 压缩_Hadoop压缩

本文介绍了Hadoop中的文件压缩,包括压缩的好处、常见的压缩格式如DEFLATE、Gzip、bzip2和LZO,以及它们的特性。讨论了是否可分割对MapReduce的影响,并列举了Hadoop中实现的压缩codec。最后通过一个示例展示了如何使用GzipCodec进行文件的压缩和解压缩操作。
摘要由CSDN通过智能技术生成

1.文件压缩简单说明

文件压缩有两大好处:可以减少文件存储所需要的磁盘空间,其次是可以加快数据在网络和磁盘上的传输。windows上的压缩算法有好多中,rar,zip等等,同理,在Hadoop中,压缩算法也有多种,下面是Hadoop中常见的压缩算法。

压缩格式总结压缩格式

工具

算法

文件扩展名

是否包含多个文件

是否可切分

DEFLATE*

N/A

DEFLATE

.deflate

Gzip

gzip

DEFLATE

.gz

bzip2

bzip2

bzip2

.bz2

LZO

Lzop

LZO

.lzo

所有的压缩算法都需要权衡时间和空间:压缩或者解压速度越快,其代价通常是只能节省少量的磁盘空间!了解Linux压缩算法的都知道,压缩算法提供了一个参数来衡量压缩比(-#),压缩等级为1~9,1表示压缩比最差 ,压缩或者解压最快,9表示压缩比最好,最慢最节省空间!

不同的压缩工具具有不同的压缩特性。gzip是一个通用的压缩工具,在时间/空间的权衡中,居于其余两个中间。N/A一般不用,因为和gzip的压缩性能一样,一般都用gzip。bzip2比gzip更高效,但是压缩速率更更慢一点。bzip2的解压速度比压缩速度快,但与其他压缩格式相比,仍然要慢一些。LZO的优化压缩速度,其速度比gzip等其他压缩工具更快,但压缩率不如gzip。

是否可分割,也就是是否可以搜索数据流的任意位置并进一步往下读取数据。可分割压缩格式尤其使用与MapReduce。

2.对应类

codec实现了一种压缩-解压算法。在Hadoop中,一个对CompressionCodec接口的实现代表一个codec。下表列出了Hadoop实现的codec。

Hadoop中的压缩codec

压缩格式

HadoopCompressionCodec

DEFLATE

org.apache.hadoop.io.compress.DefaultCodc

gzip

org.apache.hadoop.io.compress.GzipCodec

bzip2

org.apache.hadoop.io.compress.BZip2Codec

LZO

com.hadoop.compression.lzo.LzopCodec

3.CompressionCodec

CompressionCodec中包含两个方法用于压缩和解压数据。如果对写入 输出数据流的数据进行压缩,可用CreateOutputStream(OutStream out)方法在底层的数据流中对需要以压缩格式写入的数据(尚未压缩)的数据新建一个CompressionOutputStream对象。相反,如果要对输入数据流中读取数据进行解压缩的时候,则调用CreateInputStream(InputStream in)获取CompressionInputStream,可以通过该方法从底层数据流中读取解压缩后的数据。

实例1:从本地读取一个文件,将压缩数据写入Hadoop中另一个文件中,然后,将压缩数据以标准格数据流输出

1 packagecn.roboson.codec;2

3 importjava.io.BufferedInputStream;4 importjava.io.File;5 importjava.io.FileInputStream;6 importjava.io.FileNotFoundException;7 importjava.io.IOException;8

9 importorg.apache.hadoop.conf.Configuration;10 importorg.apache.hadoop.fs.FSDataInputStream;11 importorg.apache.hadoop.fs.FSDataOutputStream;12 importorg.apache.hadoop.fs.FileStatus;13 importorg.apache.hadoop.fs.FileSystem;14 importorg.apache.hadoop.fs.Path;15 importorg.apache.hadoop.io.IOUtils;16 importorg.apache.hadoop.io.compress.CompressionCodec;17 importorg.apache.hadoop.io.compress.CompressionInputStream;18 importorg.apache.hadoop.io.compress.CompressionOutputStream;19 importorg.apache.hadoop.util.ReflectionUtils;20

21 public classStreamCompressor01 {22

23 public static voidmain(String[] args) {24 String codecClassName="org.apache.hadoop.io.compress.GzipCodec";25 try{26 //通过反射实现一个codec

27 Configuration conf = newConfiguration();28 conf.addResource("core-site.xml");29 Class> codecClass =Class.forName(codecClassName);30 CompressionCodec codec=(CompressionCodec) ReflectionUtils.newInstance(codecClass, conf);31

32 //本地文件路径和Hadoop文件路径

33 String localsrc ="/home/roboson/桌面/README.txt";34 String hadoopdsc ="/roboson/README";35

36 //写入前,Hadoop文件系统中/roboson下的文件列表

37 FileSystem fs =FileSystem.get(conf);38 FileStatus [] files = fs.listStatus(new Path("/roboson/"));39 System.out.println("文件的个数:"+files.length);40 for(FileStatus fileStatus : files) {41 System.out.println(fileStatus.getPath());42 }43

44 //获得本地文件的输入流

45 BufferedInputStream in = new BufferedInputStream(new FileInputStream(newFile(localsrc)));46 FSDataOutputStream out =fs.create(newPath(hadoopdsc));47

48 //获得CompressionOutputStream以便对写入 输出数据流的数据进行压缩

49 CompressionOutputStream codecOut =codec.createOutputStream(out);50

51 //通过IOUtils将本地文件写入到Hadoop文件系统中

52 IOUtils.copyBytes(in, codecOut, conf,true);53

54 //写入后,Hadoop文件系统中/roboson下的文件列表

55 files = fs.listStatus(new Path("/roboson/"));56 System.out.println("文件的个数:"+files.length);57 for(FileStatus fileStatus : files) {58 System.out.println(fileStatus.getPath());59 }60

61 //获得输入数据流

62 FSDataInputStream dIn = fs.open(newPath(hadoopdsc));63

64 //获得CompressionInputStream以便对输入数据流中读取的数据进行解压

65 CompressionInputStream codecIn =codec.createInputStream(dIn);66

67 //通过IOUtils将数据输出到控制台

68 IOUtils.copyBytes(codecIn, System.out, conf,true);69 } catch(ClassNotFoundException e) {70 //TODO Auto-generated catch block

71 e.printStackTrace();72 } catch(FileNotFoundException e) {73 //TODO Auto-generated catch block

74 e.printStackTrace();75 } catch(IOException e) {76 //TODO Auto-generated catch block

77 e.printStackTrace();78 }79

80 }81 }

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值