大数据面试题——Spark资源调优(六)

1、资源运行情况

        

2、资源运行中的集中情况

    (1)实践中跑的Spark job,有的特别慢,查看CPU利用率很低,可以尝试减少每个executor占用CPU core的数量,增加并行的executor数量,同时配合增加分片,整体上增加了CPU的利用率,加快数据处理速度。

    (2)发现某job很容易发生内存溢出,我们就增大分片数量,从而减少了每片数据的规模,同时还减少并行的executor数量,这样相同的内存资源分配给数量更少的executor,相当于增加了每个task的内存分配,这样运行速度可能慢了些,但是总比OOM强。 

    (3)数据量特别少,有大量的小文件生成,就减少文件分片,没必要创建那么多task,这种情况,如果只是最原始的input比较小,一般都能被注意到;但是,如果是在运算过程中,比如应用某个reduceBy或者某个filter以后,数据大量减少,这种低效情况就很少被留意到。

 

3、运行资源优化配置

    一个CPU core同一时间只能执行一个线程。而每个Executor进程上分配到的多个task,都是以每个task一条线程的方式,多线程并发运行的

    一个应用提交的时候设置多大的内存?设置多少Core?设置几个Executor?

        ./bin/spark-submit \  
            --master yarn-cluster \  
            --num-executors 100 \  
            --executor-memory 6G \  
            --executor-cores 4 \  
            --driver-memory 1G \  
            --conf spark.default.parallelism=1000 \  
            --conf spark.storage.memoryFraction=0.5 \  
            --conf spark.shuffle.memoryFraction=0.3 \

3.1 运行资源优化配置 - num-executors

    参数说明:该参数用于设置Spark作业总共要用多少个Executor进程来执行。Driver在向YARN集群管理器申请资源时,YARN集群管理器会尽可能按照你的设置来在集群的各个工作节点上,启动相应数量的Executor进程。这个参数非常之重要,如果不设置的话,默认只会给你启动少量的Executor进程,此时你的Spark作业的运行速度是非常慢的。       

    参数调优建议:每个Spark作业的运行一般设置50~100个左右的Executor进程比较合适,设置太少或太多的Executor进程都不好。设置的太少,无法充分利用集群资源;设置的太多的话,大部分队列可能无法给予充分的资源。

 

3.2 运行资源优化配置 - executor-memory

    参数说明:该参数用于设置每个Executor进程的内存。Executor内存的大小,很多时候直接决定了Spark作业的性能,而且跟常见的JVM OOM异常,也有直接的关联。      

    参数调优建议每个Executor进程的内存设置4G~8G较为合适。但是这只是一个参考值,具体的设置还是得根据不同部门的资源队列来定。可以看看自己团队的资源队列的最大内存限制是多少,num-executors * executor-memory,是不能超过队列的最大内存量的。此外,如果你是跟团队里其他人共享这个资源队列,那么申请的内存量最好不要超过资源队列最大总内存的1/3~1/2,避免你自己的Spark作业占用了队列所有的资源,导致别的同事的作业无法运行。

 

3.3 运行资源优化配置 - executor-cores

    参数说明:该参数用于设置每个Executor进程的CPU core数量。这个参数决定了每个Executor进程并行执行task线程的能力。因为每个CPU core同一时间只能执行一个task线程,因此每个Executor进程的CPU core数量越多,越能够快速地执行完分配给自己的所有task线程。

    参数调优建议:Executor的CPU core数量设置为2~4个较为合适。同样得根据不同部门的资源队列来定,可以看看自己的资源队列的最大CPU core限制是多少,再依据设置的Executor数量,来决定每个Executor进程可以分配到几个CPU core。同样建议,如果是跟他人共享这个队列,那么num-executors * executor-cores不要超过队列总CPU core的1/3~1/2左右比较合适,也是避免影响其他同事的作业运行。

 

3.4 运行资源优化配置 - driver-memory

    参数说明:该参数用于设置Driver进程的内存。      

    参数调优建议:Driver的内存通常来说不设置,或者设置1G左右应该就够了。唯一需要注意的一点是,如果需要使用collect算子将RDD的数据全部拉取到Driver上进行处理(或者是用map side join操作),那么必须确保Driver的内存足够大,否则会出现OOM内存溢出的问题。

 

