美文网首页
hsql优化

hsql优化

作者: cclucc | 来源:发表于2019-11-15 19:44 被阅读0次
    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端的汇总合并优化过,使数据倾斜不成问题
      

    相关文章

      网友评论

          本文标题:hsql优化

          本文链接:https://www.haomeiwen.com/subject/vzskuctx.html