HDFS中文件的压缩与解压
文件的压缩有两大好处:1、可以减少存储文件所需要的磁盘空间;2、可以加速数据在网络和磁盘上的传输。尤其是在处理大数据时,这两大好处是相当重要的。
下面是一个使用gzip工具压缩文件的例子。将文件/user/hadoop/aa.txt进行压缩,压缩后为/user/hadoop/text.gz

1 package com.hdfs;
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.FSDataInputStream;
10 import org.apache.hadoop.fs.FSDataOutputStream;
11 import org.apache.hadoop.fs.FileSystem;
12 import org.apache.hadoop.fs.Path;
13 import org.apache.hadoop.io.IOUtils;
14 import org.apache.hadoop.io.compress.CompressionCodec;
15 import org.apache.hadoop.io.compress.CompressionCodecFactory;
16 import org.apache.hadoop.io.compress.CompressionInputStream;
17 import org.apache.hadoop.io.compress.CompressionOutputStream;
18 import org.apache.hadoop.util.ReflectionUtils;
19
20 public class CodecTest {
21 //压缩文件
22 public static void compress(String codecClassName) throws Exception{
23 Class<?> codecClass = Class.forName(codecClassName);
24 Configuration conf = new Configuration();
25 FileSystem fs = FileSystem.get(conf);
26 CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(codecClass, conf);
27 //指定压缩文件路径
28 FSDataOutputStream outputStream = fs.create(new Path("/user/hadoop/text.gz"));
29 //指定要被压缩的文件路径
30 FSDataInputStream in = fs.open(new Path("/user/hadoop/aa.txt"));
31 //创建压缩输出流
32 CompressionOutputStream out = codec.createOutputStream(outputStream);
33 IOUtils.copyBytes(in, out, conf);
34 IOUtils.closeStream(in);
35 IOUtils.closeStream(out);
36 }
37
38 //解压缩
39 public static void uncompress(String fileName) throws Exception{
40 Class<?> codecClass = Class.forName("org.apache.hadoop.io.compress.GzipCodec");
41 Configuration conf = new Configuration();
42 FileSystem fs = FileSystem.get(conf);
43 CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(codecClass, conf);
44 FSDataInputStream inputStream = fs.open(new Path("/user/hadoop/text.gz"));
45 //把text文件里到数据解压,然后输出到控制台
46 InputStream in = codec.createInputStream(inputStream);
47 IOUtils.copyBytes(in, System.out, conf);
48 IOUtils.closeStream(in);
49 }
50
51 //使用文件扩展名来推断二来的codec来对文件进行解压缩
52 public static void uncompress1(String uri) throws IOException{
53 Configuration conf = new Configuration();
54 FileSystem fs = FileSystem.get(URI.create(uri), conf);
55
56 Path inputPath = new Path(uri);
57 CompressionCodecFactory factory = new CompressionCodecFactory(conf);
58 CompressionCodec codec = factory.getCodec(inputPath);
59 if(codec == null){
60 System.out.println("no codec found for " + uri);
61 System.exit(1);
62 }
63 String outputUri = CompressionCodecFactory.removeSuffix(uri, codec.getDefaultExtension());
64 InputStream in = null;
65 OutputStream out = null;
66 try {
67 in = codec.createInputStream(fs.open(inputPath));
68 out = fs.create(new Path(outputUri));
69 IOUtils.copyBytes(in, out, conf);
70 } finally{
71 IOUtils.closeStream(out);
72 IOUtils.closeStream(in);
73 }
74 }
75
76 public static void main(String[] args) throws Exception {
77 //compress("org.apache.hadoop.io.compress.GzipCodec");
78 //uncompress("text");
79 uncompress1("hdfs://master:9000/user/hadoop/text.gz");
80 }
81
82 }

首先执行77行进行压缩,压缩后执行第78行进行解压缩,这里解压到标准输出,所以执行78行会再控制台看到文件/user/hadoop/aa.txt的内容。如果执行79行的话会将文件解压到/user/hadoop/text,他是根据/user/hadoop/text.gz的扩展名判断使用哪个解压工具进行解压的。解压后的路径就是去掉扩展名。
进行文件压缩后,在执行命令./hadoop fs -ls /user/hadoop/查看文件信息,如下:

1 [hadoop@master bin]$ ./hadoop fs -ls /user/hadoop/
2 Found 7 items
3 -rw-r--r-- 3 hadoop supergroup 76805248 2013-06-17 23:55 /user/hadoop/aa.mp4
4 -rw-r--r-- 3 hadoop supergroup 520 2013-06-17 22:29 /user/hadoop/aa.txt
5 drwxr-xr-x - hadoop supergroup 0 2013-06-16 17:19 /user/hadoop/input
6 drwxr-xr-x - hadoop supergroup 0 2013-06-16 19:32 /user/hadoop/output
7 drwxr-xr-x - hadoop supergroup 0 2013-06-18 17:08 /user/hadoop/test
8 drwxr-xr-x - hadoop supergroup 0 2013-06-18 19:45 /user/hadoop/test1
9 -rw-r--r-- 3 hadoop supergroup 46 2013-06-19 20:09 /user/hadoop/text.gz

