一个适合MapReduce处理的gz压缩方式
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,最近在筹备hadoop,测试集群只有普通的6个虚拟机,每个1G内存,100G硬盘。所以在yarn进行资源调度的时候比较纠结,硬盘空间也有限。在执行作业的时候就希望能够尽量对输入数据进行压缩。hadoo
千家信息网最后更新 2025年12月03日一个适合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安全错误
数据库的锁怎样保障安全
网易率土之滨新服务器
现场软件开发团队管理条例
联通软件开发笔试
PCS7客户端服务器组态数据时
日本基础设施网络安全
数据库查询3人及以上学生
网络安全与信息管理协会
广州圆心网络技术
网络安全比赛检讨
井冈山市十四五网络安全
数据库连接池怎么管理会话
保护网络安全的产品访问控制
java数据库查询动态可变参数
数据库配置的流程
网站服务器 php
软件测试和网络技术
数字化转型过程中网络安全重要性
视频app服务器架构图
阿里巴巴的网络安全员
国民银行 软件开发系统
汇丰软件开发招聘
服务器存储设备采购清单
数据库概论软件
游戏脚本跟游戏软件开发
王其翔-麦苗网络技术
mc小游戏服务器1.8
台湾代理服务器2022
计算机网络技术简历描述
桐柏app软件开发公司
外包软件开发规范