-
hive架构
组件:- meta store
- cli client
- jdbc client
- driver
- sql parser解析器
- physical plan编译器
- query optimizer优化器
- execution执行器
hive语句调优常见参数
各种sql语句hvie如何实现
3.1 join的实现原理
Map:
1、以 JOIN ON 条件中的列作为 Key,如果有多个列,则 Key 是这些列的组合
2、以 JOIN 之后所关心的列作为 Value,当有多个列时,Value 是这些列的组合。在 Value 中还会包含表的 Tag 信息,用于标明此 Value 对应于哪个表
3、按照 Key 进行排序
Shuffle:
1、根据 Key 的值进行 Hash,并将 Key/Value 对按照 Hash 值推至不同对 Reduce 中
Reduce:
1、 Reducer 根据 Key 值进行 Join 操作,并且通过 Tag 来识别不同的表中的数据
3.2 group by的实现原理
3.3 distinct的实现原理-
sql转化为mapreduce的过程
- Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree
- 遍历AST Tree,抽象出查询的基本组成单元QueryBlock
- 遍历QueryBlock,翻译为执行操作树OperatorTree
- 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量
- 遍历OperatorTree,翻译为MapReduce任务
- 物理层优化器进行MapReduce任务的变换,生成最终的执行计划
Hive 编译器的工作职责
(1)Parser:将 HQL 语句转换成抽象语法树(AST:Abstract Syntax Tree)
(2)Semantic Analyzer:将抽象语法树转换成查询块
(3)Logic Plan Generator:将查询块转换成逻辑查询计划
(4)Logic Optimizer:重写逻辑查询计划,优化逻辑执行计划
(5)Physical Plan Gernerator:将逻辑计划转化成物理计划(MapReduce Jobs)
(6)Physical Optimizer:选择最佳的 Join 策略,优化物理执行计划hive的编译过程大体说下:
- 词法分析/语法分析
- 首先,客户端接受到请求者的sql命令,Antlr实现对sql进行词法和语法解析。将sql转化为抽象数
- 语义分析:
- 从Megastore获取模式信息,验证SQL语句中队表名,列名,以及数据类型的检查和隐式转换
- 逻辑计划生成
- 生成逻辑计划–算子树
- 逻辑计划优化
- 对算字数进行优化,包括列剪枝,分区剪枝,谓词下推等
- 物理计划生成
- 将逻辑计划生成包含由MapReduce任务组成的DAG的物理计划
- 物理计划执行
- 将DAG发送到Hadoop集群进行执行
- 数据倾斜
数据倾斜定义:
由于大数据使用的是分布式计算处理,数据分散的不均匀的话,会将大量的数据放到一台或者几台机器中进行处理。这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。常见特征是运行进度长时间处于99%的状态。
产生原因:
在做数据运算的时候会设计到,count distinct
、group by
、join
等操作,这些都会触发Shuffle动作,一旦触发,所有相同key的值就会拉到一个或几个节点上,就容易发生单点问题。基本上发生在shuffle过程中。
解决办法
- mapjoin方式
- count distinct的操作,先转成group,再count
- 万能膏药:hive.groupby.skewindata=true (设置负载均衡)
- left semi join的使用
- 设置map端输出、中间结果压缩。(不完全是解决数据倾斜的问题,但是减少了IO读写和网络传输,能提高很多效率)
-
hivesql优化:
- 哪些会对I/o消耗?
- 哪些会对内存消耗?
- 哪些会对cpu消耗?
mapjoin原理是什么?
hivesql的排序的原理?
null在数据底层是以什么形式进行存储的?
null在hive中是”\N” 判断空时要根据实际的存储来进行判断。在开发过程中如果需要对空进行判断,一定得知道存储的是哪种数据。 有个处理空的小技巧,Hive给出一种并非完美的解决方法——自定义底层用什么字符来表示NULL: 使用:ALTER TABLE b SET SERDEPROPERTIES (‘serialization.null.format’=’’); 这句话的意思是让null和’‘等价,也就是让null不显示,因为null对开发来说不好操作,可能不同地方代表意义不同, 而且转码可能也会有问题,所有用’‘代替 null转化为空字符串,还可以节省空间
- hive join的运行机制:
- Map阶段:读取源表的数据,Map输出时候以Join on条件中的列为key,如果Join有多个关联键,则以这些关联键的组合作为key;Map输出的value为join之后所关心的(select或者where中需要用到的)列;同时在value中还会包含表的Tag信息,用于标明此value对应哪个表;按照key进行排序
- Shuffle阶段:根据key的值进行hash,并将key/value按照hash值推送至不同的reduce中,这样确保两个表中相同的key位于同一个reduce中
- Reduce阶段:根据key的值完成join操作,期间通过Tag来识别不同表中的数据