一个合适MapReduce处理的gz紧缩方法ITeye - 众发娱乐

一个合适MapReduce处理的gz紧缩方法ITeye

2019-01-12 09:45:48 | 作者: 思菱 | 标签: 紧缩,一个,文件 | 浏览: 514

最近在准备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();
 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。考虑的要素比较少,这儿仅仅把大致的算法写了一下,却是满意需求了。
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表众发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章