Spark 性能优化:资源分配

性能调优的王道是分配更多的资源,当目前资源够用的状况下,分配的资源越充分,在性能和速度上的提高越明显。当资源没法分配更多时候才会去考虑后续的一些调优手段。shell

一,分配的资源有哪些?

1,分配的 executor 数量;并发

2,每一个 executor 须要的 core 数量;性能

3,每一个 executor 须要的内存大小;spa

4,driver 的内存大小 (这个影响不大) ;线程

二,在哪里去配置这些资源?

提交 spark 做业时,用的 spark-submit 的 shell 脚本,里面有对应的参数:对象

—num-executors 3 \ 配置的 executor 数量队列

—driver-memory 100m \配置的 driver 内存进程

— executor-memory 100m \配置每一个 executor 的内存大小内存

— executor-cores 3 \配置的每一个 executor 的核心数量资源

三,调节到什么程度最好呢?

**第一种,Spark Standalone 模式。**公司搭建的 Spark 集群上,有多少台机器,每台机器有多少的内存,每台机器的 cpu 是几核的,这些参数要有数,而后根据这些参数去分配 Spark 做业的资源分配。

好比说,集群上有 20 台机器,每台有 4g 内存,每台的 cpu 有两个核心。那么能够这么分配资源:20 个 executor,每一个 executor 分配 4g 的内存和 2 个 core。

**第二种,使用 Yarn 做为资源调度的集群。**这种集群,须要去查看你的 Spark 做业提交到的资源队列大概有多少资源,而后分配。

好比说,该资源队列有 500g 的内存,100 个 cpu 核心。那么能够分配 50 个 executor,每一个 executor 分配 10g 的内存和 2 个 core。

四,提高性能的缘由

1,Spark 应用启动在 Driver 进程中,因此 Driver 内存的分配大一些能够适当提高 Driver 进程的执行速度;

2,Spark 应用会被拆分红多个 job,每一个 job 又会被划分红多个 stage,每一个 stage 会被分配多个 task 去执行。这些 task 最后都会被分配到 worker 上的 executor 进程中执行,每一个 task 在 executor 进程中是一个线程在执行。

这样就能够看出,若是集群资源充分的话,executor的数量越多,执行速度就越快。

当 executor 所在进程的 JVM 分配的核心越多(要配合该 worker 节点的 cpu 核心数量来定),越有助于提高执行效率,由于 executor 内部执行任务的 task 线程是并发执行的,在 worker 节点的 cpu 核心数量越多的状况下,并行度就越高。

另外,因为 Spark 应用有时会须要对 RDD 进行 cache 操做,shuffle 操做的 map 端和 reduce 端须要存放数据,在 task 执行的时候也会建立出不少的对象,这三个因素都须要内存,因此内存大也会提高 Spark 的性能。

相关文章
相关标签/搜索