【hadoop】——HDFS解压缩实现
转载请注明出处:http://www.cnblogs.com/zhengrunjian/p/4527220.html
所有源码在github上,https://github.com/lastsweetop/styhadoop
1简介
2使用CompressionCodes解压缩
- package com.sweetop.styhadoop;
 - import org.apache.hadoop.conf.Configuration;
 - import org.apache.hadoop.io.IOUtils;
 - import org.apache.hadoop.io.compress.CompressionCodec;
 - import org.apache.hadoop.io.compress.CompressionOutputStream;
 - import org.apache.hadoop.util.ReflectionUtils;
 - /**
 - * Created with IntelliJ IDEA.
 - * User: lastsweetop
 - * Date: 13-6-25
 - * Time: 下午10:09
 - * To change this template use File | Settings | File Templates.
 - */
 - public class StreamCompressor {
 - public static void main(String[] args) throws Exception {
 - String codecClassName = args[0];
 - Class<?> codecClass = Class.forName(codecClassName);
 - Configuration conf = new Configuration();
 - CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, conf);
 - CompressionOutputStream out = codec.createOutputStream(System.out);
 - IOUtils.copyBytes(System.in, out, 4096, false);
 - out.finish();
 - }
 - }
 
- echo "Hello lastsweetop" | ~/hadoop/bin/hadoop com.sweetop.styhadoop.StreamCompressor org.apache.hadoop.io.compress.GzipCodec | gunzip -
 
使用GzipCodec类来压缩“Hello lastsweetop”,然后再通过gunzip工具解压。
- [exec] 13/06/26 20:01:53 INFO util.NativeCodeLoader: Loaded the native-hadoop library
 - [exec] 13/06/26 20:01:53 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
 - [exec] Hello lastsweetop
 
3使用CompressionCodecFactory解压缩
- package com.sweetop.styhadoop;
 - import org.apache.hadoop.conf.Configuration;
 - 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 java.io.IOException;
 - import java.io.InputStream;
 - import java.io.OutputStream;
 - import java.net.URI;
 - /**
 - * Created with IntelliJ IDEA.
 - * User: lastsweetop
 - * Date: 13-6-26
 - * Time: 下午10:03
 - * To change this template use File | Settings | File Templates.
 - */
 - public class FileDecompressor {
 - public static void main(String[] args) throws Exception {
 - String uri = args[0];
 - 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(in);
 - IOUtils.closeStream(out);
 - }
 - }
 - }
 
注意看下removeSuffix方法,这是一个静态方法,它可以将文件的后缀去掉,然后我们将这个路径做为解压的输出路径。CompressionCodecFactory能找到的codec也是有限的,默认只有三种org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.DefaultCodec,如果想添加其他的codec你需要更改io.compression.codecs属性,并注册codec。
4原生库
- [hadoop@namenode native]$pwd
 - /home/hadoop/hadoop/lib/native
 - [hadoop@namenode native]$ls -ls
 - total 8
 - 4 drwxrwxrwx 2 root root 4096 Nov 14 2012 Linux-amd64-64
 - 4 drwxrwxrwx 2 root root 4096 Nov 14 2012 Linux-i386-32
 
如果是其他平台的话,你就需要自己编译了,详细步骤请看这里http://wiki.apache.org/hadoop/NativeHadoop
- if [ -d "${HADOOP_HOME}/build/native" -o -d "${HADOOP_HOME}/lib/native" -o -e "${HADOOP_PREFIX}/lib/libhadoop.a" ]; then
 - if [ -d "$HADOOP_HOME/build/native" ]; then
 - JAVA_LIBRARY_PATH=${HADOOP_HOME}/build/native/${JAVA_PLATFORM}/lib
 - fi
 - if [ -d "${HADOOP_HOME}/lib/native" ]; then
 - if [ "x$JAVA_LIBRARY_PATH" != "x" ]; then
 - JAVA_LIBRARY_PATH=${JAVA_LIBRARY_PATH}:${HADOOP_HOME}/lib/native/${JAVA_PLATFORM}
 - else
 - JAVA_LIBRARY_PATH=${HADOOP_HOME}/lib/native/${JAVA_PLATFORM}
 - fi
 - fi
 - if [ -e "${HADOOP_PREFIX}/lib/libhadoop.a" ]; then
 - JAVA_LIBRARY_PATH=${HADOOP_PREFIX}/lib
 - fi
 - fi
 
hadoop会去查找对应的原生库,并且自动加载,你不需要关心这些设置。但某些时候你不想使用原生库,比如调试一些bug的时候,那么可以通过hadoop.native.lib设置为false来实现。
- package com.sweetop.styhadoop;
 - import org.apache.hadoop.conf.Configuration;
 - import org.apache.hadoop.io.IOUtils;
 - import org.apache.hadoop.io.compress.CodecPool;
 - import org.apache.hadoop.io.compress.CompressionCodec;
 - import org.apache.hadoop.io.compress.CompressionOutputStream;
 - import org.apache.hadoop.io.compress.Compressor;
 - import org.apache.hadoop.util.ReflectionUtils;
 - /**
 - * Created with IntelliJ IDEA.
 - * User: lastsweetop
 - * Date: 13-6-27
 - * Time: 上午11:53
 - * To change this template use File | Settings | File Templates.
 - */
 - public class PooledStreamCompressor {
 - public static void main(String[] args) throws Exception {
 - String codecClassName = args[0];
 - Class<?> codecClass = Class.forName(codecClassName);
 - Configuration conf = new Configuration();
 - CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, conf);
 - Compressor compressor = null;
 - try {
 - compressor = CodecPool.getCompressor(codec);
 - CompressionOutputStream out = codec.createOutputStream(System.out, compressor);
 - IOUtils.copyBytes(System.in, out, 4096, false);
 - out.finish();
 - } finally {
 - CodecPool.returnCompressor(compressor);
 - }
 - }
 - }
 
