我们Hadoop 2.4集群默认不支持snappy压缩,但是最近有业务方说他们的部分数据是snappy压缩的(这部分数据由另外一个集群提供给他们时就是snappy压缩格式的)想迁移到到我们集群上面来进行计算 not available: this version of libhadoop was built without snappy support 根据报错信息显示snappy本地库不可用,同时似乎在编译 libhadoop的时候需要特别指定以支持snappy,这一点不同于hadoop1.0,hadoop1.0只需要将snappy的本地库文件往指定目录一拷贝就行,不需要重新编译libhadoop本地库文件 以上说了半天题外话,以下来进入主题来说一下怎样在不替换集群本地库文件,不重启hadoop进程,也即在hadoop的客户端就能解决支持snappy压缩的问题的方法: 1、编译snappy本地库,编译之后snappy (*) from snappy_test; 运行hql之后,发现RCFile+snappy的数据能够正常处理计算,同时200+M的文件split成两个map任务处理,测试完成。
——《城门开》 项目介绍 Snappy Java 是一个用于压缩和解压缩数据的高效Java库,它基于谷歌的 Snappy 压缩算法。 Snappy Java 是 Snappy 算法的 Java 实现,它能够无缝集成到 Java 项目中,为开发者提供快速的压缩和解压缩操作,同时保留了跨平台的兼容性和高效的性能。 Snappy 的主要特点: 高压缩速度:相比于其他压缩算法,Snappy 的压缩速度非常快,适用于低延迟的应用。 适度压缩率:虽然压缩率不如一些其他压缩算法,但在大多数场景下,Snappy 的压缩率足以应对需求。 轻量级:Snappy 算法设计简洁,适合嵌入到各种应用中,尤其适合大规模的数据处理场景。 Snappy Java 的详细教程、常见问题解答和最佳实践。
snappy压缩在Hadoop中不是自带的,本文介绍在hadoop2.0中安装和配置snappy压缩,使hadoop2.0支持snappy压缩。 1 安装snappy库 可以从https://code.google.com/p/snappy/下载源码,通过编译源码安装 tar -zxvf snappy-1.1.1.tar.gz cd snappy /configure make sudo make install 也可以直接用yum来安装 sudo yum install snappy snappy-devel 2 安装hadoop-snappy 包 从https://github.com/electrum/hadoop-snappy下载hadoop-snappy包hadoop-snappy-master.zip 解压 unzip hadoop-snappy-master.zip hadoop-snappy-0.0.1-SNAPSHOT.tar.gz cp-r hadoop-snappy-0.0.1-SNAPSHOT/lib/* $HADOOP_HOME/lib Snappy 0.0.1
这样就在执行命令的目录下将hadoop-snappy的源码拷贝出来放在hadoop-snappy目录中。 2)编译hadoop-snappy源码 切换到hadoop-snappy源码的目录下,执行如下命令: a、如果上面安装snappy使用的是默认路径,命令为: mvn package b、如果上面安装的snappy 使用的是自定义路径,则命令为: mvn package [-Dsnappy.prefix=SNAPPY_INSTALLATION_DIR] 其中SNAPPY_INSTALLATION_DIR位snappy /hadoop-snappy-read-only/maven/build-compilenative.xml:75: exec returned: 解决方案:Hadoop Snappy的官方文档仅仅列出了需要 5、Hadoop 2.2.0配置snappy hadoop-snappy编译成功后,会在hadoop-snappy目录下的target目录中生成一些文件,其中有一个文件名为:hadoop-snappy-
not available: this version of libhadoop was built without snappy support. 造成以上错误的原因是Hadoop的二进制安装包中没有snappy支持,需要手工重新编译。 操作过程: 1. 下载所需要的源码包 snappy-1.1.1.tar.gz protobuf-2.5.0.tar.gz hadoop-2.7.2-src.tar.gz 2. 编译安装snappy # 用root用户执行以下命令 tar -zxvf snappy-1.1.1.tar.gz cd snappy-1.1.1/ . /configure make make install # 查看snappy库文件 ls -lh /usr/local/lib |grep snappy 4.
这篇从群里小伙伴的这个问题出发,分析一下有关snappy压缩的一些事情及spark 在处理这一块的源码层面分析。 先给结论 1、snappy压缩格式本身是不可切分的; 2、snappy压缩格式作用在文本类文件格式上不可切分; 3、snappy压缩格式作用在Sequence、Avro、parquet、orc等这些容器类的文件格式上 也就是说,snappy作用的地方是stripe里的row data部分。 File Footer也没有被snappy压缩 综上,我们知道orc使用snappy压缩后,索引信息还在,这就使得在压缩后,仍然能支持从指定任意一行开始读取。 而snappy的压缩是没有继承SplittableCompressionCodecr的,所以用snappy的算法来压缩文本文件,是不可切分的。
今天给大家推荐的是一个google开源的快速、无损的压缩包:snappy。 snappy算法是google开源的。该包是google使用go语言来实现的。 项目地址如下: 项目地址:https://github.com/golang/snappy 星标:1.4k 使用者:97.7k 简介 该包的目标并不是最大化的压缩比例,也不是和其他压缩库兼容;相反,snappy 特性 snappy压缩算法具有以下特性: 快速:压缩速度大概在250MB/秒及更快的速度进行压缩。 Snappy位流格式是稳定的,不会在版本之间发生变化 健壮性:Snappy解压缩器设计为不会因遇到损坏或恶意输入而崩溃 性能 Snappy的目标是快速。 在我们的测试中,Snappy通常比同一级别的算法(如LZO、LZF、QuickLZ等)更快,同时实现了类似的压缩率。 示例 我们看下snappy的使用。
Hadoop生态中主流压缩格式Gzip、LZO和Snappy各有特点,正确选择能显著提升集群性能。本文将深入分析其特性并提供选型指南。 一、为什么压缩在Hadoop中至关重要? 和磁盘I/O时间 提升处理效率:MapReduce/Spark任务读取更少数据量 兼容性保障:支持多种文件格式(ORC/Parquet/Text等) 二、核心压缩格式特性对比 特性 Gzip LZO Snappy B -->|No| D[选择Gzip] C -->|极速处理| E[Snappy] C -->|平衡选择| F[LZO] D --> G[冷数据/归档场景] E --> 0.38TB 9min 8min 126s 结论:Snappy在计算密集型场景优势明显,Gzip存储节省最多 六、进阶建议 混合使用策略: 最终存储:Gzip(高压缩率) 中间数据:Snappy( LZ4:比Snappy更快的解压速度 结语 选择压缩格式本质是存储、CPU、I/O之间的权衡: 存储敏感 → Gzip/ZLIB 计算敏感 → Snappy/LZ4 需要分片 → LZO/Zstandard
hive> show create table hive_table_test_parquet_snappy; OK CREATE TABLE `hive_table_test_parquet_snappy set hive.exec.compress.output=true; set hive.parquet.compression=snappy; create table hive_table_test_parquet_snappy 3 问题解决 1.重新生成hive_table_test_parquet_snappy表,使用以下语句: set parquet.compression=SNAPPY; create table hive_table_test_parquet_snappy 4.查看hive_table_test_parquet_snappy的底层文件 ? 4 问题总结 1.为什么使用Hive生成的“snappy”文件无法被Impala查询,是因为生成的并不是snappy文件,而是deflate的压缩文件,而该压缩在Impala中并不支持。
Snappy编解码器:高速低压缩比的利器 在众多数据压缩方案中,Snappy编解码器以其卓越的速度表现脱颖而出,成为处理实时数据和高吞吐场景的首选工具。 这种特性使得Snappy更适合处理对I/O性能要求较高的场景,如实时数据分析、流处理管道中的中间数据存储等。 在Hive中配置Snappy编解码器相对简单。 首先需要确保Hadoop集群中已经安装了Snappy原生库,推荐使用最新版本的hadoop-snappy包以获得更好的性能优化。 从兼容性角度看,Snappy得到了大数据生态系统的广泛支持。除了Hive外,Spark、Flink、Kafka等主流大数据组件都原生支持Snappy编解码器。 性能对比:LZO vs Snappy vs GZIP 从压缩速度维度看,LZO介于Snappy和GZIP之间。
别再一把梭哈了:聊聊文件格式里的压缩取舍——Snappy和Zstd到底怎么选? 很多同学在建Hive表、写Spark任务、上湖仓的时候,压缩格式基本是这么选的:Parquet+Snappy(默认)ORC+Snappy(还是默认)为啥? 接下来我们就用Snappy和Zstd这对老对手,掰开揉碎聊。二、Snappy:快,就是它最大的信仰1️⃣Snappy是干嘛的?一句话总结:Snappy不是为了“压得小”,而是为了“解得快”。 2️⃣Snappy的典型使用场景我在生产中看到Snappy被大量用在这些地方:明细层(ODS/DWD)高频Scan表实时/准实时计算CPU紧张但磁盘还算富裕的集群因为它的特性很“工程化”:你几乎不用为它操心 Snappy没有过时,Zstd也不是银弹。
snappy 库的头文件翻译 官方这本书之所以要用 snappy 举例,(我想)也是因为它够简单。 我们查看 snappy-c.h 头文件,发现里面只有如下几个定义: typedef enum { SNAPPY_OK = 0, SNAPPY_INVALID_INPUT = 1, SNAPPY_BUFFER_TOO_SMALL = 2 } snappy_status; snappy_status snappy_compress(const char* input, #[link(name = "snappy")] 这个属性指示,我们到时要链接 snappy 这个库(比如,在 Linux 下就是对应 libsnappy.so 这个文件)。 因为我们现在做的正是对 snappy 库的 Rust 封装。snappy 库是 C 写的,编译后,(一般)形成动态链接库,安装在系统约定路径中。
snappy-1.1.3/ [root@hadoop001 snappy-1.1.3]# . /configure [root@hadoop001 snappy-1.1.3]# make [root@hadoop001 snappy-1.1.3]# make install # 查看snappy 库文件 [root@hadoop001 snappy-1.1.3]# ls -lh /usr/local/lib |grep snappy 3.编译安装protobuf [root@hadoop001 ,下面我们先看到snappy的开源网站上看看。 我们可以看到snappy压缩达到了250MB/s,解压达到了500MB/s,这性能直接碾压上面所列举的那几个!所以snappy也常作为企业数据压缩格式!
使用Zlib压缩率高,但效率差一些;使用Snappy效率高,但压缩率低。 Parquet表支持Uncompress、Snappy、Gzip、Lzo压缩,默认不压缩Uncompressed。 orc.compress的值可以为NONE、ZLIB、SNAPPY,默认为ZLIB。 然后再创建一个使用SNAPPY压缩的ORC表: create table compress_orc_snappy ROW FORMAT DELIMITED FIELDS TERMINATED BY '\ 然后创建压缩率较低,但效率较高的Snappy格式的Parquet表: create table compress_parquet_snappy ROW FORMAT DELIMITED FIELDS TERMINATED --设置parquet表的压缩格式为SNAPPY set parquet.compression=SNAPPY; --设置orc表的压缩格式为SNAPPY set orc.compress=SNAPPY
3.需要支持snappy的发现与修复过程: 迁移表的过程中计划使用官方的import/export工具进行,第一步需要在目标集群建表,通过desc信息在目标集群建表完成后,list可看到表,通过scan 通过google查询需要HBase支持snappy压缩算法,通过hadoop checknative发现集群默认确实不支持snappy算法(虽然安装snappyrpm Native library checking HBase.regionserver.codecs value为snappy即可,在测试集群通过该方法,HBase启动失败 后确认tlinux1.2的hadoop集群上支持snappy的方法:即需要在特定系统编译 再hadoop checknative后发现已支持snappy。逐步全量重启HBase。 这两个步骤的操作过程中注意观察日志是否有异常,实践中首次尝试此方法有大量错误,发现错误内容为snappy相关,支持snappy后,查看表信息,表内容正常,随机选取表内容对比也正常,可认为此种方法迁移成功
常见压缩算法对比:Gzip/Snappy/Lz4性能对比 0 Gzip方式 1 Snappy方式 2 Lz4方式 0 Gzip方式 import java.io.ByteArrayInputStream 方式 1.0 官网参考 https://github.com/xerial/snappy-java 1.1 引入依赖 <dependency> <groupId>org.xerial.snappy dependency> 1.2 工具类 import lombok.extern.slf4j.Slf4j; import org.xerial.snappy.Snappy; @Slf4j public 1103 10000 61/60/62/73/63 snappy 3260 1056 10000 36/39/33/33/33 snappy-header 3260 1076 10000 57/57/ 56/57/56 3.3 最终总结 综合考虑,snappy具有更优秀的性能,对耗时要求更高的情况,优先考虑。
Snappy Snappy是Google设计的一种快速压缩和解压算法,主要关注速度而非高压缩比。适用于需要快速压缩和解压的场景,如数据库存储和分布式系统中的数据交换。 6. artifactId> <version>0.1.2</version> </dependency> 接下来,修改你的代码以使用Brotli进行压缩和解压缩: import org.xerial.snappy.Snappy private static byte[] brotliCompress(byte[] data) throws IOException { return org.xerial.snappy.Snappy.compress (data); // 注意:此处使用Snappy进行示例,实际上应使用Brotli压缩库,但Java中直接支持Brotli的库较少,Snappy是另一种高效的压缩库。 static byte[] brotliDecompress(byte[] compressedData) throws IOException { return org.xerial.snappy.Snappy.uncompress
,"createdTime":1556604759993}} {"add":{"path":"part-00000-8520f2ed-5a81-4caa-bd24-ca16ae96fcfc-c000.snappy.parquet 1556604760157,"dataChange":true}} {"add":{"path":"part-00003-a4841920-25b7-4822-85c8-c946605227f9-c000.snappy.parquet 1556604760193,"dataChange":true}} {"add":{"path":"part-00007-c23e1896-47dd-4076-a189-174bb45f6384-c000.snappy.parquet 1556604781695,"dataChange":true}} {"add":{"path":"part-00003-bbf64370-749e-4b05-a1aa-83edd474f4dd-c000.snappy.parquet 1556604781707,"dataChange":true}} {"add":{"path":"part-00007-c34873a2-9077-4ed0-9104-3f08059be4c9-c000.snappy.parquet
3.创建一张Parquet文件表,并设定压缩为Snappy,然后将数据插入过去。 set parquet.compression=SNAPPY; create table hive_table_test_parquet_snappy stored as parquet as select 可以看到文本表>Parquet表>Parquet+Snappy表。 3.使用parquet-tools检查hive_table_test_parquet_snappy表中的数据。 可以看到该Parquet文件显示为压缩为SNAPPY,显示正常。问题解决。
压缩格式 Hive支持的压缩格式有bzip2、gzip、deflate、snappy、lzo等。 其中压缩比bzip2 > zlib > gzip > deflate > snappy > lzo > lz4,在不同的测试场景中,会有差异,这仅仅是一个大概的排名情况。 从压缩性能上来看:lz4 > lzo > snappy > deflate > gzip > bzip2,其中lz4、lzo、snappy压缩和解压缩速度快,压缩比低。 所以一般在生产环境中,经常会采用lz4、lzo、snappy压缩,以保证运算效率。 Native Libraries除了自带bzip2, lz4, snappy, zlib压缩方法外,还可以自定义安装需要的功能库(snappy、lzo等)进行扩展。