4月底去参加了qcon 2018北京站,新兴数据处理专场有机会听到了Spark StructedStreming/blink/kafka stream三场的分享,整个听下来有一些感想,刚好最近又在看spark2这块的一些源码设计,所以想着写点自己的理解。
注意:在此就不再赘述spark2相比1.x的更新项了,有一项应该是大家都知道的,那就是2推出了全新的DataSet
为什么会出现DataSet?
想要解释为什么会出现DataSet,那就不得不提到DataFrame了
DataFrame
DataFrame相比RDD而言,有一个优势那就是可以使用Spark catalyst optimized,如下图:
可以看出DataFrame和Spark sql一样底层都可以经过catalyst的优化
主要有以下几个过程
1. 逻辑计划生成、优化
2. 物理计划生成、优化
3. 最后生成RDD操作
其他的类sql查询,比如hive sql的执行过程也大抵如此,包括了抽象语法树生成、逻辑计划、物理计划 等,尤其是语法树生成,hive更具备通用性,spark2当中也使用了和hive一样的Antlr来生成AST,大家有兴趣可以看一下。
DataSet做了什么?
DataSet在DataFrame的基础上做了更高级的封装,如增加静态变量、自定义函数等,在拥有DataFrame所有的优点的前提下,编程方式更灵活。spark2为了统一api,移除了DataFrame,将之变为DataSet[Row],也正是出于这点。
回到一开始的问题,为什么会出现DataSet,想必已经有了答案了。
谈谈流处理的方向
目前较为主流的实时这块的还是这几个
- spark Stream
- blink
- storm
- kafka stream
各家厂商都在大力发展通用性这块,从最早的spark streaming的编程方式到现在的只要几条sql就可以处理一些场景的blink
- spark structed streaming底层全面接入sql优化引擎
- blink sql通用处理层
sql天然具备的可优化性以及通用性决定了社区的活跃度。
后面会集中写一篇介绍sql优化和catalyst