3.5 运行资源优化配置 - spark.default.parallelism

    参数说明:该参数用于设置每个stage的默认task数量,也可以认为是分区数。这个参数极为重要,如果不设置可能会直接影响你的Spark作业性能。      

    参数调优建议:Spark作业的默认task数量为500~1000个较为合适。很多人常犯的一个错误就是不去设置这个参数,那么此时就会导致Spark自己根据底层HDFS的block数量来设置task的数量,默认是一个HDFS block对应一个task。通常来说,Spark默认设置的数量是偏少的(比如就几十个task),如果task数量偏少的话,就会导致你前面设置好的Executor的参数都前功尽弃。试想一下,无论你的Executor进程有多少个,内存和CPU有多大,但是task只有1个或者10个,那么90%的Executor进程可能根本就没有task执行,也就是白白浪费了资源!因此Spark官网建议的设置原则是,设置该参数为num-executors * executor-cores的2~3倍较为合适,比如Executor的总CPU core数量为300个,那么设置1000个task是可以的,此时可以充分地利用Spark集群的资源。

 

3.6 运行资源优化配置 - spark.storage.memoryFraction

    参数说明:该参数用于设置RDD持久化数据在Executor内存中能占的比例,默认是0.6。也就是说,默认Executor 60%的内存,可以用来保存持久化的RDD数据。根据你选择的不同的持久化策略,如果内存不够时,可能数据就不会持久化,或者数据会写入磁盘。      

    参数调优建议:如果Spark作业中,有较多的RDD持久化操作,该参数的值可以适当提高一些,保证持久化的数据能够容纳在内存中。避免内存不够缓存所有的数据,导致数据只能写入磁盘中,降低了性能。但是如果Spark作业中的shuffle类操作比较多,而持久化操作比较少,那么这个参数的值适当降低一些比较合适。此外,如果发现作业由于频繁的gc导致运行缓慢(通过spark web ui可以观察到作业的gc耗时),意味着task执行用户代码的内存不够用,那么同样建议调低这个参数的值。

 

3.7 运行资源优化配置 - spark.shuffle.memoryFraction

    参数说明:该参数用于设置shuffle过程中一个task拉取到上个stage的task的输出后,进行聚合操作时能够使用的Executor内存的比例,默认是0.2。也就是说,Executor默认只有20%的内存用来进行该操作。shuffle操作在进行聚合时,如果发现使用的内存超出了这个20%的限制,那么多余的数据就会溢写到磁盘文件中去,此时就会极大地降低性能。      

    参数调优建议:如果Spark作业中的RDD持久化操作较少,shuffle操作较多时,建议降低持久化操作的内存占比,提高shuffle操作的内存占比比例,避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。此外,如果发现作业由于频繁的gc导致运行缓慢,意味着task执行用户代码的内存不够用,那么同样建议调低这个参数的值。

 

总结:

1、num-executors:应用运行时executor的数量,推荐50-100左右比较合适

2、executor-memory:应用运行时executor的内存,推荐4-8G比较合适

3、executor-cores:应用运行时executor的CPU核数,推荐2-4个比较合适

4、driver-memory:应用运行时driver的内存量,主要考虑如果使用map side join或者一些类似于collect的操作,那么要相应调大内存量

5、spark.default.parallelism:每个stage默认的task数量,推荐参数为num-executors * executor-cores的2~3倍较为合适

6、spark.storage.memoryFraction:每一个executor中用于RDD缓存的内存比例,如果程序中有大量的数据缓存,可以考虑调大整个的比例,默认为60%

