Hive压缩方法的选择

(以下内容主要为读《Hive编程指南》后的小小总结。
1.背景
尽管hadoop 的文件系统支持对于非压缩数据的线性扩展存储,但是对数据进行压缩还是有很大好处的—节约磁盘空间、增加吞吐量和性能(通过减少载入内存的数据量而提高IO吞吐量会更加提高网络传输性能)。当然,文件压缩过程和解压缩过程会增加CPU开销。
压缩作用于不同类型的任务,影响是不一样的。对于:
IO密集型,可以以提高性能。Hadoop的Job通常是IO密集型的。
CPU密集型,会降低执行效率。
在这里插入图片描述
上表内容整理自 https://blog.csdn.net/youanyyou/article/details/78990156。

2.那么如何确定是否压缩呢?
尝试不同学则,测量对比执行结果。
3.为什么需要不同的压缩方案?
每一个压缩方案(Bzip2、Gzip、Snappy、Lzo)都在压缩速度和压缩率间进行权衡。
如何选择?
1)如果磁盘空间利用率和IO开销都需要考虑的话,Bzip2与Gzip 都是有吸引力的。
Bzip2 压缩率最高,同时需要消耗最多的CPU开销。
Gzip 是 压缩率和压缩解压缩速度 上的下一个选择。
2)如果频繁读取数据所需的及诶压缩速度更为重要的话,Lzo和Snappy是不错的选择。—压缩/解压缩速度更快。
3)压缩格式的文件是否是可分割的。MR会将非常大的输入文件分割成多个划分,一个文件对应一个划分,每个划分会被分到一个单独的map进程。当压缩有边界信息才可以划分。
Gzip和Snappy压缩的文件不可划分。如何弥补?当创建文件时,将文件分割成期望的大小。如果不可分割的文件特别大,就会出现一个单独的tsak来读取整个文件。
Bzip2和Lzo提供了块级别的压缩,也就是每个块中都含有完整的记录信息,Hadoop可在块边界级别对这些文件进行划分。

4.关于文件格式:
1)怎样分割成行的
InputFormat 定义了如何读取划分,如何将划分分割成记录。
OutputFormat 定义了如何将划分写回到文件或控制台输出中。
(文本文件默认使用\n作行分隔符)
2)怎样分割成字段的
Hive使用SerDe (序列化/反序列化) 作为对输入记录进行分隔(反序列化)以及写记录(序列化)的模板,永辉只需要指定完成这两部分工作的一个Java类即可。
(文本文件默认使用^A 作字段分隔符)

猜你喜欢

转载自blog.csdn.net/AnlaGodness/article/details/105835477