字节对spark sql的优化

Spark SQL通过SQL解析器构成语法树,然后通过规则执行器(逻辑执行器,物理执行器,优化器)先获得Unresolved Logical Plan,然后获得Resolved Logical Plan,再通过optimzi 优化,获取Optimized Logical Plan,通过Query planner获取物理执行计划

1.对bucket优化

这块优化主要针对join进行优化,spark这块优化包括(hash shuffle join,broadcast shuffle join,sortMerge Shuffle join)
第一个适合小表join小表,大表join小表
先进行shuffle分区,对分区数据进行hash join
第二个适合小表join大表
将小表广播到所有节点,然后进行hash join

第三个适合所有场景
先进行shuffle,然后区内排序,然后直接遍历有序序列进行join
不过还是有性能问题,如果直接避免shuffle,就能提高很大性能

字节通过对表进行分桶,在join的适合,不进行shuffle

2.物化列,物化视图

查询复杂数据结构,例如map
map中person对象中的age

字节通过将age字段进行物化,在内部给映射到age字段,在查询person,age的时候变为age

物化视图将对表经常查询的一些聚合操作物化成一个视图,聚合查询表的时候就会重写为对物化视图的字段去查询

3.针对shuffle优化

在mapper这段会产生很多分区文件,reducer会拉去分区文件,如果此时cpu或者io跑满或者机器故障,导致reduce无法拉去数据,导致stage retry,然后会慢慢导致更多的retry,最后导致任务失败

字节:mapper按原方案先写到本地,写完后上传hdfs,reduce如果拉取失败就去hdfs上拉去

你可能感兴趣的:(字节对spark sql的优化)