Spark效率优化之道

Spark效率优化

Join相关

spark conf 中加入一些参数,会加速shuffle过程,这里根据数据量实际大小可以调节下面一些参数,实践中会对于大数据量JOIN能加速20%以上

spark.default.parallelism 是控制每个stage的默认stage数量,一般是对RDD有效,而参数spark.sql.shuffle.partitions是控制spark sql的shuffle分区数量

spark.default.parallelism=1000
spark.sql.shuffle.partitions=1000

shuffle数据量大或者硬盘空间不足,造成节点异常,可以
① 增加shuffle等待时间
② 划分更多的partitions
③ 增加executor的内存
但是由shuffle导致的异常的根本解决办法还是想办法减少shuffle的数据量
shuffle时间长需要增加网络等待时间

spark.rpc.askTimeout=30000

数据倾斜

数据倾斜是同一个stage中极少数task处理的数据量远远比其他task要大或者慢,网上各种解决方法很多,就不啰嗦了。有一个参数对于少数task运行时间长比较有效,就是开启推测执行,如果一个task比较慢,会开启几个相同的task任务去执行,减少task因为网络传输等各种原因失败的情况,加快执行,防止因为一个task卡住导致运行极慢。

spark.speculation=true

如果熟悉推测执行的下面几个参数,可以适当调整下,调节推测执行的性能

spark.speculation.interval=500
spark.speculation.quantile=0.85
spark.speculation.multiplie=1.6

数据读写

有时候读取超大文件,每个文件part的size都很大,直接读取的话,spark会按照文件大小分很多任务读取一个part文件,默认是128M,这样一来,读取阶段会有数万甚至数十万个task在工作,可以设置参数来指定
spark sql场景

spark.sql.files.maxPartitionBytes  #  默认128M = 128 * 1024 * 1024   每个分区最大的文件大小,针对于大文件切分
spark.sql.files.openCostInBytes   # 默认值4M = 4 * 1024 * 1024   小于该值的文件将会被合并,针对于小文件合并

spark rdd 场景
rdd的分区大小是根据max(MIN_SIZE,BLOCK_SIZE)来的,这里的MIN_SIZE就可以通过下面的参数设置

spark.mapreduce.input.fileinputformat.split.minsize=10240000000
spark.mapreduce.input.combinefileinputformat.split.minsize=10240000000
## Scala集合优化
scala语言非常灵活,想要实现某种功能可能有许多种写法,但是不同的写法效率是不一样的。在输入数据量不大的时候体现不出来,但是输入规模一旦起来之后,耗时差异就十分显著了。

在实际中碰到一个例子,有个物品曝光序列seq,用的是Array表示,然后在物品候选集candidates中需要判断每个候选集是否已曝光,使用方式如下。由于候选集和曝光集合都很大,序列数组的contains方法是遍历来比较,时间复杂度远远高于Set,在运行数亿次之后,序列的耗时综合比较是Set的3倍
```java
df.map( row => {
...
candidates.filter(x => seq.contains(x.id))
...
}
)

应该使用如下方式,将seq转为set,再去比较

val set = seq.toSet
df.map( row => {
...
candidates.filter(x => set .contains(x.id))
...
}
)

这就要求在实际编程中,注重代码效率。
这里有几个核心原则:尽量依据不同数据结构的特性来处理;尽量不产生临时对象;尽量使用自带函数

这里有一份比较详细的注意清单,值得参考
Scala Collections 提示和技巧

其他

数据量特别大(比方说超过100G)的时候,
① 不要使用persist和unperisist函数,容易失败,可能spark对于超大数据的persist不太支持,而且大量数据persist存在磁盘IO,本身比较耗时
② 尽量不要使用count函数
③ 大数据尽快落地

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值