博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hive Tunning(二)优化存储
阅读量:6692 次
发布时间:2019-06-25

本文共 2462 字,大约阅读时间需要 8 分钟。

接着上一章我们讲的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

这种格式非常适合HDFS,它有以下的优点:

•高压缩

– 高压缩比.
– 字典编码.
•高性能
– 自带索引.
– 高效的精确查询.
• 灵活的数据模型
– 支持所有的hive类型,包括maps.

 

从图中可以看出,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;   

相关参数,自己看,不解释了。

不适用zlib压缩的话,查询速度更快,但是也大一些。

CREATE    TABLE    sale    (   

                id    int,    timestamp    timestamp,   
productsk    int,    storesk    int,   
                amount    decimal,    state    string   
)    STORED    AS    orc    tblproperties    ("orc.compress"="NONE");   

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

(1)跳跃读取:采用分区Partition或者使用Skew,才用ORCFile二次排序。

(2)在连接字段上排序并且bucket,在连接小表的时候采用Broadcast joins。

(3)对经常使用的数据,增加备份因子,激活Short-Circuit Read,采用Tez。

当某个表很大的时候,我们往往要对其进行分区,比如按照时间来分区。

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查询调优

 

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出现抢占资源的时候,才调整这些参数。

 

– 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)查询所有的参数

(2)查询某一个参数

(3)修改参数

 

转载于:https://www.cnblogs.com/cenyuhai/p/3228654.html

你可能感兴趣的文章
Android平台播放语音时支持听筒、喇叭之间切换
查看>>
RPC的实现
查看>>
不一样的Office 365之 —— 使用StaffHub管理你的排班
查看>>
从Mysql EXPLAIN探寻数据库查询优化2
查看>>
让元素居中
查看>>
php memcache保存session的一个设置误区
查看>>
鱼眼镜头
查看>>
Scalatra
查看>>
CentOS 7 三者分离编译安装LAMP
查看>>
Linux内核调整,支持4000-8000并发
查看>>
jquery mobile 设置设备适配
查看>>
redis使用总结-redis命令总结
查看>>
创业浪潮:春天蓬勃而来
查看>>
阿里云Linux安装软件镜像源
查看>>
阿里云对象存储OSS支持版本管理特性
查看>>
用python 访问redis的几种常用方式
查看>>
我的友情链接
查看>>
Linux Shell 基本概念及编程(5)
查看>>
RDBMS DBMS MS DB
查看>>
我的友情链接
查看>>