美文网首页
HIVE调优

HIVE调优

作者: 八爪鱼下水 | 来源:发表于2021-02-22 14:52 被阅读0次

    一 .hive的压缩方案介绍

    在hive中一般推荐使用压缩方式:
    1.1 ) SNAPPY 速度最快(最常用的压缩方式)
    hadoop 本身不支持. 最新版本支持了.
    1.2 ) LZO 压缩文件大小中等,压缩解压速度最慢
    1.3 ) GZIP 速度中等, 文件最小
    其中snappy压缩方式在整个占比比较高,压缩的最快,更高的速度.
    一般用的比较多.

    1) 查看是否支持压缩:hadoop checknative: 
    2) 查看默认压缩方案:io.compression.codecs
    org.apache.hadoop.io.compress.DefaultCodec #默认值表示不压缩
    org.apache.hadoop.io.compress.SnappyCodec #设置SNAPPY压缩方案
    org.apache.hadoop.io.compress.GzipCodec #设置GZIP压缩方案
    com.hadoop.compression.lzo.LzopCodec #设置LZO压缩方案
    
    
    3)设置map端压缩方案
    mapreduce.map.output.compress 是否开启map端压缩 
    默认为 false  开启true
    mapreduce.map.output.compress.codec   
    默认: org.apache.hadoop.io.compress.DefaultCodec
    可选值: 
    org.apache.hadoop.io.compress.SnappyCodec
    org.apache.hadoop.io.compress.GzipCodec
    com.hadoop.compression.lzo.LzopCodec
    
    
    
    4)设置reduce端压缩方案
    mapreduce.output.fileoutputformat.compress  
    是否开启reduce端压缩 默认为 false  
    如果开启设置为true
    mapreduce.output.fileoutputformat.compress.codec 
    默认: org.apache.hadoop.io.compress.DefaultCodec
    可选值: 
    org.apache.hadoop.io.compress.SnappyCodec
    org.apache.hadoop.io.compress.GzipCodec
    com.hadoop.compression.lzo.LzopCodec
    
    
    5)设置压缩类型
    mapreduce.output.fileoutputformat.compress.type 
    设置压缩类型 默认 RECORD(行压缩)
        可选值: 
           NONE 不采用任何格式
           BLOCK 块压缩  (推荐使用)
    
    

    3) 具体在hive设置reduce端压缩方案:

    set hive.exec.compress.intermediate=true;  
    是否开启hive中间结果压缩操作 默认为false
    
    set mapreduce.map.output.compress=true; 
    是否开始map端的压缩操作 默认为false 
    
    set mapreduce.map.output.compress.codec= 
    org.apache.hadoop.io.compress.SnappyCodec; 
    设置map端压缩方案
    

    4) 具体在hive设置reduce端压缩方案:

    set hive.exec.compress.output=true;  
    是否开启hive最终结果压缩方案  默认为false
    
    set mapreduce.output.fileoutputformat.compress=true;
     是否开启MR的之中压缩方式 默认为false
    
    set mapreduce.output.fileoutputformat.compress.codec =
    org.apache.hadoop.io.compress.SnappyCodec;  
    设置reduce端压缩方案
    
    set mapreduce.output.fileoutputformat.compress.type=BLOCK; 
    设置压缩的格式为块压缩 默认为RECORD
    

    二 . hive的数据存储格式优化(创建SNAPPY的ORC压缩方案)

    在hive中主要支持有四种存储格式:
    5.1) textFile 行式存储方案
    5.2) sequenceFile 行式存储方案
    5.3) ORC 列式存储方案(一个片段256M行水平拆开增加索引,内部列存储,然后里面还有索引) 内部有压缩方案可以设置
    5.4) parquet 列式存储方案

    捕获.PNG

    在hive中, 一般构建表, 都是ORC类型

    设置SNAPPY的ORC压缩方案
    create table log_orc_snappy(
    track_time string,
    url string,
    session_id string,
    referer string,
    ip string,
    end_user_id string,
    city_id string
    )
    partitioned by (分区子段 ....)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    #设置orc 存储 压缩方案 设置 SNAPPY
    STORED AS orc tblproperties ("orc.compress"="SNAPPY");
    

    三 . 其他设置优化

    1) hive 的fetch本地抓取策略
    set hive.fetch.task.conversion :
    可选值: 
    none : 
    所有的查询都会执行MR
    minimal :
    可以保证在执行全表查询,
    根据字段查询以及limit可以不走MR的(老版本默认值: 0.x版本)
    more :  
    可以保证在执行全表查询,
    根据字段查询,简单过滤操作,以及limit可以不走MR的(1.x后默认值)
    

    不走MR就本地抓取HDFS的数据了.

    2) hive的本地运行
    set hive.exec.mode.local.auto=true;  是否开启本地MR  默认值为 false
    
    set hive.exec.mode.local.auto.inputbytes.max=51234560; 
    设置多大的数据量走集群MR  默认值 128M
    
    set hive.exec.mode.local.auto.input.files.max=10;  
    设置文件数量的限制   默认值4
    
    什么情况下会执行本地MR呢? 
    默认当查询数据量小于等于128M 并且读取的文件数量小于
     4的时候, 才会执行本地MR , 
    否则只要有一个条件不满足, 就会执行集群MR的操作
    
    3) hive的join优化
    一般 用 小表在前 join 大表在后:
    set hive.auto.convert.join = true;  
     是否开启自动检测mapJoin
    set hive.mapjoin.smalltable.filesize= 25000000;  
    大小表阈值  默认大于 25M左右
    
    4) hive的sql优化(避免数据倾斜)
    一. 列裁剪
    
    hive.optimize.cp=true; 默认值就是true
    
    二. 分区裁剪
    
    hive.optimize.pruner=true; 默认就是true
    
    三. group,by产生数据倾斜问题的
    
    解决办法:
    1) 采用 combiner的操作: 让每个map都进行局部聚合操作(要写java代码)
    开启MR的conbiner操作: 
    set hive.map.aggr = true;
    set hive.groupby.mapaggr.checkinterval = 100000;
    
    2) 开启两个MR来分别处理
    负载均衡的措施 (大combiner的操作)
    set hive.groupby.skewindata = true;
    
    四. count(distinct ):聚合去重操作
    
    1)解决方法把distinct内部分组去重
    原: select count(distinct ip) from 表 ; --- 引发上面描述的问题
    后: select count(ip)  from (select ip from 表 group by ip) tmp ;
    
    五.一个分区表导入另外个分区表的操作
    
    1) insert into table 分区表2 partition(month) select * from 分区表1
    注意: 必须分区字段放在整个表最后.
    注意: 开启动态分区支持.
    注意: 关闭严格语法模式.
    
    2) 设置hive语法模式为 非严格模式:
        set hive.exec.dynamic.partition.mode=nonstrict; 默认值为  strict 
    --------------------------------------------------------------------
    1) 开启动态分区的支持:
        set hive.exec.dynamic.partition=true;  默认为true
    3) 设置所有执行MR的节点, 最大可以创建多少个分区:
        set  hive.exec.max.dynamic.partitions=1000; 默认 1000个
    3) 设置每个MR的节点. 最大可以创建多少个分区
        set hive.exec.max.dynamic.partitions.pernode=100; 默认为100个
    4) 整个mr任务中, 最大一次性可以操作多少个HDFS的文件:
        set hive.exec.max.created.files=100000;  默认为 10w
    -------------------------------------------------------------------
    
    六 数据倾斜
    
    1) map数量的调整:调小
    set mapred.max.split.size=112345600;
    set mapred.min.split.size.per.node=112345600;
    set mapred.min.split.size.per.rack=112345600;
    set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
    以上四个参数配置, 描述 在map读取之前, 进行文件合并操作
    #将文件合并,大于128按照分割合并
    增加: 切割文件即可
    
    2) reduce数量调整:
    hive默认会自动调整reduce的数量:  
    默认-1动态化自动决定.
    公式是:N=min(参数2,总输入数据量/参数1)
        参数2: 为 hive.exec.reducers.max设置的值 
        默认每个任务最大的reduce数量为 999
        参数1: hive.exec.reducers.bytes.per.reducer 
        默认处理数量为 1GB
    
    set hive.exec.reducers.bytes.per.reducer=524288000; 
    调整每个reduce能够处理数据量
    #当调小后, reduce数量增加 , 调大后, reduce数量就会减少
    set mapred.reduce.tasks=15; 强制调整reduce的数量
    
    七  并行执行
    
    set hive.exec.parallel=true;            
    --打开任务并行执行
    set hive.exec.parallel.thread.number=16;  
    --同一个sql允许最大并行度,默认为8。
    
    举个例子:
       select * from A 
       union all   #把两条语句执行结果汇总到一起上下汇总.
       select * from B;
    
    八 严格模式
    
    1) 对分区表进行查询的时候 不携带分区字段
    2) 使用order by 没有使用 limit
    3) SQL中出现笛卡尔积的现象
    
    前提: 数据量足够大
    set hive.mapred.mode = strict;  --开启严格模式
    set hive.mapred.mode = nostrict; --开启非严格模式
    
    九 MR - JVM  jvm重用
    
    2.0无需设置了
    
    十  推测执行
    
    卡主了在启动一个MR,一致不断启动MR
    不建议设置
    set mapred.map.tasks.speculative.execution=true
    set mapred.reduce.tasks.speculative.execution=true
    set hive.mapred.reduce.tasks.speculative.execution=true;
    

    相关文章

      网友评论

          本文标题:HIVE调优

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