|
|
|
@ -446,4 +446,35 @@ Spark应用fastutil
|
|
|
|
|
|
|
|
|
|
第三,如果外部变量是某种比较大的集合,那么可以考虑使用fastutil改写外部变量,首先从源头上减少内存的占比,通过广播变量进一步减少内存占用,
|
|
|
|
|
|
|
|
|
|
通过kyro序列化类库进一步减少内存占比。
|
|
|
|
|
通过kyro序列化类库进一步减少内存占比。
|
|
|
|
|
|
|
|
|
|
### 性能调优之调节数据本地化等待时间
|
|
|
|
|
spark的task分配算法,优先会希望每个task正好分配到它要计算的数据所在的节点,这样就不用在网络间传输数据。但是,一般是事与愿违,通常spark还会等待一段时间,默认情况下是3秒,如果不行,就会选择这个比较差的本地化级别,比如说将task分配到靠它要计算的数据所在的节点在比较近的一个节点,然后进行计算。
|
|
|
|
|
如果发生数据传输,task会通过其所在节点的BlockManager来获取数据,通过一个getRemote方法,通过网络传输组件从数据所在的节点的BlockManager中,获取数据通过网络传输回task所在的节点进行计算。
|
|
|
|
|
|
|
|
|
|
最佳情况,task和BlockManager直接在一个executor进程内,走内存速度最佳;同一机架,不在一个节点,需要网络传输;在一个节点,多个executor之间数据传输;不同机架,跨机架之间的网络传输,这种情况对性能的影响非常大。
|
|
|
|
|
|
|
|
|
|
PROCESS_LOCAL:进程本地化,代码和数据在同一进程,也就是同一个executor,计算的task由executor执行,BlockManager中有数据,性能最好。
|
|
|
|
|
|
|
|
|
|
NODE_LOCAL:节点本地化,代码和数据在同一节点,但是数据在不同进程。
|
|
|
|
|
|
|
|
|
|
RACK_LOCAL:在一个机架上,需要跨节点拉去数据。
|
|
|
|
|
|
|
|
|
|
NY:跨机架拉去数据。
|
|
|
|
|
|
|
|
|
|
spark.locality.wait默认是3s。
|
|
|
|
|
|
|
|
|
|
在什么时候调节数据本地化参数呢?
|
|
|
|
|
|
|
|
|
|
观察spark作业的运行日志,推荐首先使用本地模式,在日志中会显示数据本地化级别大多数是PROCESS_LOCAL,调节。
|
|
|
|
|
如果是其他,最好是调节一下数据本地化的等地时长。需要反复调节每次调节完,再运行,观察日志。看看大部分task的本地化级别有没有提提升,看看整个spark作业运行时间有没有缩短。
|
|
|
|
|
|
|
|
|
|
怎么调节?
|
|
|
|
|
|
|
|
|
|
spark.locality.wait.process
|
|
|
|
|
|
|
|
|
|
spark.locality.wait.node
|
|
|
|
|
|
|
|
|
|
spark.locality.wait.rack
|
|
|
|
|
|
|
|
|
|
在SparkConf中设置即可
|
|
|
|
|