程序员人生 网站导航

spark调优经验(待续)

栏目:互联网时间:2014-11-03 08:59:57

spark调优是需要根据业务需要调剂的,其实不是说某个设置是1成不变的,就比如机器学习1样,是在不断的调试中找出当前业务下更优的调优配置。下面零碎的总结了1些我的调优笔记。

spark 存储的时候存在严重的分配不均的现象,有几台机器在过渡使用, 有几台机器却很少被使用,有几台机器缓存了几10个上百个RDD blocks  有的机器1个RDD blocks 都没有,这样存储有RDD blocks 的可以进行运算,运算的tasks 最多为该机器core数。

spark.storage.memoryFraction 分配给用于缓存RDD的内存的比例  

比如如果spark.executor.memory              30g  spark.storage.memoryFraction       0.5          则用于缓存的内存为14G 多, 默许留1些做其他用。



每个RDD blocks  的大小不1定是64兆 可能小于64兆,另外如果driver不是子节点,driver 程序运行的节点上的用于缓存的内存 ,就不会被使用。


事实上1个两3G 的数据 需要用的缓存也最少需要两3G,如果中间进程中还有产生RDD 且也需要缓存到内存,则需要分配更多的内存用于缓存。在缓存足够多的情况的
更多的内存不足毛病提示(OOM) 来源于计算的时候产生的1些中间对象即计算所需要的内存。


所以分配用于缓存的内存 应当是这么算的, 比如我有10G的文件,4台机器,则每台机器最少2.5g缓存,如果每台机器分配给excutor 的内存为10g ,则memoryFraction 则最少为0.25  最好配大1些,但不能太大, 太大会致使计算内存不够。而且如果中间进程还有产生新的RDD,则需要根据实际情况调大memoryFraction。


RDD 缓存散布不均匀 是影响spark 的很大的性能之1,为何这么说?

由于有的机器分配给用于RDD 缓存的内存都用完了  ,这样相对而言在这个机器上计算的开消也会大,有的机器缓存占用的内存很少,就算用这个机器来计算,还需要启动Node_local 模式,这样会影响计算的时间。


调优进程也遇到了1些问题,还没解决,比如:
为何1个2G 的数据,默许块大小为64M. default.parallelism 设置成100,可它总是不按这个数据来分,比如常常分成了108个blocks,影响partions个数的参数还有哪些?还有我明明有4个节点,但常常有节点被分配的RDD 和计算都很少很少,这类资源浪费的情况应当怎样调解?

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