深入学习《Programing Hive》:数据压缩

标签: 学习 programing hive | 发表时间:2014-01-08 17:22 | 作者:skywhsq1987
出处:http://www.iteye.com

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为激活中间数据压缩功能:

Java代码   收藏代码
  1. <property>  
  2.     <name>hive.exec.compress.intermediate</name>  
  3.     <value>true</value>  
  4.     <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>  
  5. </property>  


         具体的压缩算法参数配置,这是一个hadoop的配置参数,可以在Hadoop的$HADOOP_HOME/conf/marred-site.xml或$HADOOP_HOME/conf/hive-site.xml配置文件中。 SnappyCodec比较适合在这种场景中编解码器,该算法会带来很好的压缩性能和较低的CPU开销

Java代码   收藏代码
  1. <property>  
  2.     <name>mapred.map.output.compression.codec</name>  
  3.     <value>org.apache.hadoop.io.compress.SnappyCodec</value>  
  4.     <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>  
  5. </property>  


  
         最Hive的数据文件压缩
         用户可以对最终生成的Hive表的数据通常也需要压缩。参数 hive.exec.compress.output控制这一功能的激活与禁用。用户可以通过节本来打开这个功能,同样也可以在XML配置文件中将该功能配置成全局变量:

Java代码   收藏代码
  1. <property>  
  2.     <name>hive.exec.compress.output</name>  
  3.     <value>true</value>  
  4.     <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>  
  5. </property>  


         将hive.exec.compress.output参数设置成true后,然后选择一个合适的编解码器,如选择SnappyCodec:

Java代码   收藏代码
  1. <property>  
  2.     <name>mapred.output.compression.codec</name>  
  3.     <value>org.apache.hadoop.io.compress.SnappyCodec</value>  
  4. </property>  



         Sequence Files
         压缩数据文件可以节省磁盘空间,但是在Hadoop中有些原生压缩文件的缺点之一就是不支持分割。支持分割的文件可以并行的有多个mapper程序处理大数据文件,大多数文件不支持可分割是因为这些文件只能从头开始读。
         Sequence File是可分割的文件格式,支持Hadoop的block级压缩。这样,我们就可以将Hive表存储定义成SEQUENCEFILE:

Java代码   收藏代码
  1. CREATE TABLE a_sequence_file_table SORTED AS SEQUENCEFILE;  


         Sequence Files有三个不同的压缩选项:NOE,RECORD和BLOCK。RECORD是默认选项,通常BLOCK会带来较RECORD更好的压缩性能。同很 多其他压缩选项一样,这个压缩类型参数不是Hive特有的,需要在Hadoop中或在每一个Hive查询脚本中2设置。

Java代码   收藏代码
  1. <property>  
  2.     <name>mapred.output.compression.type</name>  
  3.     <value>BLOCK</value>  
  4.     <description>If the job outputs are to compressed as SequenceFiles,how should the be compressed? Should be one od NONE,RECORDOR BLOCK.</description>  
  5. </property>  


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [学习 programing hive] 推荐:

深入学习《Programing Hive》:数据压缩

- - 互联网 - ITeye博客
Hive使用的是Hadoop的文件系统和文件格式,比如TEXTFILE,SEQUENCEFILE等.          在Hive中对中间数据或最终数据数据做压缩,是提高数据吞吐量和性能的一种手段. 对数据做压缩,可以大量减少磁盘的存储空间,比如基于文本的数据文件, 可以将文件压缩40%或更多,同时压缩后的文件在磁盘间传输和I/O也会大大减少;当然压缩和解压缩也会带来额外的CPU开销,但是却可以节省更多的I /O和使用更少的内存开销.

hiveQL学习和hive常用操作

- - 数据库 - ITeye博客
Hive外壳环境是可以使用hive命令来运行的一项服务. service选项指明要使用哪种服务. 键入hive-servicehelp可以获得可用服务.    Hive的命令行接口(外壳环境).     让Hive以提供Trift服务的服务器形式运行,允许用不同语言编写的客户端进. 使用Thrift,  JDBC和ODBC连接器的客户端需要运行Hive服务器来.

通过一个具体的实例来学习hive

- - CSDN博客云计算推荐文章
   ----资源来自于官网教程. CREATE TABLE u_data ( userid INT, movieid INT, rating INT, unixtime STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;.

hive调优

- - 互联网 - ITeye博客
一、    控制hive任务中的map数: . 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);.

hive 优化 tips

- - CSDN博客推荐文章
一、     Hive join优化. 也可以显示声明进行map join:特别适用于小表join大表的时候,SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key. 2.     注意带表分区的join, 如:.

Hive中的join

- - CSDN博客云计算推荐文章
select a.* from a join b on a.id = b.id select a.* from a join b on (a.id = b.id and a.department = b.department). 在使用join写查询的时候有一个原则:应该将条目少的表或者子查询放在join操作符的左边.

hive优化(2)

- - 开源软件 - ITeye博客
Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具. 使用Hive尽量按照分布式计算的一些特点来设计sql,和传统关系型数据库有区别,. 所以需要去掉原有关系型数据库下开发的一些固有思维. 1:尽量尽早地过滤数据,减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段.

hive优化

- - 开源软件 - ITeye博客
hive.optimize.cp=true:列裁剪. hive.optimize.prunner:分区裁剪. hive.limit.optimize.enable=true:优化LIMIT n语句. hive.limit.optimize.limit.file=10:最大文件数.   1.job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB).

Hive优化

- - 互联网 - ITeye博客
     使用Hive有一段时间了,目前发现需要进行优化的较多出现在出现join、distinct的情况下,而且一般都是reduce过程较慢.      Reduce过程比较慢的现象又可以分为两类:. 情形一:map已经达到100%,而reduce阶段一直是99%,属于数据倾斜. 情形二:使用了count(distinct)或者group by的操作,现象是reduce有进度但是进度缓慢,31%-32%-34%...一个附带的提示是使用reduce个数很可能是1.

hive bucket 桶

- - CSDN博客推荐文章
对于每一个表(table)或者分区,Hive可以进一步组织成桶. Hive也是针对某一列进行桶的组织. Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中. 采用桶能够带来一些好处,比如JOIN操作. 对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作. 那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量.