Apache Hive - 通用调优

Apache Hive-通用优化-featch抓取机制 mr本地模式

Fetch抓取机制

  • 功能:在执行sql的时候,能不走MapReduce程序处理就尽量不走MapReduce程序处理.

  • 尽量直接去操作数据文件。

  • 设置: hive.fetch.task.conversion= more。

    --在下述3种情况下 sql不走mr程序
    --全局查找
    select * from student;
    --字段查找
    select num,name from student;
    --limit 查找
    select num,name from student limit 2;
    

mapreduce本地模式

  • MapReduce程序除了可以提交到yarn集群分布式执行之外,还可以使用本地模拟环境运行,当然此时就不是分布式执行的程序,但是针对小文件小数据处理特别有效果。

  • 用户可以通过设置hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个 优化。
    功能:如果非要执行==MapReduce程序,能够本地执行的,尽量不提交yarn上执行==。

  • 默认是关闭的。意味着只要走MapReduce就提交yarn执行。

    mapreduce.framework.name = local 本地模式
    mapreduce.framework.name = yarn 集群模式 
    
  • Hive提供了一个参数,自动切换MapReduce程序为本地模式,如果不满足条件,就执行yarn模式。

    set hive.exec.mode.local.auto = true;
     
    --3个条件必须都满足 自动切换本地模式
    The total input size of the job is lower than: hive.exec.mode.local.auto.inputbytes.max (128MB by default)  --数据量小于128M
    
    The total number of map-tasks is less than: hive.exec.mode.local.auto.tasks.max (4 by default)  --maptask个数少于4个
    
    The total number of reduce tasks required is 1 or 0.  --reducetask个数是0 或者 1
    
  • 切换Hive的执行引擎

    WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
    
    如果针对Hive的调优依然无法满足你的需求 还是效率低, 尝试使用spark计算引擎 或者Tez.
    

Apache Hive-通用优化-join优化

在了解join优化的时候,我们需要了解一个前置知识点:map端join 和reduce端join

- reduce端join

image.png
  • 这种join的弊端在于map阶段没有承担太多的责任,所有的数据在经过shuffle在reduce阶段实现的,而shuffle又是影响性能的核心点.

-map端join

image.png
  • 首先启动本地任务将join中小表数据进行分布式缓存
  • 启动mr程序(只有map阶段)并行处理大数据,并且从自己的缓存中读取小表数据,进行join,结果直接输出到文件中
  • 没有shuffle过程 也没有reduce过程
  • 弊端:缓存太小导致表数据不能太大

reduce 端 join 优化

适合于大表Join大表

  • bucket join-- 适合于大表Join大表

    • 方式1:Bucktet Map Join 分桶表

      语法: clustered by colName(参与join的字段)
      参数: set hive.optimize.bucketmapjoin = true
      要求: 分桶字段 = Join字段 ,分桶的个数相等或者成倍数,必须是在map join中
      
    • 方式2:Sort Merge Bucket Join(SMB)

      基于有序的数据Join
      语法:clustered by colName sorted by (colName)
      参数
          set hive.optimize.bucketmapjoin = true;
          set hive.auto.convert.sortmerge.join=true;
          set hive.optimize.bucketmapjoin.sortedmerge = true;
          set hive.auto.convert.sortmerge.join.noconditionaltask=true;
          
      要求: 分桶字段 = Join字段 = 排序字段,分桶的个数相等或者成倍数
      

map 端 join 优化

  • hive.auto.convert.join.noconditionaltask
hive.auto.convert.join=true

Hive老版本
#如果参与的一个表大小满足条件 转换为map join
hive.mapjoin.smalltable.filesize=25000000  

Hive2.0之后版本
#是否启用基于输入文件的大小,将reduce join转化为Map join的优化机制。假设参与join的表(或分区)有N个,如果打开这个参数,并且有N-1个表(或分区)的大小总和小于hive.auto.convert.join.noconditionaltask.size参数指定的值,那么会直接将join转为Map join。
hive.auto.convert.join.noconditionaltask=true 
hive.auto.convert.join.noconditionaltask.size=512000000 

Apache Hive--通用调优--数据倾斜优化

数据倾斜优化
    什么是数据倾斜
        描述的数据进行分布式处理  分配不平均的现象
    数据倾斜的后果
        某个task数据量过大 执行时间过长  导致整体job任务迟迟不结束
            执行时间长  出bug及风险几率提高
            霸占运算资源 迟迟不释放
    通常如何发现数据倾斜
        在yarn或者其他资源监控软件上  发现某个job作业 卡在某个进度迟迟不动 (注意 倒不是报错)
    造成数据倾斜的原因
        数据本身就倾斜
        自定义分区、分组规则不合理
        业务影响 造成数据短期高频波动
    数据倾斜的通用解决方案
        1、有钱  有预警  
            增加物理资源  单独处理倾斜的数据
        2、没钱  没有预警
            倾斜数据打散  分步执行
                先将倾斜数据打散成多干份 
                处理的结果再最终合并
    hive中数据倾斜的场景
        场景一:group by  、count(distinct)
            hive.map.aggr=true;  map端预聚合
            手动将数据随机分区  select * from table distribute by rand();
            如果有数据倾斜问题  开启负载均衡
                先启动第一个mr程序 把倾斜的数据随机打散分散到各个reduce中
                然后第二个mr程序把上一步结果进行最终汇总
                hive.groupby.skewindata=true;
        场景二:join
            提前过滤,将大数据变成小数据,实现Map Join
            使用Bucket Join
            使用Skew Join
                将Map Join和Reduce Join进行合并,如果某个值出现了数据倾斜,就会将产生数据倾斜的数据单独使用Map Join来实现
                最终将Map Join的结果和Reduce Join的结果进行Union合并
        Hive中通常指的是在reduce阶段数据倾斜

