最近在籌備hadoop,測試集群只有普通的6個虛擬機,每個1G內(nèi)存,100G硬盤。所以在yarn進行資源調(diào)度的時候比較糾結(jié),硬盤空間也有限。在執(zhí)行作業(yè)的時候就希望能夠盡量對輸入數(shù)據(jù)進行壓縮。
成都創(chuàng)新互聯(lián)-云計算及IDC服務(wù)提供商,涵蓋公有云、IDC機房租用、成都服務(wù)器托管、等保安全、私有云建設(shè)等企業(yè)級互聯(lián)網(wǎng)基礎(chǔ)服務(wù),服務(wù)電話:18980820575
hadoop可以直接處理gz格式的壓縮文件,但不會產(chǎn)生split,而是不論多大都直接交給一個Mapper去做,因為gz在算法上不支持split。雖然bzip2支持split,但壓縮速度又比較慢,gz可以說是最常用的壓縮方式了。
一開始想當然的嘗試壓縮分卷,結(jié)果當然是失敗,因為不管分多少個卷,gz還是要以一個整體來進行解壓。
因為我只是處理文本數(shù)據(jù),而且都是基于文本行,每一行之間不像xml那樣會具有什么嵌套關(guān)系,所以動手寫了一個壓縮程序,在對大文件進行壓縮的時候,如果產(chǎn)生的壓縮文件大于一個設(shè)定值,那就再新建一個文件繼續(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)生的壓縮文件每一個都會小于64MB,最多相差不到100k。考慮的因素比較少,這里只是把大致的算法寫了一下,倒是滿足需求了。
網(wǎng)頁題目:一個適合MapReduce處理的gz壓縮方式
網(wǎng)頁路徑:http://muchs.cn/article44/iiodee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、網(wǎng)站策劃、云服務(wù)器、網(wǎng)站內(nèi)鏈、外貿(mào)建站、品牌網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)