数据做压缩和解压缩会增加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

自定义格式

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

gzip -drtb1_bid_20160606_15.log.gz

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

size:27117660098

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

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

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

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

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

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

数据做压缩和解压缩总会增加CPU的开销,但可以最大程度的减少文件所需的磁盘空间和网络I/O的开销最好对那些I/O密集型的作业使用数据压缩hive表的存储格式为    TEXTFILE    SEQUENCEFILE(三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩)    RCFILE    自定义格式
一、 存储 存储 的特点: 查询满足条件的一整行 数据 的时候,列 存储 则需要去每个聚集的字段找到对应的每个列的值,行 存储 只需要找到其中一个值,其余的值都在相邻地方,所以此时行 存储 查询的速度更快。 列 存储 的特点: 因为每个字段的 数据 聚集 存储 ,在查询只需要少数几个字段的时候,能大大减少读取的 数据 量;每个字段的 数据 类型一定是相同的,列式 存储 可以针对性的设计更好的设计 压缩 算法。 Hive 中常用的 存储 格式 : 1....
Hive 迁移至 压缩 : 1、 压缩 方式选择(经测试选择snappy) 2、 创建 Hive 内部 (主要是后面Rename的时候可以将location改成对应的位置) CREATE **TABLE** `ods_adv.ods_advt_user_operation_basic_2_tmp`( `android_id` string COMMENT '', `google_id` string...
最近面试,遇到了关于 Hive 数据 存储 格式 的问题,回答不尽人意,抽时间总结多看看关于 Hive 存储 格式 压缩 格式 的内容。TEXTFILE 是 Hive 默认文件 存储 方式, 存储 方式为行 存储 数据 不做 压缩 ,磁盘开销大, 数据 解析开销大, 数据 不支持分片, 数据 导入方式可以通过LOAD和INSERT两种方式 数据 。可结合 Gz ip、Bzip2使用(系统自动检查,执行查询时自动解压) ,但使用 gz ip方式, hive 不会对 数据 进行切分,从而无法对 数据 进行并行操作,但 压缩 后的文件不支持split。在反序列化过程中,必须逐个
配置 CentOS 能连接外网。Linux 虚拟机 ping www.baidu.com 是畅通的 注意:采用 root 角色编译,减少文件夹权限出现问题 jar 包准备( hadoop 源码、JDK8 、maven、protobuf) (1) hadoop -2.7.2-src.tar. gz (2)jdk-8u144-linux-x64.tar. gz (3)snappy-1.1.3.tar. gz (4)apache-maven-3.0.5-bin.tar. gz (5)proto 在配置 Hive 使用 lzo 压缩 功能之前,需要保证 Hadoop 集群中 lzo 依赖库的正确安装,以及 hadoop - lzo 依赖的正确配置,可以参考: Hadoop 配置 lzo 压缩 温馨提示: Hive 自定义组件打包时,不要同时打包依赖,避免各种版本冲突,只将额外的依赖添 到classpath中即可 一、配置H
spark解析xxxxx.tar. gz 形式的 压缩 包。 压缩 包里面是一个个的json文件或者zip的文件,zip里面是json文件。代码如下 def main(args: Array[String]): Unit = { val root: String = args(0) // xxx.tar. gz 的路径 val stname = "test/" // 压缩 包里读取的文件名 val startday =args(2) // 压缩 包里是多天的文件,这就需要获取一天的所需文件的 数据
4、 ORC FILE(0.11以后出现) 其中TEXTFILE为默认 格式 ,建 时不指定默认为这个 格式 ,导入 数据 时会 直接 数据 文件拷贝到hdfs上不进行处理; SEQUENCEFILE,RCFILE, ORC FILE 格式 不能 直接 从本地文件导入 数据 数据 要先导入
近期使用 hive orc 与 parpuet做了初步的 压缩 比分析, 通过 压缩 2.3 数据 ,得到的结论为:   1. 非 压缩 orc /parpuet ,parpuer查询与文件大小,应较好一些.   2. 经过 压缩 算法: parpuet 的 gz ip 压缩 方式的 压缩 比最小, 达到15% - 25%   3. 写入速度最快的应是 orc , 较parpuet快了将近1.5倍. LOAD DATA INPATH '/my/data' OVERWRITE INTO TABLE my_table TBLPROPERTIES ('compression.type'=' GZ IP');