解决方法

  • group by数据倾斜

    • 方案一:开启Map端聚合

      hive.map.aggr=true;
      #是否在Hive Group By 查询中使用map端聚合。
      #这个设置可以将顶层的部分聚合操作放在Map阶段执行,从而减轻清洗阶段数据传输和Reduce阶段的执行时间,提升总体性能。但是指标不治本。
      
    • 方案二:实现随机分区

      实现随机分区
      select * from table distribute by rand();
      
    • 方案三:数据倾斜时==自动负载均衡==只使用group by

      hive.groupby.skewindata=true;
      
      #开启该参数以后,当前程序会自动通过两个MapReduce来运行
      
      #第一个MapReduce自动进行随机分布到Reducer中,每个Reducer做部分聚合操作,输出结果
      
      #第二个MapReduce将上一步聚合的结果再按照业务(group by key)进行处理,保证相同的分布到一起,最终聚合得到结果
      

  • join数据倾斜
    • 方案一:提前过滤,将大数据变成小数据,实现Map Join

    • 方案二:使用Bucket Join

    • 方案三:使用Skew Join

数据单独使用Map Join来实现

#其他没有产生数据倾斜的数据由Reduce Join来实现,这样就避免了Reduce Join中产生数据倾斜的问题

#最终将Map Join的结果和Reduce Join的结果进行Union合并

#开启运行过程中skewjoin
set hive.optimize.skewjoin=true;
#如果这个key的出现的次数超过这个范围
set hive.skewjoin.key=100000;
#在编译时判断是否会产生数据倾斜
set hive.optimize.skewjoin.compiletime=true;
set hive.optimize.union.remove=true;
#如果Hive的底层走的是MapReduce,必须开启这个属性,才能实现不合并
set mapreduce.input.fileinputformat.input.dir.recursive=true;

Apache Hive--通用调优--MR程序task个数调整

maptask个数

  • 如果是在MapReduce中 maptask是通过==逻辑切片==机制决定的。

  • 但是在hive中,影响的因素很多。比如逻辑切片机制,文件是否压缩、压缩之后是否支持切割。

  • 因此在==Hive中,调整MapTask的个数,直接去HDFS调整文件的大小和个数,效率较高==。

   合并的大小最好=block size
如果大文件多,就调整blocl size

reducetask个数

  • 如果在MapReduce中,通过代码可以直接指定 job.setNumReduceTasks(N)

  • 在Hive中,reducetask个数受以下几个条件控制的

hive.exec.reducers.bytes.per.reducer=256000000
(2)每个任务最大的 reduce 数,默认为 1009
hive.exec.reducsers.max=1009
(3)mapreduce.job.reduces
该值默认为-1,由 hive 自己根据任务情况进行判断。


--如果用户用户不设置 hive将会根据数据量或者sql需求自己评估reducetask个数。
--用户可以自己通过参数设置reducetask的个数
 set mapreduce.job.reduces = N
--用户设置的不一定生效,如果用户设置的和sql执行逻辑有冲突,比如order by,在sql编译期间,hive又会将reducetask设置为合理的个数。  

Number of reduce tasks determined at compile time: 1

通用优化-执行计划

  • 通过执行计划可以看出==hive接下来是如何打算执行这条sql的==。

  • 语法格式:explain + sql语句

通用优化-并行机制,推测执行机制

  • 并行执行机制

    • 如果hivesql的底层某些stage阶段可以并行执行,就可以提高执行效率。

    • 前提是==stage之间没有依赖== 并行的弊端是瞬时服务器压力变大。

    • 参数

      set hive.exec.parallel=true; --是否并行执行作业。适用于可以并行运行的 MapReduce 作业,例如在多次插入期间移动文件以插入目标
      set hive.exec.parallel.thread.number=16; --最多可以并行执行多少个作业。默认为8。
      
  • Hive的严格模式

    • 注意。不要和动态分区的严格模式搞混淆。

    • 这里的严格模式指的是开启之后 ==hive会禁止一些用户都影响不到的错误包括效率低下的操作==,不允许运行一些有风险的查询。

    • 设置

      set hive.mapred.mode = strict --默认是严格模式  nonstrict
      
    • 解释

      1、如果是分区表,没有where进行分区裁剪 禁止执行
      2、order by语句必须+limit限制
      
  • 推测执行机制 ==建议关闭==。

    • MapReduce中task的一个机制。
    • 功能:
      • 一个job底层可能有多个task执行,如果某些拖后腿的task执行慢,可能会导致最终job失败。
      • 所谓的==推测执行机制就是通过算法找出拖后腿的task,为其启动备份的task==。
      • 两个task同时处理一份数据,谁先处理完,谁的结果作为最终结果。
    • 推测执行机制默认是开启的,但是在企业生产环境中==建议关闭==。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容