代码比较容易理解,通过CodecPool的getCompressor方法获得Compressor对象,该方法需要传入一个codec,然后Compressor对象在createOutputStream中使用,使用完毕后再通过returnCompressor放回去。
- [exec] 13/06/27 12:00:06 INFO util.NativeCodeLoader: Loaded the native-hadoop library
 - [exec] 13/06/27 12:00:06 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
 - [exec] 13/06/27 12:00:06 INFO compress.CodecPool: Got brand-new compressor
 - [exec] Hello lastsweetop    
转载请注明出处:http://blog.csdn.net/lastsweetop/article/details/9173061
 
【hadoop】——HDFS解压缩实现的更多相关文章
- [转]hadoop hdfs常用命令
		
FROM : http://www.2cto.com/database/201303/198460.html hadoop hdfs常用命令 hadoop常用命令: hadoop fs 查看H ...
 - Hadoop     HDFS安装、环境配置
		
hadoop安装 进入Xftp将hadoop-2.7.3.tar.gz 复制到自己的虚拟机系统下的放软件的地方,我的是/soft/software 在虚拟机系统装软件文件里,进行解压缩并重命名 进入p ...
 - Hadoop HDFS常用操作命令
		
hadoop常用命令:hadoop fs查看Hadoop HDFS支持的所有命令 hadoop fs –ls列出目录及文件信息 hadoop fs –lsr循环列出目录.子目录及文件信息 hadoop ...
 - 基于key/value+Hadoop HDFS 设计的存储系统的shell命令接口
		
对于hadoop HDFS 中的全部命令进行解析(当中操作流程是自己的想法有不允许见欢迎大家指正) 接口名称 功能 操作流程 get 将文件拷贝到本地文件系统 . 假设指定了多个源文件,本地目的端必须 ...
 - Hadoop HDFS 用户指南
		
This document is a starting point for users working with Hadoop Distributed File System (HDFS) eithe ...
 - Hadoop HDFS负载均衡
		
Hadoop HDFS负载均衡 转载请注明出处:http://www.cnblogs.com/BYRans/ Hadoop HDFS Hadoop 分布式文件系统(Hadoop Distributed ...
 - Hive:org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: The NameSpace quota (directories and files) of directory /mydir is exceeded: quota=100000 file count=100001
		
集群中遇到了文件个数超出限制的错误: 0)昨天晚上spark 任务突然抛出了异常:org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: T ...
 - Hadoop程序运行中的Error(1)-Error: org.apache.hadoop.hdfs.BlockMissingException
		
15/03/18 09:59:21 INFO mapreduce.Job: Task Id : attempt_1426641074924_0002_m_000000_2, Status : FAIL ...
 - Hadoop HDFS编程 API入门系列之HDFS_HA(五)
		
不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs3; import java.io.FileInputStream;import ...
 - Hadoop HDFS编程 API入门系列之简单综合版本1(四)
		
不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs4; import java.io.IOException; import ja ...
 
随机推荐
- dmesg 的时间戳处理
			
dmesg_with_human_timestamps () { $(type -P dmesg) "$@" | perl -w -e 'use strict; my ($upti ...
 - 解决 WinXP下 libcurl.dll 无法定位程序输入点GetTickCount64问题
			
1. 问题描述 用 IDA 打开libcurl.dll 可以在导入表看到对 GetTickCount64的引用,在 xp 的kernel32.dll中没有 GetTickCount64, 所以会出现 ...
 - mongodb数据库备份导入导出数据
			
备份数据: mongodump -h 192.168.2.20 -u game -p 12345678 -d dbname -o /data/test/ --excludeCollection=use ...
 - ActiveMQ消息队列介绍
			
ActiveMQ是一个开源兼容Java Message Service (JMS) 1.1面向消息的中件间. 来自Apache Software Foundation. ActiveMQ提供松耦合 ...
 - C#开发可以可视化操作的windows服务
			
使用C#开发自定义windows服务是一件十分简单的事.那么什么时候,我们需要自己开发windows服务呢,就是当我们需要计算机定期或者一 直执行我们开发的某些程序的时候.我经常看到许多人开发的win ...
 - 使用Apache的Base64类实现Base64加解密
			
包名称:org.apache.commons.codec.binary 类名称:org.apache.commons.codec.binary.Base64 1.Base64加密 public sta ...
 - SQL查询数据的几大方法
			
有你,查询数据我什么都不怕.快快掌握!! 出大招的工具: 1.使用LIKE.BETWEEN.IN进行模糊查询 eg1: SELECT * FROM Students WHERE 姓名 like '张% ...
 - fontIconPicker – 优雅的 jQuery 字体图标选择
			
jQuery fontIconPicker 是一个小的 jQuery 插件,它可以让你实现一个优雅的带有分类.搜索和分页功能的图标选择器.图标列表可手动从下拉列表框,图标数组或对象,或者从 Fonte ...
 - Molecule – 帮助你构建跨平台的 HTML5 游戏
			
Molecule 框架由拥有超过五年手机游戏开发经验的游戏开发者开发.由于移动浏览器与实际的 HTML5 规范的兼容性的改进和内部硬件的自然进化,HTML5 手机游戏真正有可能流行起来. 您可能感兴趣 ...
 - 【NodeJS 学习笔记03】先运行起来再说
			
前言 最近同事推荐了一个不错的网址:https://github.com/nswbmw/N-blog/wiki/_pages 里面的教程很是详细,我们现在跟着他的节奏学习下NodeJS,一个简单的博客 ...