HDFS支持数据压缩的几种方法探讨
来源:互联网 发布:进出口报关软件 编辑:程序博客网 时间:2024/06/05 02:11
HDFS支持数据压缩存在以下几种方法:
1、在HDFS之上将数据压缩好后,再存储到HDFS
2、在HDFS内部支持数据压缩,这里又可以分为几种方法:
2.1、压缩工作在DataNode上完成,这里又分两种方法:
2.1.1、数据接收完后,再压缩
这个方法对HDFS的改动最小,但效果最低,只需要在block文件close后,调用压缩工具,将block文件压缩一下,然后再打开block文件时解压一下即可,几行代码就可以搞定
2.1.2、边接收数据边压缩,使用第三方提供的压缩库
效率和复杂度折中方法,Hook住系统的write和read操作,在数据写入磁盘之前,先压缩一下,但write和read对外的接口行为不变,比如:原始大小为100KB的数据,压缩后大小为10KB,当写入100KB后,仍对调用者返回100KB,而不是10KB
2.2、压缩工作交给DFSClient做,DataNode只接收和存储
这个方法效果最高,压缩分散地推给了HDFS客户端,但DataNode需要知道什么时候一个block块接收完成了。
复制代码首先执行77行进行压缩,压缩后执行第78行进行解压缩,这里解压到标准输出,所以执行78行会再控制台看到文件/user/hadoop/aa.txt的内容。如果执行79行的话会将文件解压到/user/hadoop/text,他是根据/user/hadoop/text.gz的扩展名判断使用哪个解压工具进行解压的。解压后的路径就是去掉扩展名。
进行文件压缩后,在执行命令./hadoop fs -ls /user/hadoop/查看文件信息,如下:
1、在HDFS之上将数据压缩好后,再存储到HDFS
2、在HDFS内部支持数据压缩,这里又可以分为几种方法:
2.1、压缩工作在DataNode上完成,这里又分两种方法:
2.1.1、数据接收完后,再压缩
这个方法对HDFS的改动最小,但效果最低,只需要在block文件close后,调用压缩工具,将block文件压缩一下,然后再打开block文件时解压一下即可,几行代码就可以搞定
2.1.2、边接收数据边压缩,使用第三方提供的压缩库
效率和复杂度折中方法,Hook住系统的write和read操作,在数据写入磁盘之前,先压缩一下,但write和read对外的接口行为不变,比如:原始大小为100KB的数据,压缩后大小为10KB,当写入100KB后,仍对调用者返回100KB,而不是10KB
2.2、压缩工作交给DFSClient做,DataNode只接收和存储
这个方法效果最高,压缩分散地推给了HDFS客户端,但DataNode需要知道什么时候一个block块接收完成了。
推荐最终实现采用2.2这个方法,该方法需要修改的HDFS代码量也不大,但效果最高。
这里举一个例子:
先说文件的压缩有两大好处:1、可以减少存储文件所需要的磁盘空间;2、可以加速数据在网络和磁盘上的传输。尤其是在处理大数据时,这两大好处是相当重要的。
下面是一个使用gzip工具压缩文件的例子。将文件/user/hadoop/aa.txt进行压缩,压缩后为/user/hadoop/text.gz
- package com.hdfs;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.URI;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.FSDataInputStream;
- import org.apache.hadoop.fs.FSDataOutputStream;
- import org.apache.hadoop.fs.FileSystem;
- import org.apache.hadoop.fs.Path;
- import org.apache.hadoop.io.IOUtils;
- import org.apache.hadoop.io.compress.CompressionCodec;
- import org.apache.hadoop.io.compress.CompressionCodecFactory;
- import org.apache.hadoop.io.compress.CompressionInputStream;
- import org.apache.hadoop.io.compress.CompressionOutputStream;
- import org.apache.hadoop.util.ReflectionUtils;
- public class CodecTest {
- //压缩文件
- public static void compress(String codecClassName) throws Exception{
- Class<?> codecClass = Class.forName(codecClassName);
- Configuration conf = new Configuration();
- FileSystem fs = FileSystem.get(conf);
- CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(codecClass, conf);
- //指定压缩文件路径
- FSDataOutputStream outputStream = fs.create(new Path("/user/hadoop/text.gz"));
- //指定要被压缩的文件路径
- FSDataInputStream in = fs.open(new Path("/user/hadoop/aa.txt"));
- //创建压缩输出流
- CompressionOutputStream out = codec.createOutputStream(outputStream);
- IOUtils.copyBytes(in, out, conf);
- IOUtils.closeStream(in);
- IOUtils.closeStream(out);
- }
-
- //解压缩
- public static void uncompress(String fileName) throws Exception{
- Class<?> codecClass = Class.forName("org.apache.hadoop.io.compress.GzipCodec");
- Configuration conf = new Configuration();
- FileSystem fs = FileSystem.get(conf);
- CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(codecClass, conf);
- FSDataInputStream inputStream = fs.open(new Path("/user/hadoop/text.gz"));
- //把text文件里到数据解压,然后输出到控制台
- InputStream in = codec.createInputStream(inputStream);
- IOUtils.copyBytes(in, System.out, conf);
- IOUtils.closeStream(in);
- }
-
- //使用文件扩展名来推断二来的codec来对文件进行解压缩
- public static void uncompress1(String uri) throws IOException{
- Configuration conf = new Configuration();
- FileSystem fs = FileSystem.get(URI.create(uri), conf);
-
- Path inputPath = new Path(uri);
- CompressionCodecFactory factory = new CompressionCodecFactory(conf);
- CompressionCodec codec = factory.getCodec(inputPath);
- if(codec == null){
- System.out.println("no codec found for " + uri);
- System.exit(1);
- }
- String outputUri = CompressionCodecFactory.removeSuffix(uri, codec.getDefaultExtension());
- InputStream in = null;
- OutputStream out = null;
- try {
- in = codec.createInputStream(fs.open(inputPath));
- out = fs.create(new Path(outputUri));
- IOUtils.copyBytes(in, out, conf);
- } finally{
- IOUtils.closeStream(out);
- IOUtils.closeStream(in);
- }
- }
-
- public static void main(String[] args) throws Exception {
- //compress("org.apache.hadoop.io.compress.GzipCodec");
- //uncompress("text");
- uncompress1("hdfs://master:9000/user/hadoop/text.gz");
- }
- }
进行文件压缩后,在执行命令./hadoop fs -ls /user/hadoop/查看文件信息,如下:
- [hadoop@master bin]$ ./hadoop fs -ls /user/hadoop/
- Found 7 items
- -rw-r--r-- 3 hadoop supergroup 76805248 2013-06-17 23:55 /user/hadoop/aa.mp4
- -rw-r--r-- 3 hadoop supergroup 520 2013-06-17 22:29 /user/hadoop/aa.txt
- drwxr-xr-x - hadoop supergroup 0 2013-06-16 17:19 /user/hadoop/input
- drwxr-xr-x - hadoop supergroup 0 2013-06-16 19:32 /user/hadoop/output
- drwxr-xr-x - hadoop supergroup 0 2013-06-18 17:08 /user/hadoop/test
- drwxr-xr-x - hadoop supergroup 0 2013-06-18 19:45 /user/hadoop/test1
- -rw-r--r-- 3 hadoop supergroup 46 2013-06-19 20:09 /user/hadoop/text.gz
0 0
- HDFS支持数据压缩的几种方法探讨
- hdfs的数据压缩
- 探讨DataGrid的几种分页方法的优劣
- 探讨android更新UI的几种方法
- 探讨android更新UI的几种方法
- java同步技术的几种方法探讨
- 探讨android更新UI的几种方法
- 探讨android更新UI的几种方法
- 探讨Android更新UI的几种方法
- 实用的数据压缩解压缩方法
- hdfs数据压缩方案
- java 同步的几种探讨
- 关于几种多线程模型的探讨
- 关于几种多线程模型的探讨
- 详解--访问HDFS的几种方式
- 转载: 愚翁专栏 探讨DataGrid的几种分页方法的优劣
- 探讨android更新UI的几种方法(不错的文章,很适合新手学习)
- Handler的应用---探讨android更新UI的几种方法
- When working with arrays
- 几道有意思的java编程题目
- hdu1029Ignatius and the Princess IV
- flexigrid 绑定事件process以及对行列的操作
- POj 1017-Packets
- HDFS支持数据压缩的几种方法探讨
- 黑马程序员:Collection集合类
- 反向Ajax,第2部分:WebSocket
- book.douban.com/doulist/4296697/
- [Java]JVM简介
- JAVA值传递机制
- table分页点击最后一页按钮不是显示剩余条数,而是默认显示每页条数
- NYOJ-248 BUYING FEED
- python first day