hadoop笔记四:hadoop io的压缩和编解码工具

1.压缩

压缩在大数据中的优势:减少储存文件所需要的磁盘空间,并加速数据在网络和磁盘上的传输。

压缩格式:

143915_Idd2_3100849.png

Gzip和bzip2比较时,bzip2的压缩率(压缩之后的大小除以源文件的大小)要小,所以说bzip2的压缩效果好。而这里就会压缩和解压缩的时候浪费更多的时间。

2.编解码工具

codec实现了一种压缩和解压缩算法(意思就是codec使用相关的算法对数据进行编码和解码)。在Hadoop中,一个对CompressionCodec接口的实现代表一个codec。

144145_odAs_3100849.png

对于不同的压缩算法有不同的编解码工具。获取编解码工具的方式有两种,1是根据文件扩展名让程序自己去选择相应的编解码工具,2是直接指定编解码工具。

3.java编程操作文件压缩和解压缩

1.实现编解码的流程,是在对文件读写时在流中对文件进行编码和解码。

144532_I1Be_3100849.png

2. 编解码相关的类或方法

145020_IiAN_3100849.png

CompressionCodec接口中

145046_MTqA_3100849.png

CompressionCodecFactory类

145233_8ujr_3100849.png

3.代码实例

实例1:将本地文件上传压缩到HDFS集群中

package com.jf.hdfs;

import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocalFileSystem;
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.CompressionOutputStream;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class WriteComPressionFile extends Configured implements Tool {

	public int run(String[] args) throws Exception {
		Configuration conf = getConf();
		String input = conf.get("input");
		String output = conf.get("output");
		// 本地文件系统
		LocalFileSystem lfs = FileSystem.getLocal(conf);
		// 集群文件系统
		FileSystem fs = FileSystem.get(URI.create(output), conf);
		// 读取本地文件的输入流
		FSDataInputStream is = lfs.open(new Path(input));
		// 向集群写文件的输出流
		FSDataOutputStream os = fs.create(new Path(output));

		CompressionCodecFactory ccf = new CompressionCodecFactory(conf);
		// 根据文件后缀名选择编解码工具
		CompressionCodec codec = ccf.getCodec(new Path(output));
		// 代编解码工具的输出流
		CompressionOutputStream cos = codec.createOutputStream(os);

		IOUtils.copyBytes(is, cos, 1024, true);
		// 输出选择的编解码工具名称
		System.out.println(codec.getClass().getName());
		return 0;
	}

	public static void main(String[] args) throws Exception {
		System.exit(ToolRunner.run(new WriteComPressionFile(), args));
	}

}

执行测试:上传server.log文件到集成环境中并命名为server.log.bz2

hadoop-2.7.1/bin/hadoop jar my_hadoop-0.0.1-SNAPSHOT.jar com.jf.hdfs.WriteComPressionFile -Doutput=/user/root/input/server.log.bz2 -Dinput=/home/softwares/server.log

执行结果:输出使用的编解码工具

152502_A7Dy_3100849.png

查看集群内上传路径:

152602_CAlp_3100849.png

实例2:将实例1中上传的文件解压到本地环境

package com.jf.hdfs;

import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocalFileSystem;
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.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class ReadCompressionFile extends Configured implements Tool {

	public int run(String[] args) throws Exception {
		Configuration conf = getConf();
		String input = conf.get("input");
		String output = conf.get("output");

		// 本地文件系统
		LocalFileSystem lfs = FileSystem.getLocal(conf);
		// 集群文件系统
		FileSystem fs = FileSystem.get(URI.create(input), conf);
		// 本地文件输出流
		FSDataOutputStream os = lfs.create(new Path(output));
		// 集群文件输入流
		FSDataInputStream is = fs.open(new Path(input));

		//获取转码工具
		CompressionCodecFactory ccf = new CompressionCodecFactory(conf);
		CompressionCodec codec = ccf.getCodec(new Path(input));
		//代转码器的输入流
		CompressionInputStream cis = codec.createInputStream(is);

		IOUtils.copyBytes(cis, os, 1024, true);
		System.out.println(codec.getClass().getName());
		return 0;
	}

	public static void main(String[] args) throws Exception {
		System.exit(ToolRunner.run(new ReadCompressionFile(), args));
	}
}

执行测试:下载实例1上传的server.log.bz2文件到本地目录为server2.log

hadoop-2.7.1/bin/hadoop jar my_hadoop-0.0.1-SNAPSHOT.jar com.jf.hdfs.ReadCompressionFile -Doutput=/home/softwares/server2.log -Dinput=/user/root/input/server.log.bz2

查看本地文件夹下文件是否存在

 

转载于:https://my.oschina.net/u/3100849/blog/1614125

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值