Hive Tunning(二)优化存储

简介: 《Hive Tunning》读后小记第二篇——Hive Tunning(二)优化存储。
接着上一章我们讲的hive的连接策略,现在我们讲一下hive的数据存储。
下面是hive支持的数据存储格式,有我们常见的文本,JSON,XML,这里我们主要讲一下ORCFile。
Built-in Formats: 
– ORCFile 
– RCFile 
– Avro 
– Delimited Text 
– Regular Expression 
– S3 Logfile 
– Typed Bytes 
• 3 
rd 
-Party Addons: 
– JSON 
– XML
674aaafaf9285cfcc97f55c543f26e7243bc0c51
这种格式非常适合HDFS,它有以下的 优点
•高压缩 
– 高压缩比. 
– 字典编码. 
•高性能 
– 自带索引. 
– 高效的精确查询. 
• 灵活的数据模型 
– 支持所有的hive类型,包括maps.
389f1dd2e500ef0d50cd43082d541143f86702b9
从图中可以看出,orc格式的文件存储大小仅为文本的30%左右,比gz格式的都小,采用zlib压缩的话,更小,仅有22%左右。
使用orc格式存储的方式很简单,在建表的时候STORED AS orc即可
CREATE  TABLE  sale(     
      id    int,   timestamp  timestamp,    
      productsk   int,  storesk  int,     
      amount   decimal,  state  string    
)STORED   AS   orc;   
相关参数,自己看,不解释了。
4c720b7c9a03b3bd81241ce52f15a1bac44fd212
不适用zlib压缩的话,查询速度更快,但是也大一些。
CREATE    TABLE    sale(    
                id    int,    timestamp    timestamp,    
productsk    int,    storesk    int,    
                amount    decimal,    state    string    
)STORED    AS    orc    tblproperties    ("orc.compress"="NONE");   

下面是加快hive查询的一些可以参考的方式:

f7689d4ce179503cdb5a7d6d56a508b2fbc8111d
(1)跳跃读取:采用分区Partition或者使用Skew,才用ORCFile二次排序。
(2)在连接字段上排序并且bucket,在连接小表的时候采用Broadcast joins。
(3)对经常使用的数据,增加备份因子,激活Short-Circuit Read,采用Tez。
d2bf1424a092ee5396f557f63877a146705c8251
当某个表很大的时候,我们往往要对其进行分区,比如按照时间来分区。
CREATE    TABLE    sale(    
                id    int,    amount    decimal,    ...    
)partitioned    by    (xdate    string,    state    string);   
其中的xdate和state是不存在的列,你可以认为它们是虚拟列,虚拟列会在HDFS当中建立子目录,属于分区的记录会存在那个子文件夹中。 
使用分区之后,在查询和插入的时候,就必须带有至少一个分区字段,否则查询将会失败。
INSERT    INTO    sale    (xdate=‘2013-03-01’,    state=‘CA’)    
SELECT    *    FROM    staging_table 
WHERE    xdate    =    ‘2013-03-01’    AND    state    =    ‘CA’;
如果你想一次查出所有数据,不想受这个限制的话,你可以 hive.exec.dynamic.partition.mode参数置为nonstrict。 
set    hive.exec.dynamic.partition.mode=nonstrict;
INSERT    INTO    sale    (xdate,    state)    
SELECT    *    FROM    staging_table;
有时候插入数据的时候,我们需要重新排序,在select 语句里面把虚拟列也加上,这样会有排序的效果。
INSERT    INTO    sale    (xdate,    state=‘CA’)    
SELECT    
            id,    amount,    other_stuff,    
xdate,    state    
FROM    staging_table 
WHERE    state    =    ‘CA’;

下面我们讲一下常用的hive查询调优 

74555004e55b80b3df9215fb5383e5460d44acdc
mapred.max.split.size和mapred.min.split.size
min    太大->   太少mapper.    
max    太小->   mapper太多.   
Example:    
– set    mapred.max.split.size=100000000;    
– set    mapred.min.split.size=1000000; 
当然也有个原则,当mappers出现抢占资源的时候,才调整这些参数。
a2ace13f4718e1cbd6c9f6be30c0626510911c5f
– set    io.sort.mb=100;    
• All    the    time:    
– set    hive.optmize.mapjoin.mapreduce=true;    
– set    hive.optmize.bucketmapjoin=true;    
– set    hive.optmize.bucketmapjoin.sortedmerge=true;    
– set    hive.auto.convert.join=true;    
– set    hive.auto.convert.sortmerge.join=true;    
– set    hive.auto.convert.sortmerge.join.nocondi1onaltask=true;    
• When    bucketing    data:    
– set    hive.enforce.bucketing=true;    
– set    hive.enforce.sortng=true;    
• These and more are set by default in HDP 1.3(明显的广告词,说明HDP比较强大,已经给我们设置好了).    
这些参数我们可以在hive-site.xml中查询到,我们也可以在shell中查询。
(1)查询所有的参数
38af0dd07f21a3fc44e43a3fc29209f39c3a00df
(2)查询某一个参数
21bd01b8b0d9608ccb9e7b6e2b248f39b396a3b5
(3)修改参数
9fd7900ccf77bd940bd659b74b3be28e7bfe2bf8
目录
相关文章
|
28天前
|
存储 SQL Java
bigdata-18-Hive数据结构与存储格式
bigdata-18-Hive数据结构与存储格式
22 0
|
7月前
|
SQL 分布式计算 监控
Hive性能优化之计算Job执行优化 2
Hive性能优化之计算Job执行优化
103 1
|
7月前
|
SQL 存储 分布式计算
Hive性能优化之表设计优化1
Hive性能优化之表设计优化1
37 1
|
8天前
|
SQL 存储 分布式计算
【Hive】Hive优化有哪些?
【4月更文挑战第16天】【Hive】Hive优化有哪些?
|
4月前
|
SQL 分布式计算 Hadoop
Hive SQL 优化
Hive SQL 优化
50 1
|
7月前
|
SQL 分布式计算 资源调度
Hive性能优化之计算Job执行优化 1
Hive性能优化之计算Job执行优化
98 0
Hive性能优化之计算Job执行优化 1
|
7月前
|
SQL 存储 分布式计算
Hive性能优化之表设计优化2
Hive性能优化之表设计优化2
52 1
|
9月前
|
SQL 分布式数据库 HIVE
Hive 优化
Hive 优化
63 0
|
SQL 存储 负载均衡
工作常用之Hive 调优【四】HQL 语法优化
列裁剪就是在查询时只读取需要的列,分区裁剪就是只读取需要的分区。当列很多或者数据量很大时,如果 select * 或者不指定分区,全列扫描和全表扫描效率都很低。
173 0
工作常用之Hive 调优【四】HQL 语法优化
|
存储 SQL 分布式计算
工作常用之Hive 调优【三】 Explain 查看执行计划及建表优化
在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多,所以我们需要把常常用在 WHERE 语句中的字段指定为表的分区字段。
287 0
工作常用之Hive 调优【三】 Explain 查看执行计划及建表优化