设为首页 收藏本站
查看: 928|回复: 0

从零开始学习Hadoop--第5章 压缩

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-11 13:35:02 | 显示全部楼层 |阅读模式
1. 压缩从头说
一般来说,数据存在冗余度。数据包括图像文本视频音频。减少数据的冗余度,让数据的体积更小一点,这叫压缩。从压缩后的数据,重新解析出原始数据,叫解压缩。


压缩无处不在。压缩的算法非常多。


Hadoop来说,有两个地方需要用到压缩:其一,在HDFS上存储数据文件,压缩之后数据体积更小,有利存储;其二,集群间的通讯需要压缩数据,这样可以提高网络带宽的利用率。如果用MapReduce处理压缩文件,那么要求压缩算法能支持文件分割,因为MapReduce的过程需要将文件分割成多个切片,如果压缩算法不支持分割,就不能做切片了。

Java里,一切输入输出都用流的方式进行。一个可以读取字节序列的对象叫输入流。文件,网络连接,内存区域,都可以是输入流。一个可以写入字节序列的对象叫输出流。文件,网络连接,内存区域,都可以是输出流。


Hadoop如何压缩?假设,输入流是A,输出流是BAB有很多种可能,可以是文件,网络连接,内存区域,标准输入,标准输出的两两组合。做压缩的话,先选择压缩算法,然后根据压缩算法创建相应的压缩器,然后用压缩器和输出流B创建压缩输出流C,最后,将数据从输入流A复制到压缩输出流C即可进行压缩并输出结果。


如果是解压缩,先选择解压缩算法,然后根据解压缩算法创建相应的解压缩器,然后用解压缩器和输入流A创建压缩输入流C,最后,将数据从输入流C复制到输出流B即可进行解压缩并输出结果。
2.从文件到文件的压缩
2.1 文件和目录结构
这个程序将HDFS上的一个文本文件压缩到另外一个文件。
创建目录~/cprsf2f存放源代码、编译和打包结果。在cprsf2f目录下,有两个子目录,分别是src目录和classes目录,src目录存放Java源代码,class存放编译结果。在src目录下,只有一个源代码文件CprsF2F.java
2.2 CprsF2F.java源文件的代码
packagecom.brianchen.hadoop;


importjava.net.URI;
importjava.io.InputStream;
importjava.io.OutputStream;


importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.io.compress.CompressionCodec;
importorg.apache.hadoop.io.IOUtils;
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.fs.FileSystem;
importorg.apache.hadoop.util.ReflectionUtils;


public classCprsF2F{
public staticvoid main(String[] args) throws Exception{
if(args.length != 3){
System.err.println("Usage:CprsF2F cmps_name src target");
System.exit(2);
}


Class<?>codecClass = Class.forName(args[0]);
Configurationconf = new Configuration();
CompressionCodeccodec = (CompressionCodec)ReflectionUtils.newInstance(codecClass,conf);
InputStreamin = null;
OutputStreamout = null;
FileSystem fs= FileSystem.get(URI.create(args[1]), conf);


try{
in =fs.open(new Path(args[1]));
out =codec.createOutputStream(fs.create(new Path(args[2])));
IOUtils.copyBytes(in,out, conf);
}finally{
IOUtils.closeStream(in);
IOUtils.closeStream(out);
}
}
}




