分享

Spark性能优化(二):资源参数调优

        

问题导读
1.如何进行资源参数调优?2.有哪些调优技巧?





         所谓Spark资源参数调优,其实主要就是对Spark程序运行过程中各个使用资源的地方,通过调节各种参数来优化资源使用的效率,从而提升Spark作业的执行性能。需要考虑的资源主要是分配给各个executors的cores的个数和内存,分配给程序的executors总个数,分配的本地磁盘数,等等。
        Spark应用程序的每个executors都有固定的一样的cores和内存。每个executors的内存,在各种模式下,都可以通过spark-submit的-executor-memory 参数,或spark-defaults.conf配置文件的spark.executor.memory参数来指定。Executors内存的大小,很多时候直接决定了Spark作业的性能,而且跟常见的JVM OOM异常也有直接的关联。但该值不是越大越好,因为太大的堆空间会引起gc垃圾回收的延迟,该堆大小的最大值建议不超过64GB。
        每个executor的cores的个数和申请的executors的总个数,在yarn模式下,可以通过spark-submit的-executor-cores参数和-num-executors参数来分别指定,也可以通过spark-defaults.conf配置文件中的spark.executor.cores参数和spark.executor.instances参数来分别指定;在standalone和mesos模式下,由于spark程序会尽可能多地占用所有可用的cores和创建尽可能多的executors,所以我们可以通过参数spark.cores.max来指定程序申请的executors的cores总个数。因为每个CPU core同一时间只能执行一个task线程,所以每个Executor进程的CPU cores数量越多,越能够快速地执行完分配给自己的所有的task线程。但是还需要考虑到文件系统的IO吞吐量,一个最佳实践是,建议设置为每个executor 五个或五个以下的cores。
        Spark使用executors的本地磁盘来存储shuffle时的临时数据和spill到磁盘上的被缓存的rdd的分区,配置使用多个本地磁盘可以提升spark的性能。在yarn模式下,yarn有自己的配置本地磁盘的机制;在standalone模式下,可以在conf/spark-env.sh中配置环境变量SPARK_LOCAL_DIRS;在Mesos模式下,可以配置选项spark.local.dir.这三种配置模式都可以配置多个文件目录,多个文件目录之间需要以逗号隔开。
        由于每一台host上面可以并行N个workers,每一个worker下面可以并行M个executors,每个executor可以占用一个或多个cores,而task会被分配到executor上去执行且默认情况下一个task占用一个core,所以我们可以通过观察CPU的使用率变化来了解计算资源的使用情况。若CPU利用率很低且程序运行缓慢,我们就可以尝试减少每个executor占用的CPU cores的数量,增加并行的executors数量,同时配合增加数据分片,整体上增加CPU的利用率,加快数据处理速度;若job很容易发生内存溢出,我们就可以尝试增大分片数量,从而减少每个数据分片的大小,同时减少并行的executors的数量,这样相同的内存资源分配给数量更少的executors,相当于增加了每个task的内存分配,这样运行速度可能慢了些,但是总比OOM强;若数据量特别少,有大量的小文件生成,就可以尝试减少数据分片,没必要创建那么多的tasks,其实这种情况,如果只是最原始的输入文件比较小,一般都能被注意到,但是如果是在运算过程中,比如应用某个reduceByKey或者filter后,数据大量减少,这种低效情况就很少被留意到,我们尤其要注意。


欢迎关注笔者微信公众号“三角兽”,了解更多数学、算法、大数据干货文章。
qrcode_for_gh_1f93dbc1c492_258 (1).jpg





没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条