7、spark.shuffle.memoryFraction:每一个executor中用于Shuffle操作的内存比例,默认是20%,如果程序中有大量的Shuffle类算子,那么可以考虑其它的比例

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 大数据面试题——spark数据倾斜调优(五) 在Spark中,数据倾斜是一个常见的问题,它会导致任务执行时间过长,甚至导致任务失败。因此,我们需要对数据倾斜进行调优。 以下是一些调优方法: 1. 均匀分布数据 如果数据倾斜是由于数据分布不均匀导致的,可以尝试使用随机数将数据均匀分布到不同的分区中。可以使用repartition或coalesce方法来实现。 2. 使用聚合函数 如果数据倾斜是由于某些键的值过大导致的,可以尝试使用聚合函数,如reduceByKey或aggregateByKey,将键值对合并为一个值。这样可以减少数据传输量,从而减少数据倾斜。 3. 使用随机前缀 如果数据倾斜是由于某些键的值过大导致的,可以尝试使用随机前缀来将键值对分散到不同的分区中。可以使用map方法来实现。 4. 使用自定义分区器 如果数据倾斜是由于默认的哈希分区器导致的,可以尝试使用自定义分区器来将数据均匀分布到不同的分区中。可以实现Partitioner接口来自定义分区器。 5. 使用广播变量 如果数据倾斜是由于某些变量在多个任务中重复计算导致的,可以尝试使用广播变量来共享变量。可以使用broadcast方法来实现。 6. 使用缓存 如果数据倾斜是由于某些数据在多个任务中重复使用导致的,可以尝试使用缓存来避免重复计算。可以使用cache或persist方法来实现。 以上是一些常见的调优方法,但具体的调优方法需要根据具体的情况来选择。 ### 回答2: 在Spark任务中,数据倾斜可能会导致某些任务的执行时间远远超过其他任务,从而导致整个Spark应用程序的执行时间延长。为了解决这个问题,可以采取以下优化措施: 1.数据预处理:可以通过分析数据的相关性以及倾斜数据的分布情况来提前对数据进行处理和转换,以便尽可能地把数据分散到多个partition中。例如,可以采用哈希等方式,将数据平均地分配到多个分区中去。 2.增加分区数量:如果数据存在明显的倾斜态势,那么可以通过增加partition的数量来缓解数据倾斜的影响。可以使用repartition或者coalesce算子来增加分区数量。 3.采用随机算法:随机算法可以有效地减少数据倾斜的影响。例如,在join操作中,可以采用随机抽样的方式来选择少数表的关联键,以达到数据均衡的目的。 4.使用自定义累加器:如果数据倾斜只存在于某些关键数据上,可以采用自定义累加器的方式减少数据倾斜的影响。例如,在计算word count时,可以使用Accumulator来统计单词出现的次数,以达到数据均衡的目的。 5.使用Broadcast变量:如果数据倾斜存在于join表中的话,可以使用Broadcast变量将较小的表广播到每个节点,以减少网络传输的消耗。 综上所述,解决Spark数据倾斜问题需要综合考虑数据处理方式、partition数量、算法选择等方面,根据实际情况来设计和优化Spark应用程序,以达到优化性能、提升运行效率的目的。 ### 回答3: Spark数据倾斜是一个常见的问题,它发生的原因可能是数据分布不均匀或者数据特征相似性较高等。如果不加以处理,数据倾斜会导致运行时间变长,资源浪费,甚至导致任务失败等一系列问题。因此,调优是十分必要的。 一般情况下,Spark数据倾斜调优的方法主要分为以下几种: 1. 手动调节shuffle分区的数量 数据倾斜时,可以通过调整shuffle的分区数量来缓解压力。当数据分布较为均匀时,增加分区数量可以提高并行度,更好地利用资源,减少运行时间。但是原本数据分布不均匀的情况下,增加分区数量只能加重分区内的数据倾斜问题。 2. 增加随机前缀或者后缀 随机前缀或者后缀是一种常用的解决Spark数据倾斜的方法。它通过对相同Key的Value加上随机数的前缀或者后缀,然后再进行处理,将原本的数据压平,以达到均匀分布的效果。 3. 使用Spark SQL的聚合函数 Spark SQL的聚合函数可以更好地解决数据倾斜的问题。如果遇到有大量重复Key的情况,可以使用Spark SQL中的ReduceByKey或者GroupByKey进行聚合,其实现过程中会自动解决数据倾斜的问题。 4. 采用第三方工具 当数据倾斜问题较严重时,可以采用第三方工具,如Spark的Tungsten、HyperLogLog等。这些工具可以对数据进行均衡分布,优化任务,并提高运行效率。 总结起来,在Spark数据倾斜调优中,我们可以通过手动调整shuffle分区数量、增加随机前缀或后缀、使用Spark SQL聚合函数、采用第三方工具等方法来解决问题。但是,具体方法要根据不同场景灵活运用,选择合适的解决方案。同时,对于Spark应用程序的开发和调试,我们也应该加强对Spark内核的理解,减少数据倾斜问题的出现,以提高应用程序的稳定性和运行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值