`
lihaosu
  • 浏览: 1504 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

一个适合MapReduce处理的gz压缩方式

阅读更多
最近在筹备hadoop,测试集群只有普通的6个虚拟机,每个1G内存,100G硬盘。所以在yarn进行资源调度的时候比较纠结,硬盘空间也有限。在执行作业的时候就希望能够尽量对输入数据进行压缩。


hadoop可以直接处理gz格式的压缩文件,但不会产生split,而是不论多大都直接交给一个Mapper去做,因为gz在算法上不支持split。虽然bzip2支持split,但压缩速度又比较慢,gz可以说是最常用的压缩方式了。


一开始想当然的尝试压缩分卷,结果当然是失败,因为不管分多少个卷,gz还是要以一个整体来进行解压。


因为我只是处理文本数据,而且都是基于文本行,每一行之间不像xml那样会具有什么嵌套关系,所以动手写了一个压缩程序,在对大文件进行压缩的时候,如果产生的压缩文件大于一个设定值,那就再新建一个文件继续压缩。

package util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.zip.GZIPOutputStream;

public class CompressUtils
{
	/**
	 * 将文件压缩成GZIP分片
	 * @param inputFile 输入文件
	 * @param outputDir 输出目录
	 * @param outputFileName 输出文件名
	 * @param splitSize 分片大小
	 */
	public static void compressToSplitsUseGZIP(File inputFile, File outputDir, String outputFileName, int splitSize)
		throws Exception
	{
		String separator = System.getProperty("line.separator");
		int split = 0;
		long limit = splitSize * 1024 * 1024L;
		File outputSplit = new File(outputDir, outputFileName + split + ".gz");
		outputSplit.createNewFile();
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile), "UTF-8"));
		PrintWriter out = new PrintWriter(new GZIPOutputStream(new FileOutputStream(outputSplit)), false);
		String line = null;
		long fileLength = outputSplit.length();
		long maxInc = 0L;
		while (true)
		{
			line = br.readLine();
			if (line == null)
			{
				break;
			}
			
			if (fileLength + maxInc > limit)
			{
				if (out != null)
				{
					out.close();
					out = null;
					outputSplit = new File(outputDir, outputFileName + (++split) + ".gz");
					outputSplit.createNewFile();
					fileLength = outputSplit.length();
					out = new PrintWriter(new GZIPOutputStream(
							new FileOutputStream(outputSplit)), false);
				}
			}

			for (byte b : line.getBytes())
			{
				out.write(b);
			}
			for (byte b : separator.getBytes())
			{
				out.write(b);
			}
			out.flush();
			
			long currentLength = outputSplit.length();
			long inc = currentLength - fileLength;
			if (inc >= maxInc)
			{
				maxInc = inc;
			}
			fileLength = currentLength;
		}
		br.close();
		try
		{
			out.close();
		}
		catch (Exception e)
		{
		}
	}
	
	public static void main(String[] args)
		throws Exception
	{
		File inputFile = new File(args[0]);
		File outputDir = new File(args[1]);
		String outputFileName = args[2];
		int splitSize = Integer.parseInt(args[3]);
		compressToSplitsUseGZIP(inputFile, outputDir, outputFileName, splitSize);
	}
}


命令行参数:D:\temp\test.txt D:\temp test 64

这样产生的压缩文件每一个都会小于64MB,最多相差不到100k。考虑的因素比较少,这里只是把大致的算法写了一下,倒是满足需求了。
分享到:
评论

相关推荐

    22、MapReduce使用Gzip压缩、Snappy压缩和Lzo压缩算法写文件和读取相应的文件

    在大数据处理领域,MapReduce是Hadoop框架中的一个核心组件,用于执行分布式计算任务。在处理海量数据时,为了提高存储效率和传输速度,通常会采用数据压缩技术。本篇文章将详细探讨MapReduce如何使用Gzip、Snappy和...

    pig的mapreduce模式的安装及配置.docx

    总的来说,Pig是一个强大的工具,尤其适合于数据清洗和预处理,通过MapReduce模式,它能够在Hadoop集群上高效地执行复杂的分析任务。在实际工作中,根据项目需求和团队技能,选择合适的工具组合,如Pig与Hive的结合...

    lzo-2.06.tar.gz/lzo-2.10.tar.gz

    tar主要用于将多个文件或目录打包成一个单一的文件,而gz则代表gzip,用于对文件进行压缩,以节省存储空间。 描述中提到,这些压缩包是针对Hadoop的,这意味着LZO压缩算法被集成到Hadoop框架中,用于处理大数据的...

    lz4.tar.gz

    标题 "lz4.tar.gz" 指的是一个包含Hadoop中使用的lz4压缩算法源代码的压缩文件。这个文件是一个`.tar.gz`档案,它是由`.tar`(tarball)和`.gz`(Gzip)两种压缩格式组合而成。`.tar`主要用于将多个文件或目录打包成...

    hbase-1.2.1-bin.tar.gz.zip

    解压后,用户会得到一个包含HBase服务器、客户端库、配置文件以及文档的目录结构。这个目录结构中,`bin`目录包含了运行HBase的脚本,如启动和停止HBase的命令;`conf`目录存放配置文件,用户可以根据自己的环境进行...

    hadoop-2.7.1.tar.gz.zip

    这是一个压缩文件,最外层是.zip格式,内部包含的是一个名为“hadoop-2.7.1.tar.gz”的文件。在Linux或Mac系统中,通常会先使用`unzip`命令解压最外层的zip文件,然后用`tar -zxvf`命令解压内层的tar.gz文件。...

    hadoop-3.2.2.tar.gz.7z

    在.7z压缩包内,有一个名为"hadoop-3.2.2.tar.gz"的文件,这通常意味着它是一个使用gzip压缩的tar归档文件,tar用于将多个文件打包成一个单一的文件,而gzip则进一步对这个打包文件进行压缩。 在Hadoop 3.2.2版本中...

    data.tar.gz

    "data.tar.gz"这个文件是一个压缩包,它包含了程序运行所需的模型数据以及LMDB(LevelDB MapReduce Database)存储文件。这样的文件结构常用于大规模数据处理,特别是机器学习项目,因为它们能有效地管理和加载大量...

    Ubuntu安装Hadoop实现MapReduce里的WordCount

    - **背景**: WordCount是最经典的MapReduce示例之一,用于统计文件中每个单词出现的次数。 - **步骤**: - 使用Java编写Mapper类,处理输入的文本行,提取单词并计数。 - 使用Java编写Reducer类,汇总来自Mapper的...

    yarn.tar.gz

    【标题】"yarn.tar.gz" 是一个归档文件,它使用了gzip压缩算法来减小文件大小。在IT行业中,这种格式常用于分发软件、源代码或数据集,以便于下载和存储。"tar"是Linux和Unix系统中的一个工具,用于将多个文件和目录...

    test.tgz测试数据

    由于`.tar.gz`文件的压缩特性,这种处理方式可以显著减少网络传输的数据量,提升整体处理速度。 在MapReduce中,`.tar.gz`文件的使用还有其他优势。例如,它们可以方便地包含多层目录结构,这意味着复杂的数据集...

    snappy-1.1.3.tar.gz

    标题"snappy-1.1.3.tar.gz"表明这是Snappy库的一个版本,具体为1.1.3版,它以常见的tar.gz格式打包。这种格式结合了tar(用于归档多个文件)和gzip(用于压缩)的功能,通常用于Linux和Unix-like系统中的软件分发。 ...

    snappy-1.1.9.tar.gz

    在标题和描述中提到的"snappy-1.1.9.tar.gz"是一个包含Snappy源代码的压缩文件,版本为1.1.9,采用tar和gzip两种工具进行打包和压缩。 1. **tar命令**: `tar` 是一个在Unix和类Unix系统中广泛使用的命令行工具,...

    pig-0.9.2.tar.gz

    总的来说,"pig-0.9.2.tar.gz"是一个提供给Linux用户的Apache Pig工具的老版本,它简化了大数据处理流程,特别是对于那些不熟悉MapReduce编程的人。通过解压、配置、安装和设置环境变量,用户可以在Linux环境中利用...

    pig-0.12.1.tar.gz

    【标题】"pig-0.12.1.tar.gz" 是一个针对Linux操作系统的Hadoop集群的Pig开发软件包,以tar.gz格式压缩。这种压缩格式是Linux系统中常用的,它结合了tar(用于打包多个文件)和gzip(用于压缩)的功能。解压这个文件...

    hadoop-2.6.0-cdh5.14.2.tar.gz

    总之,Hadoop-2.6.0-cdh5.14.2是一个强大的大数据处理平台,适合在Linux环境中部署,提供了高效的数据存储和计算能力。CDH的引入进一步增强了其易用性和企业级特性,使得大数据分析变得更加便捷和可靠。

    eclipse-java-linux-gtk-x86_64.tar.gz

    总之,"eclipse-java-linux-gtk-x86_64.tar.gz"是一个适用于64位Linux系统的Eclipse IDE,特别适合Java开发者和需要处理Hadoop任务的用户。它提供了全面的开发工具,通过丰富的插件和集成的开发环境,能够满足从初学...

    hadoop-2.7.2.tar.gz

    总的来说,Hadoop 2.7.2是大数据处理领域的一个强大工具,其与Snappy的结合提供了高效的压缩和解压缩性能,适合大规模数据处理需求。正确配置和使用Hadoop,可以有效地管理和分析海量数据,从而为企业决策提供强有力...

    hadoop-3.1.3.tar.gz.gz

    描述中提到的同样是"hadoop-3.1.3.tar.gz.gz",这通常意味着这是一个压缩过的tar文件,可能包含了Hadoop的源代码或者二进制分发版。".tar"文件是Linux/Unix系统中常用的归档格式,用于将多个文件和目录打包成一个...

    hadoop-1.2.1-bin.tar.gz

    Hadoop是Apache软件基金会开发的一个开源分布式计算框架,它的核心设计目标是处理和存储大规模数据。这个名为“hadoop-1.2.1-bin.tar.gz”的文件是Hadoop 1.2.1版本的二进制发行版,适用于Linux操作系统。在Linux...

Global site tag (gtag.js) - Google Analytics