第4行为压缩之前的文件,大小为520个字节。第9行为压缩后的文件,大小为46个字节。由此可以看出上面讲的压缩的两大好处了。
HDFS中文件的压缩与解压的更多相关文章
- Asp.net中文件的压缩与解压
这里笔者为大家介绍在asp.net中使用文件的压缩与解压.在asp.net中使用压缩给大家带来的好处是显而易见的,首先是减小了服务器端文件存储的空间,其次下载时候下载的是压缩文件想必也会有效果吧,特别 ...
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
XML序列化 #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...
- C#调用7z实现文件的压缩与解压
1.关于7z 首先在这里先介绍一下7z压缩软件,7z是一种主流的 压缩格式,它拥有极高的压缩比.在计算机科学中,7z是一种可以使用多种压缩算法进行数据压缩的档案格式.主要有以下特点: 来源且模块化的组 ...
- C# -- 文件的压缩与解压(GZipStream)
文件的压缩与解压 需引入 System.IO.Compression; 1.C#代码(入门案例) Console.WriteLine("压缩文件..............."); ...
- linux下tar gz bz2 tgz z等众多压缩文件的压缩与解压方法
Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲ta ...
- 浅谈在c#中使用Zlib压缩与解压的方法
作者:Compasslg 介绍 近期用c#开发一个游戏的存档编辑工具需要用 Zlib 标准的 Deflate 算法对数据进行解压. 在 StackOverflow 上逛了一圈,发现 c# 比较常用到的 ...
- C#使用ICSharpCode.SharpZipLib.dll进行文件的压缩与解压
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- 文件的压缩与解压XZip,XUnzip
参考http://www.codeproject.com/KB/cpp/xzipunzip.aspx CreateZip() –创建一个空的 zip 文件 HZIP CreateZip(void *z ...
- cmd实现cab文件的压缩与解压
压缩(makecab): 1.单文件压缩 makecab ip2.txt ip2.txt.cab 2.多文件压缩 makecab /f c:\list.txt /d expresstype=mszip ...
随机推荐
- 菜鸟进阶Android Touch事件传递(四)
尊重他人劳动成果,转载请说明出处:http://blog.csdn.net/bingospunky/article/details/44343477 在该系列文章第四篇.我准备介绍一下viewpage ...
- 找呀志_通过开源框架引AsyncHttpClient处理get/post要求
一个.开源参考架构的方法. 方法一 找到下载的文件的源代码,Com中的src文件夹下 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhemhp ...
- 虚拟局域网(VLAN)组态
图1 实验拓扑图 实验内容: (一)分别把交换机命名为SWA,SWB. (二)划分虚拟局域网vlan,并静态地把port划分到valn中. 第一.使用两种方法划分vlan. l 在全局模式下划分vl ...
- APP 半自适应 WEB页面
特别赶,响应式纯自适应的,有空写了新的发. (在手机上看,页面上看一定乱) <!DOCTYPE html><html> <head> <meta http-e ...
- Beginning Python From Novice to Professional (5) - 条件与循环
条件与循环 条件运行: name = raw_input('What is your name? ') if name.endswith('Gumby'): print 'Hello, Mr.Gumb ...
- Hibernate实体映射配置(XML)简单三步完美配置
我们在使用Hibernate框架的时候,非常纠结的地方就是实体和表之间的映射,今天借助汤老师的思路写了小教程,以后配置不用纠结了! 第一步:写注释 格式为:?属性,表达的是本对象与?的?关系. 例:“ ...
- .NET源代码的内部排序实现
使用JetBrains的DotPeek工具能够方便地查看.net的部分源代码.于是看了一下.NET的内部是怎样实现排序的算法. 在System.Collections.Generic 命名空间下能够看 ...
- ViewPaper实现轮播广告条
使用V4包中的viewPaper组件自己定义轮播广告条效果. 实现viewpaper的滑动切换和定时自己主动切换效果. 上效果图 布局文件 <RelativeLayout xmlns:andro ...
- Java 类的成员初始化顺序
做个简单笔录,就当是重温下基础知识. 1.先看代码: package com.test; public class Test { public static void main(String[] ar ...
- 空间闹钟-v1.6更新!
(假设图片无法显示可查看我的qq空间:http://user.qzone.qq.com/805853418/blog/1398785778) 生活助手系列--空间闹钟================= ...