Hadoop SequnceFile.Writer 压缩模式及压缩库浅析
2019独角兽企业重金招聘Python工程师标准>>>
先说明SequnceFile的压缩类型(Compression Type)分为三种NONE,RECORD,BLOCK,通过配置项io.seqfile.compression.type指定:
NONE, Do not compress records 即不压缩
RECORD, Compress values only, each separately. 每条记录都对value进行一次压缩
BLOCK, Compress sequences of records together in blocks. 块压缩,当缓存的key和value字节大小达到指定的阈值,则进行压缩,阈值由配置项io.seqfile.compress.blocksize指定,默认值为1000000字节
RECORD,BLOCK使用的压缩算法是由创建SequnceFile.Writer 时指定的CompressionOption决定的, CompressionOption中CompressionCodec codec属性即为压缩编码器, 不指定时默认为org.apache.hadoop.io.compress.DefaultCodec 对应的底层压缩库为zlib, 除了DefaultCodec还有几个其他的CompressionCodec:GzipCodec Lz4Codec SnappyCodec BZip2Codec 这里不做比较
DefaultCodec在实现zlib压缩的时候,可以指定使用libhadoop.so(hadoop 框架提供的native库)或java.util.zip库。下面了解下如何开启hadoop native库或java zip库:
SequnceFile 默认使用的是org.apache.hadoop.io.compress.DefaultCodec 压缩方式,使用的是Deflate的压缩算法
DefaultCodec在创建压缩器时会执行类ZlibFactory.getZlibCompressor(conf)方法,实现代码片段:
return (isNativeZlibLoaded(conf)) ?new ZlibCompressor(conf) :new BuiltInZlibDeflater(ZlibFactory.getCompressionLevel(conf).compressionLevel());
当加载本地Zlib库时,使用的是ZlibCompressor压缩器类,否则使用BuiltInZlibDeflater类,BuiltInZlibDeflater类是调用java的java.util.zip.Inflater类实现;
其中isNativeZlibLoaded是根据NativeCodeLoader类是否已经加载hadoop native库来判断的,代码如下:
// Try to load native hadoop library and set fallback flag appropriatelyif(LOG.isDebugEnabled()) {LOG.debug("Trying to load the custom-built native-hadoop library...");}try {System.loadLibrary("hadoop");LOG.debug("Loaded the native-hadoop library");nativeCodeLoaded = true;} catch (Throwable t) {// Ignore failure to loadif(LOG.isDebugEnabled()) {LOG.debug("Failed to load native-hadoop with error: " + t);LOG.debug("java.library.path=" +System.getProperty("java.library.path"));}}if (!nativeCodeLoaded) {LOG.warn("Unable to load native-hadoop library for your platform... " +"using builtin-java classes where applicable");}
其中System.loadLibrary("hadoop"); 在linux上查找的就是libhadoop.so。
总结:当无法加载本地的hadoop库,hadoop会使用java.util.zip.Inflater类来对SequnceFile进行压缩;当可以加载到本地hadoop库,则使用本地的库。
下面来比较实用native hadoop库和不使用native hadoop的性能区别。
不使用native hadoop即在jvm运行参数java.library.path中不包含native库的路径:
java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
使用则在后面加上hadoop的native库路径:
java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib:$HADOOP_HOME/lib/native
虚拟机集群:
50w 数据,sequnceFile压缩模式为RECORD, key为随机的10字节,value为随机200字节:
native lib disabled: 32689ms after compression 114.07 MB
native lib enabled: 30625ms after compression 114.07 MB
50w 数据,sequnceFile压缩模式为BLOCK, key为随机的10字节,value为随机200字节:
native lib disabled: 11354ms after compression 101.17 MB
native lib enabled: 10699ms after compression 101.17 MB
物理机集群:
50w 数据,sequnceFile压缩模式为RECORD, key为随机的10字节,value为随机200字节:
native lib disabled: 21953ms after compression 114.07 MB
native lib enabled: 24742ms after compression 114.07 MB
100w 数据,sequnceFile压缩模式为RECORD, key为随机的10字节,value为随机200字节:
native lib disabled: 48555ms after compression 228.14 MB
native lib enabled: 45770ms after compression 228.14 MB
100w 数据,sequnceFile压缩模式为RECORD, key为随机的10字节,value为随机200字节, 设置zlib压缩级别为BEST_SPEED:
native lib disabled: 44872ms after compression 228.14 MB
native lib enabled: 51582ms after compression 228.14 MB
100w 数据,sequnceFile压缩模式为BLOCK, key为随机的10字节,value为随机200字节, 设置zlib压缩级别为BEST_SPEED:
native lib disabled: 14374ms after compression 203.54 MB
native lib enabled: 14639ms after compression 203.54 MB
100w 数据,sequnceFile压缩模式为BLOCK, key为随机的10字节,value为随机200字节, 设置zlib压缩级别为DEFAULT_COMPRESSION:
native lib disabled: 15397ms after compression 203.54 MB
native lib enabled: 13669ms after compression 203.54 MB
分析测试结果,总结如下:
当在不同的压缩模式,或不同的数据量,以及不同的zlib压缩级别时,使用hadoop native库压缩和使用java zip库之间没有太大差别
后续再尝试其他的native压缩编码方式: GzipCodec Lz4Codec SnappyCodec BZip2Codec
转载于:https://my.oschina.net/shipley/blog/498712
Hadoop SequnceFile.Writer 压缩模式及压缩库浅析相关推荐
- 11g 日志传输压缩模式
[20181112]11g 日志传输压缩模式.txt --//由于主备库不在一个局域网内,一样采用级联模式,先传输日志到一台主机,然后在由这台备库传输日志到远端的dataguard备库. --//这样 ...
- Hadoop所支持的几种压缩格式
1 gzip压缩 优点:压缩率比较高,而且压缩/解压速度也比较快:hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样:有hadoop native库:大部分linux系统都自带g ...
- Zlib压缩库压缩比率和压缩性能测试 (1)
Zlib1.2.6库是Jean-loup Gailly 和Mark Adler开发的压缩函数库,基于LZ77(Ziv, Jacob, and Abraham Lempel. "A unive ...
- MyZip pro专业极速解压放弃了Mac上落后的拖拽解压压缩模式,采用『右键菜单』进行压缩、解压,极大的符合了用户最初的使用习惯。
1.右键压缩解压 首先,MyZip放弃了Mac上落后的拖拽解压压缩模式,采用『右键菜单』进行压缩.解压,极大的符合了用户最初的使用习惯. 2.多线程极速压缩 很多时候,我们在Mac上压缩总感觉很慢,7 ...
- Hadoop集群中添加Snappy解压缩库
Snappy是用C++开发的压缩和解压缩开发包,旨在提供高速压缩速度和合理的压缩率.Snappy比zlib更快,但文件相对要大20%到100%.在64位模式的Core i7处理器上,可达每秒250~5 ...
- 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )
文章目录 一.使用 libjpeg-turbo 压缩图片流程 二.初始化 JPEG 压缩对象 三.打开文件 四.设置压缩参数 五.开始压缩 六.循环写入压缩数据 七.完成图片压缩及收尾 八.libjp ...
- 从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构)
从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到,以致后来初次接触Hadoop与MapReduce这两个东西,我便稍显兴奋,觉得它们很是神秘,而神秘的东西常能勾起 ...
- Android图片压缩(质量压缩和尺寸压缩)
在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手 ...
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( 图片质量压缩方法 | 查找 Java 源码中的 native 方法对应的 C++ 源码 )
文章目录 一. 图片质量压缩方法 二. 查找对应的 Native 方法源码 三. 分析 Bitmap.cpp 中动态注册 Native 方法 在博客 [Android 内存优化]图片文件压缩 ( An ...
最新文章
- JQ 全选后获取选中的值_为什么在PBI中还需要切片器之三:Excel切片器之度量值切换...
- python百度网盘-bypy-百度网盘Python客户端 linux
- 考研常识:研究生单独考试是什么意思?
- 二维树状数组模板(区间修改+区间查询)
- 2017.8.23创业项目方向
- 【CF#801 A.】 Vicious Keyboard(字符串查找,水题)
- 原始Dao开发方法以及存在的问题
- vmware下ubuntu重启后不能上网
- 27 MM配置-采购-采购申请-定义凭证层的屏幕格式
- android不是内部或外部命令,也不是可执行的程序或批处理文件
- vsflexgrid 最后一行 求和_合并单元格求和、计数、平均值,这个方法很实用
- nginx服务器带宽_如何设置服务器的带宽?
- Web开发编程语言是最适合新手的吗-开课吧
- C++ 练习题(二)计算机存储和数字系统介绍
- php7 switch,Switch autocommit on or off - PHP 7 中文文档
- GJB 150.10军用设备环境试验方法霉菌试验
- 七上八下猜数字_《脑筋急转弯》
- idea svn update 时不弹出选择分支的对话框,don't show this dialog in the furture解决方案
- 高德地图marker事件监听-高德地图marker绑定事件就执行了[解决立即执行]
- Hadoop3x,Hadoop2x新特性
热门文章
- php引用数据库实例,PHP单例模式实例,连接数据库对类的引用
- hdu3415单调队列
- 【数字信号处理】傅里叶变换性质 ( 序列傅里叶变换共轭对称性质示例 )
- 【数字信号处理】LTI 系统因果性与稳定性示例 ( 示例一 | 示例二 )
- 【Android 逆向】Android 系统文件分析 ( /proc/pid 进程号对应进程目录 | oom_adj | maps | smaps | mem | task | environ )
- 【Android 逆向】Android 系统文件分析 ( Android 系统 root 环境准备 | 查看 Android 根目录信息 )
- 【开发环境】Mac 中安装 Python3 最新版本 ( 下载 Python 最新版本 | 安装 Python3 | 验证 Python3 )
- 【Java 网络编程】网络相关概念
- 【JavaEE WEB 开发】Tomcat 详解 Servlet 入门
- 【Android 应用开发】BluetoothDevice详解