hive优化需知道的底层知识部分

  1. 1 与会者目标=>今日主题:承认自己的愚蠢,并一直抱有学习的意愿
  2. hive是啥=>MapReduce到hive的执行原理
  3. 案例
  4. 参数调优,执行计划
  5. 开发习惯,多看官方文档
  6. 资料参考

2 理解hive=>MapReduce到hive的执行原理

  1. 理解hive

hive 建立在Hadoop体系架构上的一层SQL抽象,HiveSQL实际上先被SQL解析器解析后被Hive框架解析成一个MapReduce可执行计划,并按照该计划生成MapReduce任务后交给Hadoop集群处理

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
2. MapReduce内部执行原理

MapReduce 作业执行主要由 JobTracker 和 Task-Tracker 负责完成。

  • 客户端编写好的 MapReduce 程序井配置好的 MapReduce 作业是一个 Job, Job 被提交给 JobTracker,JobTracker 会给该 Job 一个新的 ID 值,接着检查该 Job 指定的输出目录是否存在、输入文件是否存在,如果不存在,则抛出错误。

  • 同时, JobTracker 会根据输入文件计算输入分片 ( input split ),这些都检查通过后, JobTracker就会配置 Job 需要的资源并分配资源,然后JobTracker 就会初始化作业,也就是将 Job放入一个内部的队列,让配置好的作业调度器能调度到这个作业,作业调度器会初始化这个 Job ,初始化就是创建一个正在运行的 Job对象(封装任务和记录信息),以便 JobTracker 跟踪 Job 的状态和进程。

  • Job 被作业调度器调度时,作业调度器会获取输入分片信息,每个分片创建一个 Map 任务,并根据 TaskTracker的忙闲情况和空闲资源等分配 Map 任务和 Reduce 任务到TaskTraker ,同时通过心跳机制也可以监控到TaskTracker 的状态和进度 ,也能计算出整个Job 的状态和进度。

  • 当JobTracker 获得了最后一个完成指定任务的 TaskTracker 操作成功的通知时候, Jo Tracker 会把整个 Job状态置为成功,然后当查询 Job 运行状态时(注意:这个是异步操作),客户端会查到 Job 完成的通知 。

  • 如果 Job 中途失败, MapReduce 会有相应的机制处理 。一般而言,如果不是程序员程序本身有 bug ,MapReduce错误处理机制都能保证提交的 Job 能正常完成。

那么, MapReduce 到底是如何运行的呢?

我们按照时间顺序, MapReduce 任务执行包括:

输入分片 Map 、Shuffle 和 Reduce 等阶段,一个阶段的输出正好是下一阶段的输入。
MapReduce执行阶段和流程图
上图从整体角度很好地表示了 MapReduce 的大致阶段划分和概貌。
结合单词计数实例的 MapReduce 执行阶段和流程图在这里插入图片描述
而具体各阶段的作用,可参考如下:
在这里插入图片描述

  1. Hive执行原理

以 group by 语句执行图解为例:
我们假定一个业务背景:分析购买iPhone7客户在各城市中的分布情况,即哪个城市购买得最多、哪个最少。

select city,count(order_id) as iphone7_count from orders_table where day='201901010' and cat_name='iphone7' group by city;

1
底层MapReduce执行过程:

Hive group by 语句执行原理图解
Hive SQL 的 group by 语句涉及数据的重新分发和分布,因此其执行过程完整地包含了 MapReduce 任务的执行过程。
在这里插入图片描述

( 1 )输入分片

group by 语句的输入文件依然为 day=20170101 的分区文件,其输入分片过程和个数同 select 语句,也是被分为大小分别为: 128MB 、128MB、44MB 三个分片文件。

( 2 ) Map 阶段

Hadoop 集群同样启动三个 Map 任务,处理对应的三个分片文件;每个 map 任务处理其对应分片文件中的每行,检查其商品类目是否为 iPhone7 ,如果是,则输出形如<city,1> 的键值对,因为需要按照 city 对订单数目进行统计(注意和 select 语句的不同)。

( 3 ) Combiner 阶段

  • Combiner 阶段是可选的,如果指定了 Combiner 操作,那么 Hadoop 会在 Map 任务的地输出中执行 Combiner操作,其好处是可以去除冗余输出,避免不必要的后续处理和网络传输开销等此列中,Map Task1 的输出中< hz,1>出现了两次,那么Combiner 操作就可以将其合并为 <hz,2>
  • Combiner 操作是有风险的,使用它的原则是 Combiner 的输出不会影响到 Reduce计算的最终输入。例如,如果计算只是求总数、最大值和最小值,可以使用 combiner ,但是如果做平均值计算使用了 Combiner,最终的 Reduce 计算结果就会出错

