`

HDFS-压缩

 
阅读更多

文件压缩带来了两大益处1)减少存贮空间2)加速网络(磁盘)传输。基于大数据的传输,都需要经过压缩处理。

压缩格式
压缩格式 工具 算法 文件扩展名 可分块
DEFLATE N/A DEFLATE .deflate No
gzip gzip DEFLATE .gz No
bzip2 bzip2 bzip2 .bz2 Yes
LZO lzop LZO .lzo No
Snappy N/A Snappy .snappy No

 

压缩及解压缩

 

文件解压实例

 

package com.bigdata.io;

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.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;

public class FileDecompressor {
	
	public static void main(String[] args) throws IOException {
		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);
		// io.compression.codecs 定义列表中的一个
		CompressionCodec codec  = factory.getCodec(inputPath); 
		if(null == codec){
			System.err.println("No codec 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);
		}
	}
}

  $hadoop jar stream.jar com.bigdata.io.FileDecompressor test.txt.gz 

   12/06/14 09:48:28 INFO util.NativeCodeLoader: Loaded the native-hadoop library

   12/06/14 09:48:28 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library

 

Native Libraries

Native gzip 库减少解压缩时间在50%,压缩时间在10%(同java实现的压缩算法)

禁用Native Library , 需要设置属性hadoop.native.lib 为 false

 

 

package com.bigdata.io;

import java.io.IOException;

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;

public class PooledStreamCompressor {

	public static void main(String[] args) throws ClassNotFoundException {
		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();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			CodecPool.returnCompressor(compressor);
		}
	}
}
 

 

echo "Text" | hadoop jar stream.jar com.bigdata.io.PooledStreamCompressor org.apache.hadoop.io.compress.GzipCodec | gunzip -

12/06/14 10:57:49 INFO util.NativeCodeLoader: Loaded the native-hadoop library

12/06/14 10:57:49 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library

12/06/14 10:57:49 INFO compress.CodecPool: Got brand-new compressor

Text


使用压缩格式规则

 

      压缩格式的使用取决于你的应用程序。你想最大化您的应用程序的速度,或者是你更关注关于保持存储成本下降?在一般情况下,你应该尝试不同的策略,根据数据集和基准测试,找到最好的办法。

      对于大文件,如日志文件,选项有:

      1.存储成非压缩格式

      2.使用一个支持块分割的压缩格式,比如bzip2(当然bzip2比较慢)或者可以使用LZO(被索引后支持块分割)

      3.把应用分割成大快,每个大快可以支持任意的压缩格式(不用关心在HDFS中是否可以分割)。在这种情况,你需要计算一下你的压缩后的尺寸,要同HDFS Block的大小相匹配

      4.使用Sequence 文件,支持压缩及分块

      5.使用Avro数据文件,支持压缩及分块,就像Sequence文件,但比Sequence要更高级,可以被多种语言支持

      对于大文件,你不应该使用不支持分块的压缩。因为,你失去了地方,使MapReduce应用非常没有效率

      为了归档目的,考虑Hadoop 归档格式,虽然他不支持压缩。

 

 

MapReduce中使用压缩

 

步骤:

      1.设置mapred.output.compress=true

      2.设置mapred.output.compression.codec=the classname of the above list

      或者

      FileOutputFormat.setCompressOutput(job,true)

      FileOutputFormat.setOutputCompressorClass(job,GzipCodec.class)

 

 

 

public class MaxTemperatureWithCompression {
  public static void main(String[] args) throws Exception {
    if (args.length != 2) {
    System.err.println("Usage: MaxTemperatureWithCompression <input path> " +
    "<output path>");
    System.exit(-1);
    }
    Job job = new Job();
    job.setJarByClass(MaxTemperature.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileOutputFormat.setCompressOutput(job, true);
    FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);
    job.setMapperClass(MaxTemperatureMapper.class);
    job.setCombinerClass(MaxTemperatureReducer.class);
    job.setReducerClass(MaxTemperatureReducer.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
} }

 

   对于SequenceFile格式

   默认压缩类型是RECORD,建议更改为BLOCk,压缩一组record

   SqeuenceFileOutputFormat.setOutputCompressionType()设置这个压缩类型

 

 

 MapReduce压缩属性汇总

 

Property name Type Default value Description
mapred.output.compress boolean false Compress outputs
mapred.output.compression.codec Class name org.apache.hadoop.io.compress.DefaultCodec The compression codec to use for outputs
mapred.output.compression.type String RECORD Type type of compression to use for SequenceFile outputs:NONE,RECORD,or BLOCK.

 

 

Map阶段压缩输出(即中间结果是否压缩)

建议使用性能比较好的LZO、Snappy

Map 输出压缩属性汇总

Property name Type Default value Description
mapred.compress.map.output boolean false Compress map outputs
mapred.map.output.compression.codec Class org.apache.hadoop.io.compress.DefaultCodec The compression codec to use for map outputs.

 

 

Map阶段使用压缩样例

Configuration conf = new Configuration();
conf.setBoolean("mapred.compress.map.output", true);
conf.setClass("mapred.map.output.compression.codec", GzipCodec.class,
CompressionCodec.class);
Job job = new Job(conf);
 

 

 



分享到:
评论

相关推荐

    hdfs-over-ftp安装包及说明

    【压缩包子文件的文件名称列表】: 1. "hdfs-over-ftp使用说明.docx":这份文档详细解释了如何使用hdfs-over-ftp系统。它可能涵盖了安装步骤、配置选项、命令行用法、常见问题解答等关键内容,对于用户来说是至关...

    hdfs-site.xml配置文件详解

    Secondary NameNode用于合并NameNode的编辑日志和文件系统的命名空间,以便压缩NameNode的编辑日志并减少其内存占用。默认端口是50091,但可以根据需要修改。 6. dfs.datanode.address 该配置项定义了DataNode用于...

    hdfs-over-ftp-hadoop-0.20.0.rar_ftp_ftpoverhdfs_hdfs文件传入ftp_java

    压缩包子文件 "hdfs-over-ftp-hadoop-0.20.0" 没有提供具体的文件名,但我们可以假设它包含了源代码、文档、配置文件等,这些内容可能包括: 1. **源代码**:实现了FTP与HDFS交互的Java类和库,可能包括FTP服务器的...

    hdfs-compress:hdfs 文件 压缩

    hdfs-compress 压缩hdfs文件 一般压缩hdfs指 ,数据文件的压缩 和 mapred 中间结果压缩 工程只做数据压缩,至于MR中间结果压缩减少网络IO,只需要配置 mapred-site.xml 即可,网上资料很多。 工程只实现了lzo的压缩...

    hadoop 2.9.0 hdfs-default.xml 属性集

    Secondary Namenode负责辅助主Namenode进行数据的合并与压缩。 4. dfs.namenode.http-address 此属性定义了通过HTTP协议访问Namenode的地址和端口,客户端可以使用这个地址来获取文件系统命名空间和状态信息。 5. ...

    PyPI 官网下载 | dbnd-hdfs-0.34.0.tar.gz

    首先,我们来看标题"PyPI 官网下载 | dbnd-hdfs-0.34.0.tar.gz",这表明该资源是一个从PyPI官方网站获取的压缩包,版本号为0.34.0,文件格式为tar.gz,这是Linux和Unix系统中常见的归档压缩格式,用于将多个文件打包...

    PyPI 官网下载 | dbnd-hdfs-0.38.2.tar.gz

    资源的名称“dbnd-hdfs-0.38.2.tar.gz”表明,它是以tar归档格式存储的,gz则是gzip压缩算法的缩写,这是一种常见的压缩方法,用于减小文件大小,便于在网络上传输。 首先,让我们了解“dbnd”项目。DBND(Data and...

    Flume-HDFS-驱动-jar包

    压缩包子文件的“flume-hdfs驱动”很可能包含了这些必要的Hadoop JAR文件,解压后应该把这些文件复制到Flume安装目录下的`lib`子目录中。这样,Flume启动时会自动加载这些库,使得Flume可以识别并正确操作HDFS。 ...

    storm-hdfs-0.1.1.zip

    在“压缩包子文件的文件名称列表”中提到的 "parboiled-examples-master",可以推断这是 Parboiled 示例代码的主分支。通常,“master”分支代表了项目的主线开发,包含了最新的稳定代码。这个目录可能包含多个示例...

    hdfs-webdav.rar_hadoop_hadoop webdav_hadoop 系统_hadoop2.0 d_hdfs

    压缩包子文件的文件名称列表提供了可能包含的内容线索: 1. readme.txt:通常包含了安装、配置或使用资源的指南。 2. META-INF:在Java应用中,这个目录存放元数据,如类库的清单文件。 3. WEB-INF:在Web应用程序中...

    hadoop-hdfs-httpfs-0.23.10.zip

    【压缩包子文件的文件名称列表】"http-stub-server-scala-master"可能包含的是该HTTP存根服务器项目的源代码仓库主分支。通常,这样的命名意味着它是通过Git版本控制系统管理的,"master"代表默认分支,包含了项目的...

    访问hdfs用到的客户端jar包

    压缩包子文件的文件名称列表中包含了以下关键jar包: 1. **hadoop-hdfs-2.7.1.jar**:这是主要的HDFS客户端库,包含HDFS的客户端API和其他相关类。 2. **hadoop-common-2.7.1.jar**:提供了Hadoop通用功能,包括...

    spark-scala-hdfs-docker-example:使用Scala的Spark将文件写入HDFS,并使用Docker“ scale”自动添加新的Spark工人

    spark-scala-hdfs-docker-example 使用Scala的Spark可以使用Docker“ scale”自动添加新的Spark工人,从而将文件读/写到HDFS 默认值: 工作区目录位于/ app Jar文件位于/app/app.jar。 主类是app.Main 如果要...

    Hadoop本地可视化界面的设计及基本实现HDFSViewer.rar

    【压缩包子文件的文件名称列表】: 1. "教程重要说明.txt":这个文件很可能是项目开发者提供的使用指南或重要提示,包含了如何运行和操作HDFSViewer的步骤,以及可能遇到的问题和解决方案。 2. "HDFSViewer":这可能...

    2017最新大数据架构师精英课程

    85_hdfs-压缩编解码器, u" o: K/ V5 B 86_hdfs-MR原理 87_hdfs-wordcount$ ?% ?& }' U. [0 M9 b 88_hadoop-mapreduce-切片演示-mapper 89_hadoop-mapreduce-url演示1 B% m, V- Z) ~. B9 |9 m2 u 90_job提交流程剖析 ...

    传输到hdfs数据,进行压缩

    本文将深入探讨如何将数据传输到HDFS(Hadoop分布式文件系统)并进行压缩,特别是使用LZOP压缩算法。 首先,LZOP是一种专门为Hadoop设计的压缩格式,它具有较高的压缩率和较快的解压速度,特别适合于HDFS环境。LZOP...

    hadoop-native原始包-压缩-native-2.7.2-ct7.x.tgz

    标题 "hadoop-native原始包-压缩-native-2.7.2-ct7.x.tgz" 指涉的是Hadoop项目中的一个特定组件——原生库(Native Libraries),这是一个针对Hadoop 2.7.2版本优化的压缩包,特别为CT7(可能是某个特定的计算或集群...

    HDFS的透明压缩存储.pdf

    ### HDFS的透明压缩存储详解 #### 引言 在大数据时代,数据的存储与处理成为了一项巨大挑战。为了应对海量数据的高效存储与快速访问需求,Hadoop分布式文件系统(HDFS)应运而生。然而,随着数据量的不断膨胀,...

    HDFS用户指南中文版

    - **数据压缩**:对于文本文件等可压缩的数据,可以采用Gzip、Snappy等压缩算法,在不影响数据读取效率的前提下减小存储空间占用。 - **动态调整复制因子**:根据数据的重要程度和访问频率动态调整数据块的复制...

    hdfs-gress:通用加载程序

    拷贝本地文件到HDFS动机很多项目需要把本地文件拷贝到hdfs集群,本程序能自动扫描本地文件并上传到hdfs集群。特性拷贝成功后,可以选择保留或删除文件拷贝文件过程可以支持压缩例如:org.apache.hadoop.io.compress....

Global site tag (gtag.js) - Google Analytics