大数据学习(四):HDFS 的I/O操作

压缩文件

Hadoop 压缩文件有很多方法 通常各个工具提供权衡空间/时间  从 -1  优化压缩速度 ~9  优化压缩空间

如通过最快压缩方法 gzip -1 file  最小占用空间 gzip -9 file

codec

补充: 在考虑如何将由MapReduce处理的数据时,理解这些压缩格式是否支持切分(splitting) 是非常重要的。

不支持切分的压缩格式在用MapReduce运算时,我觉得因为是不支持切分的格式,所以无法知道每一块的起始和终止位置,操作时需要将数据整合,也就失去了数据本地特性,处理效率底下

bzip2 支持切分

用JAVA对Hadoop文件压缩及解压缩操作

(一)

package cn.weida.hadoop.write;

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;

/**
 * 将符合CompressionCodec实现的完全合格名称作为第一个命令行参数
 * CompressionCodec 包含两个函数 
 * createOutputStream(OutputStream out) 对写入数据源的数据进行压缩
 * createInputStream(InputStream in)  对输入数据流中数据进行解压
 * @author lone
 *
 */
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);     //新建Codec实例
        
        CompressionOutputStream out = codec.createOutputStream(System.out);
        IOUtils.copyBytes(System.in, out, 4096,false);
        out.flush();
    }
}
 

(二)

package cn.weida.hadoop.write;

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;


/**
 * 
 * 如果使用的是原生代码库并且需要在应用中执行大量压缩和解压操作,可以考虑用CodecPool,它支持反复使用压缩和解压,以分摊创建这些对象的开销
 * 使用压缩池对读取自标准输入的数据进行压缩,然后将其写到标准输出
 * @author lone
 *
 */
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);
        }
    }

}
 

       

猜你喜欢

转载自blog.csdn.net/acm160920007/article/details/81119213