待补充:收集尽可能多的参数,这里只是几个主要的参数
示例
spark提交作业示例
spark-submit \
--master local[5] \
--driver-cores 2 \
--driver-memory 8g \
--executor-cores 4 \
--num-executors 10 \
--executor-memory 8g \
--class PackageName.ClassName XXXX.jar \
--name "Spark Job Name" \
InputPath \
OutputPath
都有什么参数
spark提交作业中的参数: master 指定spark提交的方式,可以是spark://host:port, mesos://host:port, yarn, yarn-cluster,yarn-client, local。这个参数是用于指定spark运行的环境
queue: 指定spark执行的队列,指定spark运行在哪个资源队列中
driver-cores:driver的内核数
driver-memory:driver的内存
executor-cores :一个executor的内核数,一个内核可以执行一个task
num-executors:executor的数量
executor-memory:一个executor的内存
conf :spark的配置属性
以上黑体标出的都是比较重要的参数,用于指定spark运行环境的资源分配。 这种资源包含计算资源和内存资源。
内存资源越多,那么溢写到磁盘的数据就越少,io消耗就越少;同时内存资源越多,gc的频率越低,执行效率就越高。
计算资源越多,能同时执行task的数量就越多。
计算资源和内存资源由:executor-cores、num-executors、executor-memory这三个参数控制。
其他参数
可以通过--conf配置其他参数。
比较重要的参数有以下几个:
spark.default.parallelism:用于设置每个stage的默认task数量,这个数量最好是executor-nums * executor-cores* (2-3)倍,这样设置不至于让资源处于空闲状态,能大大利用资源的效率,相当于是邪恶的地主,尽最大可能不让每一位佃农闲一刻。 如果这个数设置的太少,那么有的core执行完task,就没有task需要执行,而其他core还在执行task,就无法进入到下一个stage,这是这个core佃农就处于空闲时刻,这种情况邪恶贪婪的地主怎么能允许呢???
spark.storage.memoryFraction:这个值控制持久化的数据在executor内存中占的比例,默认值是0.6,根据实际情况调整,如果你的程序中持久化的占比比较高,那么可以适当提高这个值;如果持久化的数据不多,可以适当降低这个值
spark.shuffle.memoryFraction:这个值控制shuffle执行过程中占用内存的比例,如果shuffle过程中的数据写到内存中,但是内存空间不够用,那就要溢写到磁盘上,这样就降低了执行的性能,可以适当提高该值,降低spark.storage.memoryFraction值,避免shuffle过程中内存不够用。