一个适合MapReduce处理的gz压缩方式
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,最近在筹备hadoop,测试集群只有普通的6个虚拟机,每个1G内存,100G硬盘。所以在yarn进行资源调度的时候比较纠结,硬盘空间也有限。在执行作业的时候就希望能够尽量对输入数据进行压缩。hadoo
千家信息网最后更新 2026年11月04日一个适合MapReduce处理的gz压缩方式
最近在筹备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); }}命令行参数:D:\temp\test.txt D:\temp test 64
这样产生的压缩文件每一个都会小于64MB,最多相差不到100k。考虑的因素比较少,这里只是把大致的算法写了一下,倒是满足需求了。
文件
时候
处理
只是
数据
硬盘
算法
支持
输入
输出
方式
普通
想当然
一行
之间
倒是
内存
参数
只有
命令
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技海报
科技与互联网
互联网医疗科技
互联网与未来科技
易通互联网络科技有限公司
碳银互联网科技有限公司
深圳艾佳互联网科技
佰商互联网科技有限公司
海南购全球互联网科技
福州新华互联网科技学校 知乎
赶超互联网科技 微信多开
996高科技互联网公司
沐思想互联网科技有限公司
互联网金融科技元年
中国互联网有什么科技
互联网科技实习生岗位
美国五大互联网科技公司市值多少
青岛易易互联网科技
山东亿川互联网科技有限责任公司
株洲百竞科技的互联网营销顾问
猪兼强互联网科技
互联网 科技创业
百单互联网科技有限公司
深圳齐家互联网科技
互联网养老 桔豆科技
天扬科技互联网广告
团飞科技与伯堂互联网服务平台
互联网金融科技展
领航科技大厦互联网公司
科技互联网专业工作会议发言稿