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个字节。由此可以看出上面讲的压缩的两大好处了。

我喜欢,驾驭着代码在风驰电掣中创造完美!我喜欢,操纵着代码在随必所欲中体验生活!我喜欢,书写着代码在时代浪潮中完成经典!每一段新的代码在我手中诞生对我来说就象观看刹那花开的感动!
欢迎分享与转载
0
 
分类: hadoop
标签: hadoopHDFS

HDFS中文件的压缩与解压的更多相关文章

  1. Asp.net中文件的压缩与解压

    这里笔者为大家介绍在asp.net中使用文件的压缩与解压.在asp.net中使用压缩给大家带来的好处是显而易见的,首先是减小了服务器端文件存储的空间,其次下载时候下载的是压缩文件想必也会有效果吧,特别 ...

  2. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

  3. C#调用7z实现文件的压缩与解压

    1.关于7z 首先在这里先介绍一下7z压缩软件,7z是一种主流的 压缩格式,它拥有极高的压缩比.在计算机科学中,7z是一种可以使用多种压缩算法进行数据压缩的档案格式.主要有以下特点: 来源且模块化的组 ...

  4. C# -- 文件的压缩与解压(GZipStream)

    文件的压缩与解压 需引入 System.IO.Compression; 1.C#代码(入门案例) Console.WriteLine("压缩文件..............."); ...

  5. linux下tar gz bz2 tgz z等众多压缩文件的压缩与解压方法

    Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲ta ...

  6. 浅谈在c#中使用Zlib压缩与解压的方法

    作者:Compasslg 介绍 近期用c#开发一个游戏的存档编辑工具需要用 Zlib 标准的 Deflate 算法对数据进行解压. 在 StackOverflow 上逛了一圈,发现 c# 比较常用到的 ...

  7. C#使用ICSharpCode.SharpZipLib.dll进行文件的压缩与解压

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  8. 文件的压缩与解压XZip,XUnzip

    参考http://www.codeproject.com/KB/cpp/xzipunzip.aspx CreateZip() –创建一个空的 zip 文件 HZIP CreateZip(void *z ...

  9. cmd实现cab文件的压缩与解压

    压缩(makecab): 1.单文件压缩 makecab ip2.txt ip2.txt.cab 2.多文件压缩 makecab /f c:\list.txt /d expresstype=mszip ...

随机推荐

  1. GitHub上整理

    GitHub上整理 技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应 ...

  2. [ACM] POJ 2506 Tiling (递归,睑板)

    Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7487   Accepted: 3661 Descriptio ...

  3. ubuntu安装wine之后进不了系统

    以前曾经装过一次wine,安装的时候没碰到什么问题,但卸载的时候却出问题了,把我nouvean显卡给删除了. 自然,我下一次启动的时候就进不了桌面了.所以我得重装一次,那一次重装的是整个系统! 今天突 ...

  4. 自己编译的openwrt在开机时一直打印jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found...的错误提示

    具体的输入信息是这样的. uboot> http Link down: eth0 Ethernet mode (duplex/speed): / Mbps HTTP server is star ...

  5. 让Xcode Lua 语法高亮

    本人不太喜欢用code ide 还是喜欢XCODE的风格 1.让Xcode支援Lua语法高亮(Syntax Highlighting) 1. 下载https://github.com/breinhar ...

  6. nginx+lua+redis高并发应用建设

    ngx_lua将lua嵌nginx,让nginx运行lua脚本.高并发,非堵塞过程中的各种请求. url要求nginxserver,然后lua查询redis,返回json数据. 一.安装lua-ngi ...

  7. beanutils设置参数和获取参数

    public class Employee implements DynaBean  { private String  firstName="李";    private Str ...

  8. Forget Java to learn Javascript from 0.--Day 1

    The first day,when I read 'we need practice so we need a Javascript Interpreter.','Every browser has ...

  9. Visual Studio 换颜色

    --- 给 Visual Studio 换颜色 “为革命,保护视力,预防近视,眼保健操开始......” 这个应该是最老版本的眼保健操了,你听过? 一堆废话 且不说上面这个眼保健操到底有木有用,让眼睛 ...

  10. python包

    有个伟人说过: python的学习很大一部分取决与你对第三方包的熟悉和掌握程度! virtualenv virtualenv用于创建独立的Python环境,多个Python相互独立,互不影响,它能够: ...