spark整个api上手较为简单,scala表达起来比较顺畅,java根据spark官方文档,理解scala的几个特性即可。
spark离线处理优化
目的减少无效操作,io cpu的有效利用,直接查优化技巧,不如先搞明白spark处理过程。明白以下再对应代码可以解决很多问题。
DAG图对应代码 明白过程
stages tasks对应实现层
shuff过程,如何减少shuff,必须shuff则看写文件io有效利用率。常见的文件太多则合并文件。
比如:本地spark sql跑两张表join外带where group操作,遇到shuff就200个,手动repartition无效,肯定是默认参数在join指定,查文档修改生效。时间从13秒下降到1s内。
有意思的是根据show这个操作,最后的task任务数为1,不符合partitions到reduce的数量比,最后看了下是这个操作本事的问题,默认读取数量调用head,不需要获取所有partitions
streaming性能与精确性
时间片内精确性:tran操作转换保证,内置表达无问题
时间片外的精确性 :需要存储数据,性能损耗考虑,所以一般实时数据用,过一定时间用离线计算来补足,比如主动营销效果分析,最近几分钟的数据可以实时,一小时前的数据完全可以通过离线统计如hbase+spark
外部数据精确性 还是时间片数据去重,不依赖外部,跨时间片参考2
挂掉恢复精确 常用的读取kafka,自己控制offsets ,如我们通常的程序也会自己控制offsets
kafka时间片内堆积数据太多,参数控制每秒max消息
每个rdd对外部数据的操作批量到partitions
多个指标统计统计,转换结构与action过程能合并最好,具体DAG逻辑图,减少shuff。比较简单看到rdd转换多个相同key的单value,那么还不如直接转换为 key,list
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。