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 ...
随机推荐
- 深入struts2(三)---工作机制和运行流程图
1 工作原理 1.1 体系架构 图2.1 struts2.0体系架构图 1.2 工作机制 针对上节体系架构图,以下分步说明运行流程 Ø client初始化一个指向Servle ...
- MonkeyRunner于Windows在下面Eclipse开发环境的搭建步骤(并解决在线Jython配置错误的问题)
网上有一shangdong_chu网友写了一篇文章介绍了如何Eclipse构造MonkeyRunner,他做了叙述一个很好的说明.但我对我的环境试验后会见Jython解析错误的问题,和制品缺少Pyde ...
- JS正则替换字符串
1.只替换第一次出现的字符: text.replace(/javascript/i, "JavaScript"); //正则用//来将正则包起来 i表示区分大小写 2.全局替换: ...
- 设置CentOS开机连接网络 Centos 开机启动网卡的设置方法
我们开机网卡不能启动所以只能使用 ifup eth0 (eth0指的网卡) 来启动了,但是每一次都这样感觉不方便希望开机自动启动网卡 后来百度搜索了一下发现可以通过修改网卡( ifcfg-eth0)参 ...
- Linux 下 简单客户端服务器通讯模型(TCP)
原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...
- App根据第,HTML5流行?
App根据第.HTML5流行? 引用新闻 日前,有消息称国家网信办近日将出台APP应用程序发展管理办法.中央网信办主任鲁炜在推进网络空间法治化座谈会上透露.我国将加强互联网立法,依靠严密的法律网来打造 ...
- Java 集合之LinkedList源码分析
1.介绍 链表是数据结构中一种很重要的数据结构,一个链表含有一个或者多个节点,每个节点处理保存自己的信息之外还需要保存上一个节点以及下一个节点的指针信息.通过链表的表头就可以访问整个链表的信息.Jav ...
- javascript 学习总结(九)面向对象编程
1.面向对象的工厂方法 function createPerson(name, age, job){ var o = new Object(); o.name = name; o.age = age; ...
- JBoss7官方下载最新版本
JBoss是全世界开发人员共同努力的成果.一个基于J2EE的开放源码的应用server. 由于JBoss代码遵循LGPL许可,能够在不论什么商业应用中免费使用它.而不用支付费用. 2006年,Jbos ...
- 如何用VB获得Windows各类系统目录
现在有很多关于如何用VB获得Windows目 录的文章,但大都只讲到如何获得Windows目录和System目录,有时候我们却需要获得像"我的文档"这样的目录("我的文档 ...