spark调优是须要依据业务须要调整的,并非说某个设置是一成不变的,就比方机器学习一样,是在不断的调试中找出当前业务下更优的调优配置。以下零碎的总结了一些我的调优笔记。
spark 存储的时候存在严重的分配不均的现象,有几台机器在过渡使用, 有几台机器却非常少被使用。有几台机器缓存了几十个上百个RDD blocks 有的机器一个RDD blocks 都没有。这样存储有RDD blocks 的能够进行运算。运算的tasks 最多为该机器core数。
spark.storage.memoryFraction 分配给用于缓存RDD的内存的比例
比方假设spark.executor.memory 30g spark.storage.memoryFraction 0.5 则用于缓存的内存为14G 多。 默认留一些做其它用。
每个RDD blocks 的大小不一定是64兆 可能小于64兆,另外假设driver不是子节点,driver 程序执行的节点上的用于缓存的内存 ,就不会被使用。
其实一个两三G 的数据 须要用的缓存也至少须要两三G。假设中间过程中还有产生RDD 且也须要缓存到内存。则须要分配很多其它的内存用于缓存。
在缓存足够多的情况的
很多其它的内存不足错误提示(OOM) 来源于计算的时候产生的一些中间对象即计算所须要的内存。
所以分配用于缓存的内存 应该是这么算的。 比方我有10G的文件,4台机器。则每台机器至少2.5g缓存,假设每台机器分配给excutor 的内存为10g ,则memoryFraction 则至少为0.25 最好配大一些。但不能太大, 太大会导致计算内存不够。
并且假设中间过程还有产生新的RDD。则须要依据实际情况调大memoryFraction。
RDD 缓存分布不均匀 是影响spark 的非常大的性能之中的一个。为什么这么说?
由于有的机器分配给用于RDD 缓存的内存都用完了 ,这样相对而言在这个机器上计算的开销也会大,有的机器缓存占用的内存非常少。就算用这个机器来计算,还须要启动Node_local 模式。这样会影响计算的时间。
调优过程也遇到了一些问题,还没解决,比方:
为什么一个2G 的数据。默认块大小为64M. default.parallelism 设置成100,可它总是不按这个数据来分,比方常常分成了108个blocks,影响partions个数的參数还有哪些?还有我明明有四个节点,但常常有节点被分配的RDD 和计算都非常少非常少,这样的资源浪费的情况应该怎么调解?