一個(gè)適合MapReduce處理的gz壓縮方式

    最近在籌備hadoop,測(cè)試集群只有普通的6個(gè)虛擬機(jī),每個(gè)1G內(nèi)存,100G硬盤。所以在yarn進(jìn)行資源調(diào)度的時(shí)候比較糾結(jié),硬盤空間也有限。在執(zhí)行作業(yè)的時(shí)候就希望能夠盡量對(duì)輸入數(shù)據(jù)進(jìn)行壓縮。

成都創(chuàng)新互聯(lián)-云計(jì)算及IDC服務(wù)提供商,涵蓋公有云、IDC機(jī)房租用、成都服務(wù)器托管、等保安全、私有云建設(shè)等企業(yè)級(jí)互聯(lián)網(wǎng)基礎(chǔ)服務(wù),服務(wù)電話:18980820575

    hadoop可以直接處理gz格式的壓縮文件,但不會(huì)產(chǎn)生split,而是不論多大都直接交給一個(gè)Mapper去做,因?yàn)間z在算法上不支持split。雖然bzip2支持split,但壓縮速度又比較慢,gz可以說是最常用的壓縮方式了。

    一開始想當(dāng)然的嘗試壓縮分卷,結(jié)果當(dāng)然是失敗,因?yàn)椴还芊侄嗌賯€(gè)卷,gz還是要以一個(gè)整體來進(jìn)行解壓。

    因?yàn)槲抑皇翘幚砦谋緮?shù)據(jù),而且都是基于文本行,每一行之間不像xml那樣會(huì)具有什么嵌套關(guān)系,所以動(dòng)手寫了一個(gè)壓縮程序,在對(duì)大文件進(jìn)行壓縮的時(shí)候,如果產(chǎn)生的壓縮文件大于一個(gè)設(shè)定值,那就再新建一個(gè)文件繼續(xù)壓縮。

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);
	}
}

    命令行參數(shù):D:\temp\test.txt D:\temp test 64

    這樣產(chǎn)生的壓縮文件每一個(gè)都會(huì)小于64MB,最多相差不到100k??紤]的因素比較少,這里只是把大致的算法寫了一下,倒是滿足需求了。

網(wǎng)頁題目:一個(gè)適合MapReduce處理的gz壓縮方式
網(wǎng)頁路徑:http://bm7419.com/article44/iiodee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷網(wǎng)站策劃、云服務(wù)器、網(wǎng)站內(nèi)鏈外貿(mào)建站、品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)