hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)
数据做压缩和解压缩会增加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)的更多相关文章
- form表单中控件较多,加载完成后切换页面都很慢的解决方法
form表单中控件较多,加载完成后点击都很慢,为什么?我一页面中form表单里面上百个控件(如input.select.radio.checkbox等),还有一些js脚本,加载速度还可以,都能全部显示 ...
- PHP+Mysql+easyui点击左侧tree菜单对应表名右侧动态生成datagrid加载表单数据(二)
关于tree菜单生成,参考我的另一篇博文地址tree 菜单 实现功能:点击左侧tree菜单中的table,右侧通过datagrid加载出该表对用的所有数据 难点:获取该表的所有列名,动态生成datag ...
- 最强最全面的Hive SQL开发指南,超四万字全面解析
本文整体分为两部分,第一部分是简写,如果能看懂会用,就直接从此部分查,方便快捷,如果不是很理解此SQL的用法,则查看第二部分,是详细说明,当然第二部分语句也会更全一些! 第一部分: hive模糊搜索表 ...
- hive内部表、外部表
hive内部表.外部表区别自不用说,可实际用的时候还是要小心. Hive的数据分为表数据和元数据,表数据是Hive中表格(table)具有的数据:而元数据是用来存储表的名字,表的列和分区及其属性,表的 ...
- Hive sql 语法解读
一. 创建表 在官方的wiki里,example是这种: Sql代码 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name d ...
- hive 四种表,分区表,内部,外部表,桶表
Hive四大表类型内部表.外部表.分区表和桶表 一.概述 总体上Hive有四种表:外部表,内部表(管理表),分区表,桶表.分别对应不同的需求.下面主要讲解各种表的适用情形.创建和加载数据方法. 二.具 ...
- hive内部表、外部表、分区表、视图
1.Table 内部表 1).与数据库中的Table在概念上是类似的 2).每一个Table在Hive中都有一个相应的目录存储数据 3).所有的Table数据(不包括 External Table) ...
- 4.hive的外部表和内部表
1.外部表和内部表区别 创建表时:创建内部表时,会将数据移动到数据仓库指向的路径:若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变. 删除表时:在删除表的时候,内部表的元数据和数据会被一 ...
- Hive 外部表 分区表
之前主要研究oracle与mysql,认为hive事实上就是一种数据仓库的框架,也没有太多另类,所以主要精力都在研究hadoop.hbase,sqoop,mahout,近期略微用心看了下hive. ...
随机推荐
- selenium 设置代理的话,可以使用这种方式,代码是我刚才测试过的,亲测可用
from selenium import webdriver chrome_options = webdriver.ChromeOptions() chrome_options.add_argumen ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 在脚本中使用MonoBehaviour
继上次分析了热更新的Demo后,这次来介绍如何在热更新代码中使用MonoBehaviour. MonoBehaviour挂载到GameObject对象上的脚本的基类.平常Unity开发时,简单的做法就 ...
- [Luogu 1919]【模板】A*B Problem升级版(FFT快速傅里叶)
Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出 ...
- [HNOI 2004]宠物收养场
Description 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的 ...
- 计蒜客NOIP模拟赛(3) D1T2 信息传递
一个数据包在一个无向网络中传递.在时刻0,该数据包将依照特定的概率随机抵达网络中的某个节点.网络可以看做一张完全带权无向图,包含N个节点,若t时刻数据包在节点i,则在t+1时刻,数据包被传递到节点j的 ...
- bzoj 4567: [Scoi2016]背单词
Description Lweb 面对如山的英语单词,陷入了深深的沉思,"我怎么样才能快点学完,然后去玩三国杀呢?".这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册 ...
- 51Nod 1555 布丁怪
题目描述: 布丁怪这一款游戏是在一个n×n 的矩形网格中进行的,里面有n个网格有布丁怪,其它的一些格子有一些其它的游戏对象.游戏的过程中是要在网格中移动这些怪物.如果两个怪物碰到了一起,那么他们就会变 ...
- 【Remmarguts' Date】
一道来自POJ2449的题,它融合了单源点最短路算法.启发式搜索,让我们对“启发式”有更深的理解和体会.Wow! ·英文题,述大意: 读入n,m(n<=1000,m<=1000 ...
- hdu 4453 splay
Looploop Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- bzoj3129[Sdoi2013]方程 exlucas+容斥原理
3129: [Sdoi2013]方程 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 582 Solved: 338[Submit][Status][ ...