Hive使用的是Hadoop的文件系统和文件格式,比如TEXTFILE,SEQUENCEFILE等。
在Hive中对中间数据或最终数据数据做压缩,是提高数据吞吐量和性能的一种手段。对数据做压缩,可以大量减少磁盘的存储空间,比如基于文本的数据文件,可以将文件压缩40%或更多,同时压缩后的文件在磁盘间传输和I/O也会大大减少;当然压缩和解压缩也会带来额外的CPU开销,但是却可以节省更多的I/O和使用更少的内存开销。
Hadoop jobs作业,往往是I/O密集型的,而非CPU集型的。数据压缩对I/O密集型的作业带来大大的性能提升,但是如果用户的jobs作业时CPU密集型的,那么在使用压缩就会降低性能,这就要用户对作业的类型做判断,权衡是否要对数据做压缩。
选择合适的编解码器
对数据做压缩,可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,但对数据做压缩和解压缩总会增加CPU的开销,故最好对那些I/O密集型的作业使用数据压缩——这样的作业会有富余的CPU资源,或者对那些磁盘空间不富裕的系统。
Hadoop默认支持Gzip和BZip2的解压缩方式,包括原生的linux解压缩库。Snappy压缩在最近的Hive版本中才被添加的压缩算法,如果您使用的是Hive不支持Snappy的话,用户就要手动添加。过去经常使用的是LZO压缩算法。
那么,为什么要使用不同的压缩算法呢?它们都有什么区别呢?BZip2有最高的压缩比但也会带来更高的CPU开销,Gzip较BZip2次之;如果基于磁盘利用率和I/O考虑,这两个压缩算法都是比较有吸引力的算法。
LZO和Snappy算法有更快的解压缩速度,如果在关注数据解压多于磁盘利用率和I/O开销的场景中,它们都是不错的选择。
LZO和Snappy在压缩数据上大致相当,但Snappy算法在解压速度上要较LZO更快。
在选择解压缩算法时,另外一个比较重要的考虑就是压缩格式是否是支持可分割的。Hadoop的会将大文件分割成HDFS block(默认64MB)大小的splits分片,每个分片对应一个Mapper程序。在这几个压缩算法中,只有
BZip2和LZO提供block级的压缩,而Gzip和Snappy则不支持。
Snappy压缩算法时首选。
打开Hive(即由mappe产生的)中间数据文件的压缩功能
HiveQL语句最终会被编译成Hadoop的Mapreduce job,开启Hive的中间数据压缩功能,就是在MapReduce的shuffle阶段对mapper产生的中间结果数据压缩。在这个阶段,优先选择一个低CPU开销的算法。
可以通过参数hive.exec.compress.intermediate来开启和禁用该功能,默认情况下该值值为false,将之设置为true为激活中间数据压缩功能:
<property>
<name>hive.exec.compress.intermediate</name>
<value>true</value>
<description>This controls whether intermediate files produced by Hive between mutiple map-redece job are compressed.The compression codec and other options are determined from hadoop config variables mared.output.compress*</description>
</property>
具体的压缩算法参数配置,这是一个hadoop的配置参数,可以在Hadoop的$HADOOP_HOME/conf/marred-site.xml或$HADOOP_HOME/conf/hive-site.xml配置文件中。
SnappyCodec比较适合在这种场景中编解码器,该算法会带来很好的压缩性能和较低的CPU开销:
<property>
<name>mapred.map.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
<description>This controls whether intermediate files produced by Hive between mutiple map-redece job are compressed.The compression codec and other options are determined from hadoop config variables mared.output.compress*</description>
</property>
最Hive的数据文件压缩
用户可以对最终生成的Hive表的数据通常也需要压缩。参数
hive.exec.compress.output控制这一功能的激活与禁用。用户可以通过节本来打开这个功能,同样也可以在XML配置文件中将该功能配置成全局变量:
<property>
<name>hive.exec.compress.output</name>
<value>true</value>
<description>This controls whether the final outpus of a query( to a local/hdfs file or a Hive table) is compressed.The compression codec and other options are determined from hadoop config variables mared.output.compress*</description>
</property>
将hive.exec.compress.output参数设置成true后,然后选择一个合适的编解码器,如选择SnappyCodec:
<property>
<name>mapred.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
Sequence Files
压缩数据文件可以节省磁盘空间,但是在Hadoop中有些原生压缩文件的缺点之一就是不支持分割。支持分割的文件可以并行的有多个mapper程序处理大数据文件,大多数文件不支持可分割是因为这些文件只能从头开始读。
Sequence File是可分割的文件格式,支持Hadoop的block级压缩。这样,我们就可以将Hive表存储定义成SEQUENCEFILE:
CREATE TABLE a_sequence_file_table SORTED AS SEQUENCEFILE;
Sequence Files有三个不同的压缩选项:NOE,RECORD和BLOCK。RECORD是默认选项,通常BLOCK会带来较RECORD更好的压缩性能。同很多其他压缩选项一样,这个压缩类型参数不是Hive特有的,需要在Hadoop中或在每一个Hive查询脚本中2设置。
<property>
<name>mapred.output.compression.type</name>
<value>BLOCK</value>
<description>If the job outputs are to compressed as SequenceFiles,how should the be compressed? Should be one od NONE,RECORDOR BLOCK.</description>
</property>
分享到:
相关推荐
HIVE编程指南中文版,是由programing hive翻译过来
学习者可能需要读取和写入文件,例如,读取文本文件中的数据,处理后写回结果,或者将程序的输出以文件形式保存。理解文件流的概念和操作方法至关重要。 面向对象编程(OOP)的概念可能也会有所涉及,即使是在初级...
只要它可以帮助正在学习新算法的人,它是否从某个地方复制并不重要。 图形示例也将非常有帮助。 不要忘记包括测试。 不要删除以前的算法实现。 只需使用您自己的实现添加一个新文件。 美化和清理您的代码以便于阅读...
《Programming with MFC》是关于Microsoft Foundation Classes (MFC) 的编程指南,MFC 是微软为Windows应用程序开发提供的...通过深入学习MFC,开发者可以更好地理解和控制Windows应用程序的生命周期,提高开发效率。
Hive编程指南中文版翻译,Hive programing
直线-u'jdbc:hive2:// headnodehost:10001 /; transportMode = http'-f demo.hql #this用于将txt文件存储在azure中 直线-u'jdbc:hive2:// headnodehost:10001 /; transportMode = ...
c++ programingc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ ...
《集体智慧编程》是一本深入探讨如何利用网络和大规模数据来构建智能系统的经典著作。这本书主要关注的是如何通过编程技术来挖掘和利用互联网上的集体智慧,从而实现机器学习和人工智能的应用。书中涵盖了一系列的...
通过深入研究这个"programing-GIS:代码和笔记本",学习者不仅可以掌握GIS编程的基本技能,还能了解如何将这些技能应用于实际问题,比如城市规划、环境保护、交通分析等领域。这将是一个宝贵的学习资源,帮助开发者将...
"Algorithm-competitive-programming.zip"这个压缩包文件,显然是为了帮助学习者深入理解和掌握算法以及如何在竞争编程中运用它们。让我们一起探讨其中蕴含的知识点。 1. **算法基础**:算法是一系列精确的步骤,...
根据提供的文件信息,实际内容与要求的C编程语言知识点不符,该文件内容为一份小品剧本,因此将基于剧本中的元素进行无关内容的剔除,接下来将围绕...掌握这些基础概念对于学习更高级的语言和技术也是非常有帮助的。
以上只是Python编程中的一些基础知识点,Python的生态庞大,还有更多高级特性和框架,如网络编程、并发处理、网络爬虫、机器学习、深度学习等,都需要进一步深入学习。Python-programing-main这个压缩包可能包含了...
通过参考"压缩包子文件的文件名称列表"中的"C programing",我们可以推测这个压缩包可能包含了C语言编程的实例代码,这些代码可以用来演示上述知识点的应用,帮助学习者更好地理解和实践C语言编程。如果对某个特定的...
“competive_programing-master”作为压缩包子文件的名称,暗示这是一个Git仓库的主分支,通常包含项目的源代码、文档、测试用例等。用户可能可以从中找到关于如何使用Python解决各种算法问题的示例代码,也可能包含...
《C Programming Language》是计算机编程领域的一本经典著作,由Brian W. Kernighan和Dennis M....通过深入学习《C Programming Language》,你可以建立起坚实的编程基础,为后续的编程学习打下坚实的基础。
以下是对"C++ programing language"知识的详细整理: 1. **基础语法**:C++的基础语法与C语言类似,包括变量声明、数据类型(如int、float、char)、运算符、流程控制(如if-else、for、while、switch-case)等。 ...
在"visualization-programing:这是个人毕业设计"项目中,我们可以推测这是一个使用TypeScript语言实现的可视化编程工具或平台。 TypeScript是JavaScript的一个超集,由微软开发,旨在提供静态类型检查、类和模块等...