( 4 ) Shuffle 阶段

完整的shuffle包括分区(partition),排序(sort)和分隔(spill)、复制(copy)、合并(merge)等过程。

  • 对于理解group by语句,关键的过程实际就两个,即分区和合并;所谓分区,即 Hadoop 如何决定将每个 Map任务的每个输出键值对分配到那个 Reduce Task 所谓合井,即在 一个Reduce Task 中,如何将来自于多个 Map Task的同样一个键的值进行合并Hadoop 中最为常用的分区方法是 Hash Partitioner ,即 Hadoop 会对每个键取 hash值,然后再对此 hash 值按照 reduce 任务数目取模,从而得到对应的 reduce ,这样保证相同的键,肯定被分配到同一个reduce 上,同时 hash 函数也能确保 Map 任务的输出被均匀地分配到所有的Reduce任务上

( 5 )Reduce 阶段

调用reduce函数,每个reduce任务的输出存到本地文件中

( 6 )输出文件

hadoop 合并 Reduce Task任务的输出文件到输出目录

job语句执行图解

SELECT T1.order_id,T1.buyer_id,t2.age
  FROM (SELECT order_id,buyer_id FROM orders_table WHERE XXX)T1
  JOIN (SELECT buyer_id,age FROM buyer_table WHERE XXX)T2
    ON T1.buyer_id=T2.buyer_id

在这里插入图片描述

(1)输入分片
按照文件大小来进行分片
(2)Map阶段
根据对应的split 1:1生成相应的map task
(3)Shuffle阶段
对于join语句,该过程主要阶段是Partition,即根据join列进行数据重分布和分发的过程。
最常用partition方法为Hash Partitioner,对每个join键取hash值,然后对hash值按照Reduce任务数目取模
(4)Reduce阶段
根据join键值进行关联
(5)输出文件
合并Reduce task任务的输出文件到输出目录

3 案例

案例

4 参数调优+执行计划

前言:看不懂执行计划就搞参数调优,盲人摸象

参数默认值描述
mapred.cpmpress.map.output=true设置map中间输出压缩,减少传输时间
hive.exec.dynamic.partition=true打开动态分区功能
hive.exec.dynamic.partition.mode=nostrict让所有分区都动态被锁定
hive.auto.convert.join=true自动化MapJoin 用于大小表关联时,将小表完全放入内存在Map端连接
hive.mapjoin.smalltable.filesize=5000000小表最大文件大小,默认为 25M 25*10^6
hive.auto.convert.join.noconditionaltask=true是否将多个MapJoin合并为一个
hive.auto.convert.join.noconditionaltask.szie=5000000多个MapJoin转化为一个时,所有小标的文件大小总和的最大值 10*7
mapreduce.reduce.shuffle.memory.limit.percent=0.6一个单一的shuffle的最大内存适用限制 默认值 0.25
mapred.child.java.opts=-Xmx8192m
hive.exec.parallel=true并行执行任务
hive.exec.parallel.thread.number=8指定同一个Sql允许并行运行的最大线程数
hive.optimize.cp=true只读取所需要的列,裁剪所对应的参数项,默认为true
mapred.reduce.task=8设置reduce数量
hive.groupby.skewindata=true设置负载均衡
hive.tez.container.size=4096设置堆大小
mapred.job.shuffle.merge.percent=0.6Map输出缓冲区适用比例阀值,当达到阀值,缓冲区的数据将被自动归并然后spill到磁盘
hive.map.aggr=truetrue会在map端进行groupby,然后merge操作,减少reduce处理数量,效率更高但需要更多内存
mapred.max.split.size=2560000000每个Map块最大split块是 256000000b
mapred.min.split.size.per.nod=100000000每个节点处理的最小split
mapred.min.split.size.per.rack=100000000每个服务器处理的最小split
hive.exec.reducers.bytes.per.reducer=4000000000设置reduce端处理数据量
hive.exec.reducers.max=100设置reduce最大个数
mapreduce.job.reduces=40设置reduce个数
hive.fetch.task.conversion=more=none时,会走mr ,设置more简单sql可执行本地计划
hive.mapred.mode=‘strict’设置为严格模式

大小表关联时
groupby倾斜时

5 开发习惯

  1. 用具体栏位代替*
  2. 用group by代替distinct
  3. 用rlike 代替like
  4. 用coalesce 代替nvl

hive官网

6 参考资料

1《离线和实时大数据开发实战》
2 https://blog.csdn.net/BeiisBei/article/details/109255666 等

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值