1. 简述Spark参数(性能)调优 ?
Spark性能调优涉及多个方面,包括资源分配、任务并行度、内存管理、存储策略等。以下是一些关键的Spark性能调优参数:
-
spark.executor.memory
:设置Executor的内存大小。这是最关键的配置之一,需要根据集群的资源和作业的需求进行调整。 -
spark.driver.memory
:设置Driver的内存大小。如果Driver在处理数据时内存不足,可能需要增加这个值。 -
spark.executor.cores
:设置每个Executor可用的CPU核心数。这影响Executor可以并行执行的任务数。 -
spark.driver.cores
:设置Driver节点的CPU核心数。对于需要大量CPU资源的作业,可能需要增加这个值。 -
spark.default.parallelism
:设置默认的并行度,如果没有为特定的RDD操作设置并行度。 -
spark.sql.shuffle.partitions
:在使用DataFrame或Dataset API时,设置Shuffle操作的默认分区数。 -
spark.locality.wait
:设置等待数据本地性的时间。增加这个值可以提高数据本地性,但可能会增加作业的延迟。 -
spark.serializer
:设置数据序列化的方式,如Java或Kryo。Kryo序列化通常更高效。 -
spark.kryo.registrationRequired
:在使用Kryo序列化时,设置是否需要显式注册类。这可以提高安全性和性能。 -
spark.memory.fraction
:设置Executor堆内存中用于执行任务的比例。降低这个值可以留出更多内存用于缓存。 -
spark.memory.storageFraction
:设置Executor堆内存中用于存储持久化RDD的比例。 -
spark.shuffle.compress
:设置是否压缩Shuffle数据。压缩可以减少网络传输的数据量,但会增加CPU负担。 -
spark.network.timeout
:设置网络通信的超时时间。在网络条件不佳的情况下,可能需要增加这个值。 -
spark.speculation
:设置是否开启任务推测执行。这可以在某些任务执行缓慢时提前启动任务的备份。 -
spark.dynamicAllocation.enabled
:设置是否开启动态资源分配。这允许Spark根据作业需求动态地增加或减少资源。 -
spark.dynamicAllocation.minExecutors
和spark.dynamicAllocation.maxExecutors
:设置动态资源分配的最小和最大Executor数量。 -
spark.streaming.backpressure.enabled
:在Spark Streaming中,设置是否开启背压机制,以防止系统过载。 -
spark.hadoop.cloneConf
:设置是否在Executor启动时克隆Hadoop配置。这可以确保每个Executor使用一致的配置。
性能调优是一个持续的过程,需要根据作业的具体需求和集群资源情况进行实验和调整。通过监控工具(如Spark UI)来观察作业的执行情况,