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

相关文章
|
分布式计算 Hadoop 大数据
【大数据开发技术】实验05-HDFS目录与文件的创建删除与查询操作
【大数据开发技术】实验05-HDFS目录与文件的创建删除与查询操作
178 0
|
分布式计算 Hadoop 大数据
【大数据开发技术】实验04-HDFS文件创建与写入
【大数据开发技术】实验04-HDFS文件创建与写入
281 0
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
52 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
23天前
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(二)
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(二)
36 3
|
23天前
|
分布式计算 Java Hadoop
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(一)
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(一)
36 2
|
23天前
|
分布式计算 Hadoop 网络安全
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
26 1
|
23天前
|
存储 机器学习/深度学习 缓存
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
37 1
|
3月前
|
存储 分布式计算 Hadoop
|
4月前
|
分布式计算 Hadoop 关系型数据库
实时计算 Flink版操作报错合集之Hadoop在将文件写入HDFS时,无法在所有指定的数据节点上进行复制,该如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5月前
|
SQL JSON 数据处理
实时计算 Flink版产品使用问题之把hdfs集群里的core-site.xml hdfs.xml两个文件放到flink/conf/目录下,启动集群说找不到hdfs,该如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。