spark 优化套路

2057 查看

spark整个api上手较为简单,scala表达起来比较顺畅,java根据spark官方文档,理解scala的几个特性即可。

spark离线处理优化

目的减少无效操作,io cpu的有效利用,直接查优化技巧,不如先搞明白spark处理过程。明白以下再对应代码可以解决很多问题。

  1. DAG图对应代码 明白过程

  2. stages tasks对应实现层

  3. shuff过程,如何减少shuff,必须shuff则看写文件io有效利用率。常见的文件太多则合并文件。

比如:本地spark sql跑两张表join外带where group操作,遇到shuff就200个,手动repartition无效,肯定是默认参数在join指定,查文档修改生效。时间从13秒下降到1s内。

有意思的是根据show这个操作,最后的task任务数为1,不符合partitions到reduce的数量比,最后看了下是这个操作本事的问题,默认读取数量调用head,不需要获取所有partitions

streaming性能与精确性

  1. 时间片内精确性:tran操作转换保证,内置表达无问题

  2. 时间片外的精确性 :需要存储数据,性能损耗考虑,所以一般实时数据用,过一定时间用离线计算来补足,比如主动营销效果分析,最近几分钟的数据可以实时,一小时前的数据完全可以通过离线统计如hbase+spark

  3. 外部数据精确性 还是时间片数据去重,不依赖外部,跨时间片参考2

  4. 挂掉恢复精确 常用的读取kafka,自己控制offsets ,如我们通常的程序也会自己控制offsets

  5. kafka时间片内堆积数据太多,参数控制每秒max消息

  6. 每个rdd对外部数据的操作批量到partitions

  7. 多个指标统计统计,转换结构与action过程能合并最好,具体DAG逻辑图,减少shuff。比较简单看到rdd转换多个相同key的单value,那么还不如直接转换为 key,list