温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-10-12 00:20:05 阅读:1000 作者:xlb0479 栏目:大数据
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

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

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

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×