hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)

时间:2022-09-03 14:50:08

数据做压缩和解压缩会增加CPU的开销,但可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,所以最好对那些I/O密集型的作业使用数据压缩,cpu密集型,使用压缩反而会降低性能。

而hive中间结果是map输出传给reduce,所以应该使用低cpu开销和高压缩效率,一般最好使用snappy。

------------------------------------------------------------------------------

hive表的存储格式有(参见http://blog.csdn.net/longshenlmj/article/details/51702343)

TEXTFILE

    SEQUENCEFILE(三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩)

RCFILE

ORC

自定义格式

hive表存储格式是表自身的存储结构,内部涉及存储数据的结构,查询方法,索引构建等等。支持的数据都是hadoop默认支持的。如txt格式文件,或压缩格式zip、lzo、br2等等。hive外部表只能直接加载这些格式的数据。

源数据在云上(hdfs)压缩存储

Hadoop默认支持Gzip和BZip2的解压缩方式,可直接读取(hadoop fs -text命令),但hive只能用TEXTFILE格式的表加载,然后再insertoverwrite 到其他格式的表(比如SEQUENCEFILE表),如果hive其他格式的表想要直接加载压缩格式数据,需要重写INPUTFORMAT和OUTPUTFORMAT文件类

压缩格式文件的切分(不支持则hadoop不能并行的进行map操作)

BZip2和LZO(提供block级的压缩)支持文件切分

    Gzip和Snappy则不支持。

hadoop中支持的压缩格式

DEFLATEorg.apache.hadoop.io.compress.DefaultCodec

    gzip org.apache.hadoop.io.compress.GzipCodec

    bzip org.apache.hadoop.io.compress.BZip2Codec

    Snappy org.apache.hadoop.io.compress.SnappyCodec

    LZO:

        org.apache.hadoop.io.compress.LzopCodec或者com.hadoop.compression.lzo.LzopCodec;

        org.apache.hadoop.io.compress.LzoCodec或者com.hadoop.compression.lzo.LzoCodec;





注意:(引自http://ju.outofmemory.cn/entry/63512)

    (1)org.apache.hadoop.io.compress.LzoCodec和com.hadoop.compression.lzo.LzoCodec功能一样,都是源码包中带的,返回都是lzo_deflate文件

    (2)有两种压缩编码可用,即LzoCodec和LzopCodec,区别是:

        1)LzoCodec比LzopCodec更快, LzopCodec为了兼容LZOP程序添加了如 bytes signature, header等信息

        2)LzoCodec作为Reduce输出,结果文件扩展名为”.lzo_deflate”,无法被lzop读取;

        而使用LzopCodec作为Reduce输出,生成扩展名为”.lzo”的文件,可被lzop读取

        3)LzoCodec结果(.lzo_deflate文件)不能由lzo index job的"DistributedLzoIndexer"创建index;且“.lzo_deflate”文件不能作为MapReduce输入(不识别,除非自编inputformat)。而所有这些“.LZO”文件都支持

    综上所述,应该map输出的中间结果使用LzoCodec,reduce输出用 LzopCodec

    

===============================================================================

hive压缩的编解码器(压缩格式)

执行set io.compression.codecs 可以查看目前hive已加载的所以编解码器(逗号分隔)

也就是说,参数io.compression.codecs是hadoop的MR读写支持的所有格式支持,如果设置,就必须设置所有支持格式。默认支持,没有必要的话,最好别加。设置多个语法为:

setio.compression.codecs=org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec;

当然,

set mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;

set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzopCodec

两者一样,是LzopCodec的两个不同开源包。用哪个都行。

hive压缩设置

1)中间结果压缩

中间结果是map产生的。格式设置语句

set hive.exec.compress.intermediate=true;

set hive.intermediate.compression.codec=org.apache.Hadoop.io.compress.LzoCodec;

map结果压缩最好使用snappy的,因为压缩的前提是map输出非常大,影响io,如果中间结果数据集比较小反而会拖慢速度

另外,中间结果的压缩格式设置还可以直接设置map输出结果压缩实现,如

set mapred.map.output.compression.codec=org.apache.Hadoop.io.compress.SnappyCodec

来代替set hive.intermediate.compression.codec这个语句实现

2)最终输出结果压缩

