一个适合MapReduce处理的gz压缩方式
来源:互联网 发布:积分下载系统源码 编辑:程序博客网 时间:2024/06/06 00:30
最近在筹备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);}}
这样产生的压缩文件每一个都会小于64MB,最多相差不到100k。考虑的因素比较少,这里只是把大致的算法写了一下,倒是满足需求了。
0 0
- 一个适合MapReduce处理的gz压缩方式
- AIX 上总有一种压缩方式适合你
- Windows下批处理方式压缩文件夹为tar.gz的方法
- 图片压缩处理的几种方式
- 一个简单的压缩成tar.gz文件的shell脚本
- linux多文件压缩一个文件成tar.gz的命令
- hadoop mapreduce依赖第三方jar的处理方式
- tgz(tar.gz)的压缩和解压
- WINDOWS下压缩tar.gz 的方法
- filename.gz的解压和压缩
- gz文件的解压和压缩
- tgz(tar.gz)的压缩和解压
- tgz(tar.gz)的压缩和解压
- MapReduce处理CSV格式文件的的一个实例
- mapreduce简单的gzip压缩
- mapreduce程序的压缩实现
- Android 中图片压缩处理的方式(附源代码)
- 16bitmap位图的压缩方式及处理
- Ubuntu 14.04 安装Apache、MySQL、PHP、JDK7、Tomcat7、vsFTPd、Open SSH Server快速步骤
- Android_07_短信防火墙
- 文艺编程 Literate Programming (原文中英文对照)
- 第一章 基本语法-3判断语句(if)
- 自制新浪微博动态
- 一个适合MapReduce处理的gz压缩方式
- jsp九大内置对象、四大作用域和session的生命周期
- IOS CGAffineTransform 用于视图平移,放缩,旋转
- 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
- 南邮编程在线编程题四:打印每月有几天
- 最长单调递增公共子序列(路径记录+poj2127+zoj2432)Greatest Common Increasing Subsequence
- 关于打开android studioch出现the environment virable JAVA_HOME does not point to a valid JVM installation
- 线程与进程
- LeetCode 18: 4Sum