hsql优化

2019-11-15  本文已影响0人  cclucc
HSQL

转载:https://www.fangxuan.win/2018/08/09/hive-%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98/

  1. 按照时间分区的hive表,查询时要加上时间限制,默认从所有数据进行遍历

  2. 事实上“把小表放在前面做关联可以提高效率”这种说法是错误的。正确的说法应该是“把重复关联键少的表放在join前面做关联可以提高join的效率。” https://blog.csdn.net/qq_26442553/article/details/80865014

  3. 使用同一个连接键,当对三个或者更多个表进行join的话,只会产生一个mapreduce任务,如果join的条件各不相同,那么mapreduce任务的数目应该和join的个数相同。

  4. 尽早的过滤数据

  5. 用insert into代替union all。如果union all的部分个数大于2,或者每个union部分数据量大,应该拆成多个insert into 语句,实际测试过程中,执行时间能提升50%

  6. limit,Limit语句还是需要执行整个查询语句,然后再返回部分结果。开启以下属性,可直接对数据进行采样:

    hive.limit.optimize.enable=true//开启对数据源进行采样的功能
    hive.limit.row.max.size //设置最小的采样容量
    hive.limit.optimize.limit.file //设置最大的采样样本数
    
  7. hive是串行执行的,如果数据互不依赖,可以通过以下配置设置并行:

    set hive.exec.parallel=true //可以开启并发执行。
    set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。
    
  8. map优化,map的数量是由input的文件总个数,input的文件大小,集群设置的文件块大小共同决定的
    1)减少map数量

    //场景,input的文件很小,很多
    //属性设置
    set mapreduce.input.fileinputformat.split.minsize.per.node=104857600; //创建节点本地分区的最小数据字节数,否则数据将合并到机架级别。默认值:0
    
    set mapreduce.input.fileinputformat.split.minsize.per.rack=104857600; //创建机架本地分区的最小数据字节数,否则数据将合并到全局级别。默认值:0
    
    set mapreduce.input.fileinputformat.split.maxsize=268435456;
    //单位为B,设置最大分片大小默认为dfs.blocksize
    
    //前面三个参数确定合并文件块的大小,大于文件块大小大于256m的,按照256m来分隔,小于256m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的)进行合并。
    

2)增加map数量

```
//场景,input的文件很大,任务很慢
//属性设置
set mapreduce.input.fileinputformat.split.maxsize=更大值;
//由于mapreduce中没有办法直接控制map数量,所以只能曲线救国,通过设置每个map中处理的数据量进行设置。(默认为 dfs.blocksize)
```
  1. reduce优化,

    //Hive将自动确定reduce的数量,reduce个数 = InputFileSize / bytes per reducer,所以通过设置,曲线救国
    set hive.exec.reducers.bytes.per.reducer = 256000000;//设置每一个 reducer 的平均负载字节数
    
    在Hive 0.14.0及更早版本中的默认值为1GB,即,如果输入大小为10 GB,则将使用10个reducer。
    在Hive 0.14.0及更高版本中,默认值为256 MB,即,如果输入大小为1 GB,则将使用4个reducer。
    
  2. 解决数据倾斜

    1)、sql脚本原因,尽量在map段执行combine,增加reducer数量,避免COUNT这种”全聚合(full aggregates)“
    2)、无效ID在关联时的数据倾斜问题,解决办法,比如针对id为null的情况,把空值的 key 变成一个字符串加上随机数
    3)、不同数据类型关联产生的倾斜问题,比如两张表进行主键关联,表A的主键id是32位字符串类型,表B的主键id是bigint类型,在关联时会将表A的主键转为数值类型,做 hash 来分配 Reduce。这样表1的数据都到一个 Reduce 上了
    4)、数据倾斜其他解决方案

    set hive.groupby.skewindata=true;这是通用的算法优化,但算法优化有时不能适应特定业务背景,开发人员了解业务,了解数据,可以通过业务逻辑精确有效的解决数据倾斜问题。
    在使用SUM,COUNT,MAX,MIN等UDAF函数时,不怕数据倾斜问题,Hadoop在Map端的汇总合并优化过,使数据倾斜不成问题
    
上一篇 下一篇

猜你喜欢

热点阅读