配置参数为hive.exec.compress.output

    选择编解码器(压缩格式)参数mapred.output.compression.code(

命令格式

set hive.exec.compress.output=true;

set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;

(也可以用org.apache.hadoop.io.compress.SnappyCodec)

或者

set mapred.output.compress=true

setmapred.output.compression.codec=org.apache.hadoop.io.compress.LzopCodec

两种方式功能一样,之所以两个方式,是因为作用不同的参数文件

hive.exec.compress.output和mapred.output.compression.codec是hive-site.xml中的配置参数

而mapred.output.compress 和mapred.output.compression.codec 是hdfs-site.xml的配置参数

都可以配置实现。可以查看各个文件中的配置参数,如

hive-site.xml中有

<!--

<property>

<name>hive.exec.compress.output</name>

<value>true</value>

</property>



<property>

<name>mapred.output.compression.codec</name>

<value>org.apache.hadoop.io.compress.GzipCodec</value>

</property>

-->

mapred-site.xml中有

<property>

       <name>mapred.compress.map.output</name>

       <value>true</value>

    </property>

    <property>

       <name>mapred.map.output.compression.codec</name>

       <value>com.hadoop.compression.lzo.LzoCodec</value>

    </property>

core-site.xml中有

<property>

      <name>io.compression.codecs</name>

<value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec</value>

      </property>

      <property>

        <name>io.compression.codec.lzo.class</name>

        <value>com.hadoop.compression.lzo.LzopCodec</value>

      </property>

hadoop-site.xml中有

<property>

     <name>io.compression.codecs</name>

     <value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.LzoCodec</value>

      <description>A listof the compression codec classes that can be used

                  for compression/decompression.</description>

    </property>

    <property>

     <name>mapred.output.compress</name>

     <value>true</value>

      <description>Shouldthe job outputs be compressed?

      </description>

    </property>

    <property>

     <name>mapred.output.compression.codec</name>

     <value>org.apache.hadoop.io.compress.LzoCodec</value>

      <description>If thejob outputs are compressed, how should they be compressed?

      </description>

    </property>

设置的另外方式:

hive –hiveconfhive.exec.compress.output=true –hiveconfmapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec

重要的辅助工作,添加索引

添加index是为让.lzo文件子在hdfs上按照block大小来切分块(速度加快,但多消耗cpu时间。map数大量增加)

如果不建立lzo索引则不会按照block来切分块

    为每个lzo块添加index的命令:

        hadoop jar $HADOOP_HOME/lib/hadoop-lzo-0.4.15.jarcom.hadoop.compression.lzo.DistributedLzoIndexer  path/xxx.lzo   

    注意(只设置mapred.output.compress=true默认的reduce输出格式为.lzo_deflate)

Hadoop上三种压缩格式的存储方案对比(LZO,gz,orc,)

Lzo的使用

drop table tmp_tb_test_lzo;

CREATE EXTERNAL TABLE tmp_tb_test_lzo( allstring)

stored as

INPUTFORMAT'com.hadoop.mapred.DeprecatedLzoTextInputFormat'

OUTPUTFORMAT'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'

location '/user/pmp_bi/test/testlog/'

---------------------------------------------

select

split(split(all,'\\|~\\|')[5],'/')[1]as media,

split(all,'\\|~\\|')[21] as device,

split(all,'\\|~\\|')[22] as network,

split(all,'\\|~\\|')[25] as id_code,

split(all,'\\|~\\|')[26] ascode_method,

split(all,'\\|~\\|')[30] as os,

split(all,'\\|~\\|')[34] as channel,

split(all,'\\|~\\|')[42] as adtype,

split(all,'\\|~\\|')[43] as rtbtype,

count(1) as cnt

from tmp_tb_test_lzo

group bysplit(split(all,'\\|~\\|')[5],'/')[1],split(all,'\\|~\\|')[21],split(all,'\\|~\\|')[22],split(all,'\\|~\\|')[25],split(all,'\\|~\\|')[26],split(all,'\\|~\\|')[30],split(all,'\\|~\\|')[34],split(all,'\\|~\\|')[42],split(all,'\\|~\\|')[43]

lzo加索引

hadoop jar/usr/local/hadoop-0.20.2/lib/hadoop-lzo-0.4.15.jarcom.hadoop.compression.lzo.LzoIndexer/user/pmp_bi/test/testlog/access_bid_20160414_22.log.lzo

ORC的使用

相关参数设定 ORC File Format:

https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties#ConfigurationProperties-ORCFileFormat

drop table test_tb_log_orc;

create table test_tb_log_orc ( all string )

stored as ORC;

默认为tblproperties("orc.compress"="ZLIB");

show create table test_tb_log_orc;

CREATE TABLE `test_tb_log_orc`(

`all` string)

ROW FORMAT SERDE

'org.apache.hadoop.hive.ql.io.orc.OrcSerde'

STORED AS INPUTFORMAT

'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'

OUTPUTFORMAT

'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'

LOCATION

'hdfs://namenode/hivedata/warehouse/pmp.db/test_tb_log_orc'

TBLPROPERTIES (

'orc.compress'='ZLIB',

'transient_lastDdlTime'='1465283611')

-------------------------

desc formatted test_tb_log_orc;

# col_name              data_type               comment

all                     string

# Detailed Table Information

Database:               pmp

Owner:                  pmp_bi

CreateTime:             Tue Jun 07 13:48:19 CST 2016

LastAccessTime:         UNKNOWN

Protect Mode:           None

Retention:              0

Location:              hdfs://namenode/hivedata/warehouse/pmp.db/test_tb_log_orc

Table Type:             MANAGED_TABLE

Table Parameters:

transient_lastDdlTime   1465278499

# Storage Information

SerDe Library:         org.apache.hadoop.hive.ql.io.orc.OrcSerde

InputFormat:            org.apache.hadoop.hive.ql.io.orc.OrcInputFormat

OutputFormat:          org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat

Compressed:             No

Num Buckets:            -1

Bucket Columns:         []

Sort Columns:           []

Storage Desc Params:

serialization.format    1

-------------------------

====================================================================

gz压缩文件hadoop处理

1) external tablefor gz

