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