Spark任务调优(1)——数据本地化

Spark官网有关于数据本地化的相关介绍:http://spark.apache.org/docs/2.1.0/tuning.html#data-locality


本地化说明

数据本地化可以对Spark任务的性能产生重大影响。如果数据和操作数据的代码在一块,计算通常会很快。但是如果数据和代码不在一起,就必须将一方移动到另一方。通常,将序列化的代码块从一个地方发送到另一个地方要比发送数据更快,因为代码的大小比数据要小得多(这也是大数据计算核心思想之一:计算向数据移动)。Spark围绕这个数据本地化的一般原则构建它的调度。

数据本地化是指数据与运行代码之间的距离。根据数据的当前位置,有几个本地化级别。从近到远:

  • PROCESS_LOCAL    数据位于与运行代码相同的JVM中。这是最好的地方。
  • NODE_LOCAL    数据位于同一节点上。示例:可能在同一个节点上的HDFS中,或者在同一个节点上的另一个executor中。这比PROCESS_LOCAL稍微慢一些,因为数据必须在进程之间来回移动。
  • NO_PREF    数据在任何地方都可以同样快速地访问,并且没有本地偏好。
  • RACK_LOCAL    数据位于同一台服务器上。数据在同一机架上的不同服务器上,所以需要通过网络发送,通常是通过一个交换机。
  • ANAY   数据在网络上的其他地方,而不是在同一个机架上。

Spark倾向于将所有任务都安排在最佳的本地化级别,但这并不总是可行的。在没有任何空闲的executor来处理未处理数据的情况下,Spark将切换到较低的本地化级别。有两种选择:a)等到一个繁忙的CPU释放出来,在同一台服务器上启动一个数据任务,或者,b)立即在一个需要移动数据的较远的地方启动一个新的任务。

Spark通常做的是等待一个繁忙的CPU释放的希望。一旦超时过期,它就开始将数据从远处移动到空闲CPU。每个级别之间的等待超时时间可以单独配置,也可以全部在一个参数中;有关详细信息,请参阅配置页面上关于spark.locality参数的说明。如果您的任务运行时间很长,并且看到了不好的本地化级别,您应该增加这些设置(即增加每个级别间的超时时间),但是默认情况下通常很好。


如何查看本地化级别

1、通过Task日志查看

2、我常用的方法是从yarn的RM Web UI界面找到对应的任务,进入任务的明细界面。



何时需要调节

观察日志或者WebUI,查看Task数据本地化的级别,如果大部分都是PROCESS_LOCAL,则不需要调节。如果大部分都是NODE_LOCAL、ANY,RACK_LOCAL那最好提高数据本地化级别。
调节是一个反复尝试的过程,每次调节完以后,再来运行,观察日志。 

看看大部分的task的本地化级别有没有提升;看看,整个spark作业的运行时间有没有缩短。

如何调节数据本地化级别

通过改变数据本地化级别之间的超时等待时间。Spark官网对相关配置项有详细的介绍。

spark.locality.wait 默认3s

spark.locality.wait.process  默认与spark.locality.wait保持一致,可以单独指定

spark.locality.wait.node 默认与spark.locality.wait保持一致,可以单独指定

spark.locality.wait.rack 默认与spark.locality.wait保持一致,可以单独指定

注意:

修改的等待时间不能太长,因为时间太长,虽然每个Task的本地化级别提高了,但是整个Application的执行时间会由于等待时间过长而大大加长,从而失去了调节本地化级别的意义。


原理

Driver端的TaskScheduler在分发任务前,都会通过MapOutputTracker查询Task任务所需数据的位置信息,优先将Task发送到资源充足且数据所在节点的Executor的线程池中。Task在线程池中排队等待执行,如果等待时间超过3s(默认值,可能更长),重试5次,依然无法执行的话,TaskScheduler就认为这个节点没有计算能力(即资源被其他任务占完了)。TaskScheduler会降低数据本地化级别,将Task按照NODE_LOCAL重新发送,如果还无法执行,就继续降低数据本地化级别。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答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内核的理解,减少数据倾斜问题的出现,以提高应用程序的稳定性和运行效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值