drop tabletmp_tb_test_gz;

CREATE EXTERNALTABLE tmp_tb_test_gz( all string )

location'/user/pmp_bi/test/testlog2/'

insert overwritetable test_tb_log_orc

select *

from tmp_tb_test_gz

time taken: 34分钟

hadoop fs -ls/user/pmp_bi/test/testlog2

gz:4450965423

hadoop fs -ls/hivedata/warehouse/pmp.db/test_tb_log_orc

orc:4801158504

-------------------------------------------------------

2) load gz fromlocal(耗时同put到云上建外部表)

hive直接load

drop tabletmp_tb_test_gz;

CREATE TABLEtmp_tb_test_gz( all string );

LOAD DATALOCAL INPATH '/home/pmp_bi/test/report_test/testlog2/rtb1_bid_20160606_15.log.gz'OVERWRITE INTO TABLE tmp_tb_test_gz;

timetaken:401 秒

insertoverwrite table test_tb_log_orc

select *

fromtmp_tb_test_gz

本地load是简单的将gz文件put到内部表路径下/hivedata/warehouse/pmp.db/tmp_tb_test_gz/rtb1_bid_20160606_15.log.gz

同hadoop直接put耗时一样

==================================================

gz本地解压后put

1)hadoop fs -get/user/pmp_bi/test/testlog2/rtb1_bid_20160606_15.log.gz ./

time taken:1分钟    15:53:39 to 15:54:45

size:4G

2)解压

date

gzip -drtb1_bid_20160606_15.log.gz

date

time taken: 5分钟(15:45:40to 15:50:51)

size:27117660098

3)

hadoop fs -mkdir/user/pmp_bi/test/testlog3

hadoop fs -ls/user/pmp_bi/test/testlog3

4)

date

hadoop fs -put./rtb1_bid_20160606_15.log /user/pmp_bi/test/testlog3/

date

time taken: 34分钟(16:34:11to  17:08:23)

5)

drop tabletmp_tb_test_log_unzip;

CREATE EXTERNALTABLE tmp_tb_test_log_unzip( all string )

location'/user/pmp_bi/test/testlog3/'

insert overwritetable test_tb_log_orc

select *

fromtmp_tb_test_log_unzip

Time taken:69.458 seconds

------------------------------------------------------------------

hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)的更多相关文章

  1. form表单中控件较多&comma;加载完成后切换页面都很慢的解决方法

    form表单中控件较多,加载完成后点击都很慢,为什么?我一页面中form表单里面上百个控件(如input.select.radio.checkbox等),还有一些js脚本,加载速度还可以,都能全部显示 ...

  2. PHP&plus;Mysql&plus;easyui点击左侧tree菜单对应表名右侧动态生成datagrid加载表单数据(二)

    关于tree菜单生成,参考我的另一篇博文地址tree 菜单 实现功能:点击左侧tree菜单中的table,右侧通过datagrid加载出该表对用的所有数据 难点:获取该表的所有列名,动态生成datag ...

  3. 最强最全面的Hive SQL开发指南,超四万字全面解析

    本文整体分为两部分,第一部分是简写,如果能看懂会用,就直接从此部分查,方便快捷,如果不是很理解此SQL的用法,则查看第二部分,是详细说明,当然第二部分语句也会更全一些! 第一部分: hive模糊搜索表 ...

  4. hive内部表、外部表

    hive内部表.外部表区别自不用说,可实际用的时候还是要小心. Hive的数据分为表数据和元数据,表数据是Hive中表格(table)具有的数据:而元数据是用来存储表的名字,表的列和分区及其属性,表的 ...

  5. Hive sql 语法解读

    一. 创建表 在官方的wiki里,example是这种: Sql代码   CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name d ...

  6. hive 四种表,分区表,内部,外部表,桶表

    Hive四大表类型内部表.外部表.分区表和桶表 一.概述 总体上Hive有四种表:外部表,内部表(管理表),分区表,桶表.分别对应不同的需求.下面主要讲解各种表的适用情形.创建和加载数据方法. 二.具 ...

  7. hive内部表、外部表、分区表、视图

    1.Table 内部表 1).与数据库中的Table在概念上是类似的 2).每一个Table在Hive中都有一个相应的目录存储数据 3).所有的Table数据(不包括 External Table) ...

  8. 4&period;hive的外部表和内部表

    1.外部表和内部表区别 创建表时:创建内部表时,会将数据移动到数据仓库指向的路径:若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变. 删除表时:在删除表的时候,内部表的元数据和数据会被一 ...

  9. Hive 外部表 分区表

      之前主要研究oracle与mysql,认为hive事实上就是一种数据仓库的框架,也没有太多另类,所以主要精力都在研究hadoop.hbase,sqoop,mahout,近期略微用心看了下hive. ...

随机推荐

  1. hibernate处理null 时提示:Property path &lbrack;&period;&period;&period;&rsqb; does notreference a collection

    Hibernate判断某属性不为null 且不可为空时出现Property path [...] does notreference a collection 的问题 处理空的方法: isNotEmp ...

  2. C&num; Closure

    JavaScript Closure function f1(){ var n=999; return function(){ alert(n); // 999 return n; } } var a ...

  3. (转)常用CSS优化总结——网络性能与语法性能建议

    原文地址:http://www.cnblogs.com/dolphinX/p/3508657.html 在前端面试中最常见的问题就是页面优化和缓存(貌似也是页面优化),被问了几次后心虚的不行,平然平时 ...

  4. android ToolBar与DrawerLayout笔记

    通过Android Studio 生成的Nagvition DrawerLayout Activity 自带的布局中的NagvitionView会覆盖ToolBar直接通到statusBar. 但是自 ...

  5. JSP最常用的五种内置对象&lpar;out&comma;request&comma;response&comma;session&comma;application&rpar;

    为了简化开发过程,JSP提供了一些内置对象,它们由容器实现和管理.开发者在JSP页面中无需声明,无需实例化就可使用.主要有out,request,response,session,applicatio ...

  6. Java程序员的情书

    java程序员的情书 我能抽象出整个世界但是我不能抽象出你因为你在我心中是那么的具体所以我的世界并不完整我可以重载甚至覆盖这个世界里的任何一种方法但是我却不能重载对你的思念也许命中注定了 你在我的世界 ...

  7. SQLServer之删除函数

    删除函数注意事项 从当前数据库中删除一个或多个用户定义函数.DROP 函数支持本机编译的标量用户定义函数. 如果数据库中存在引用 DROP FUNCTION 的 Transact-SQL 函数或视图并 ...

  8. WSDL文件

    WSDL: <!--一次webservice调用,其实并不是方法调用,而是发送SOAP消息 ,即xml片段--> <!--以上一篇中的wsdl文档为例,这里我将注释写到文档中 --& ...

  9. oracle工具sqluldr2和sqlldr的使用

    在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法:1. 逐条insert -- 只适用少量数据更新 ALTER TABLE order_items DISAB ...

  10. centos7安装nginx 报&period;&sol;configure&colon; error&colon; C compiler cc is not found

    CentOS 7 下 安装 nginx 执行配置命令 ./configure 时提示以下错误: 解决: 执行以下命令: yum -y install gcc gcc-c++ autoconf auto ...