2.3 编译
cd~/cprsf2f”
jvac-cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d./class/ src/*.java”
2.4 打包
jar-cvf cprsf2f.jar -C ./class/ .”
2.5 执行
cd~/usr/hadoop/hadoop-1.2.1”
echo&quot;hellowrod&quot; >> a.txt”
./bin/hadoopfs -put a.txt a.txt”
./bin/hadoopjar /home/brian/cprsf2f/cprsf2f.jar com.brianchen.hadoop.CprsF2Forg.apache.hadoop.io.compress.GzipCodec a.txt b.txt”
./bin/hadoopfs -cat b.txt”
./bin/hadoopfs -cat b.txt|gunzip”
首先需要确认Hadoop已经启动。用echo命令创建一个内容是”helloworld”的文件a.txt。将a.txt文件复制到HDFS。执行jar,将文件a.txt压缩成b.txt。压缩完毕之后,执行cat,检查b.txt内容,这时候显示的是乱码,因为原始内容已经被压缩了。然后再执行“./bin/hadoopfs-cat b.txt | gunzip”,这次会显示出”helloworld”,因为管道命令gunzip会将压缩文件的内容进行解压缩然后输出。
3.从标准输入到文件的压缩
3.1 文件和目录结构
这个程序从标准输入读取字符串,然后讲它压缩到HDFS的文件存储。创建目录~/cprsin2f存放源代码、编译和打包结果。在cprsin2f目录下,有两个子目录,分别是src目录和classes目录,src目录存放Java源代码,class存放编译结果。在src目录下,只有一个源代码文件CprsIn2F.java
3.2 CprsIn2F.java源文件的代码


packagecom.brianchen.hadoop;


importjava.net.URI;
importjava.io.OutputStream;


importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.io.compress.CompressionCodec;
importorg.apache.hadoop.io.IOUtils;
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.fs.FileSystem;
importorg.apache.hadoop.util.ReflectionUtils;


public classCprsIn2F{
public staticvoid main(String[] args) throws Exception{
if(args.length != 2){
System.err.println(&quot;Usage:CprsIn2F cmps_name target&quot;);
System.exit(2);
}


Class<?>codecClass = Class.forName(args[0]);
Configurationconf = new Configuration();
CompressionCodeccodec = (CompressionCodec)ReflectionUtils.newInstance(codecClass,conf);
OutputStreamout = null;
FileSystem fs= FileSystem.get(URI.create(args[1]), conf);
try{
out =codec.createOutputStream(fs.create(new Path(args[1])));
IOUtils.copyBytes(System.in,out, 4096, false);
}finally{
IOUtils.closeStream(out);
}
}
}


3.3 编译
cd~/cprsin2f”
jvac-cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d./class/ src/*.java”
3.4 打包
jar-cvf cprsf2f.jar -C ./class/ .”
3.5 执行
cd~/usr/hadoop/hadoop-1.2.1”
echo“hello, world!” | ./bin/hadoop jar/home/brian/cprsf2f/cprsf2f.jar com.brianchen.hadoop.CprsF2Forg.apache.hadoop.io.compress.GzipCodec hello.txt”
./bin/hadoopfs -cat hello.txt”
./bin/hadoopfs -cat hello.txt|gunzip”
首先需要确认Hadoop已经启动。注意,第二行的命令的双引号需要写上去,这是表示输出字符串。用echo命令将”helloworld”输出到标准输入,然后用管道的方式执行jar,将标准输入的字符串压缩到HDFShello.txt。“org.apache.hadoop.io.compress.GzipCodec”,这个是HadoopGzip压缩器类的类名。压缩完毕之后,执行cat,检查hello.txt内容,这时候显示的是乱码,因为原始内容已经被压缩了。然后再执行“./bin/hadoopfs-cat hello.txt | gunzip”,这次会显示出”hello,world!”,因为管道命令gunzip会将压缩文件的内容进行解压缩然后输出。
4从文件到文件的解压缩
4.1 文件和目录结构
这个程序把压缩文件压解缩到另外一个文件。创建目录~/dcprsf2f存放源代码、编译和打包结果。在dcprsf2f目录下,有两个子目录,分别是src目录和classes目录,src目录存放Java源代码,class存放编译结果。在src目录下,只有一个源代码文件DcprsF2F.java
4.2 DcprsF2F.java源文件的代码


packagecom.brianchen.hadoop;


importjava.net.URI;
importjava.io.InputStream;
importjava.io.OutputStream;


importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.io.compress.CompressionCodec;
importorg.apache.hadoop.io.IOUtils;
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.fs.FileSystem;
importorg.apache.hadoop.util.ReflectionUtils;


public classDcprsF2F{
public staticvoid main(String[] args) throws Exception{
if(args.length != 3){
System.err.println(&quot;Usage:CprsF2F cmps_name src target&quot;);
System.exit(2);
}


Class<?>codecClass = Class.forName(args[0]);
Configurationconf = new Configuration();
CompressionCodeccodec = (CompressionCodec)ReflectionUtils.newInstance(codecClass,conf);
InputStreamin = null;
OutputStreamout = null;
FileSystem fs= FileSystem.get(URI.create(args[1]), conf);
try{
in =codec.createInputStream(fs.open(new Path(args[1])),codec.createDecompressor());
out =fs.create(new Path(args[2]));
IOUtils.copyBytes(in,out, conf);
}finally{
IOUtils.closeStream(in);
IOUtils.closeStream(out);
}
}
}


4.3 编译
cd~/dcprsf2f”
jvac-cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d./class/ src/*.java”
4.4 打包
jar-cvf dcprsf2f.jar -C ./class/ .”
4.5 执行
cd~/usr/hadoop/hadoop-1.2.1”
./bin/hadoopjar /home/brian/cprsf2f/cprsf2f.jar com.brianchen.hadoop.DcprsF2Forg.apache.hadoop.io.compress.GzipCodec hello.txt hello_dec.txt”
./bin/hadoopfs -cat hello.txt”
./bin/hadoopfs -cat hello_dec.txt”
首先需要确认Hadoop已经启动。压缩文件hello.txt5.3节创建的,在这里直接使用。将压缩文件hello.txt解压缩到文件hello_c.txt。“org.apache.hadoop.io.compress.GzipCodec”,这个是HadoopGzip压缩器类的类名。压缩完毕之后,执行cat,检查hello.txt内容,这时候显示的是乱码。然后再执行“./bin/hadoopfs-cat hello_dec.txt”,这次会显示出”hello,world!”
         版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-137932-1-1.html 上篇帖子: Hadoop单节点环境搭建 下篇帖子: Hadoop 1.2.1升级2.6.0的一次崎岖之旅(包括Hive、HBase对应的升级)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表