Spark性能优化(数据倾斜调优).doc

Spark性能优化(数据倾斜调优).doc

ID:56281087

大小:1.62 MB

页数:22页

时间:2020-06-05

Spark性能优化(数据倾斜调优).doc_第1页
Spark性能优化(数据倾斜调优).doc_第2页
Spark性能优化(数据倾斜调优).doc_第3页
Spark性能优化(数据倾斜调优).doc_第4页
Spark性能优化(数据倾斜调优).doc_第5页
资源描述:

《Spark性能优化(数据倾斜调优).doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Spark性能优化:数据倾斜调优1.数据倾斜调优调优概述   有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性能会比期望差很多。数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能。数据倾斜发生时的现象绝大多数task执行得都非常快,但个别task执行极慢。比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时。这种情况很常见。原本能够正常执行的Spark作业,某天突然报出OOM(内存溢出)

2、异常,观察异常栈,是我们写的业务代码造成的。这种情况比较少见。数据倾斜发生的原理   数据倾斜的原理很简单:在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或join等操作。此时如果某个key对应的数据量特别大的话,就会发生数据倾斜。比如大部分key对应10条数据,但是个别key却对应了100万条数据,那么大部分task可能就只会分配到10条数据,然后1秒钟就运行完了;但是个别task可能分配到了100万数据,要运行一两个小时。因此,整个Spark

3、作业的运行进度是由运行时间最长的那个task决定的。   因此出现数据倾斜的时候,Spark作业看起来会运行得非常缓慢,甚至可能因为某个task处理的数据量过大导致内存溢出。   下图就是一个很清晰的例子:hello这个key,在三个节点上对应了总共7条数据,这些数据都会被拉取到同一个task中进行处理;而world和you这两个key分别才对应1条数据,所以另外两个task只要分别处理1条数据即可。此时第一个task的运行时间可能是另外两个task的7倍,而整个stage的运行速度也由运行最慢的那个task所决定。如

4、何定位导致数据倾斜的代码   数据倾斜只会发生在shuffle过程中。这里给大家罗列一些常用的并且可能会触发shuffle操作的算子:distinct、groupByKey、reduceByKey、aggregateByKey、join、cogroup、repartition等。出现数据倾斜时,可能就是你的代码中使用了这些算子中的某一个所导致的。某个task执行特别慢的情况   首先要看的,就是数据倾斜发生在第几个stage中。   如果是用yarn-client模式提交,那么本地是直接可以看到log的,可以在log中

5、找到当前运行到了第几个stage;如果是用yarn-cluster模式提交,则可以通过SparkWebUI来查看当前运行到了第几个stage。此外,无论是使用yarn-client模式还是yarn-cluster模式,我们都可以在SparkWebUI上深入看一下当前这个stage各个task分配的数据量,从而进一步确定是不是task分配的数据不均匀导致了数据倾斜。    比如下图中,倒数第三列显示了每个task的运行时间。明显可以看到,有的task运行特别快,只需要几秒钟就可以运行完;而有的task运行特别慢,需要几分

6、钟才能运行完,此时单从运行时间上看就已经能够确定发生数据倾斜了。此外,倒数第一列显示了每个task处理的数据量,明显可以看到,运行时间特别短的task只需要处理几百KB的数据即可,而运行时间特别长的task需要处理几千KB的数据,处理的数据量差了10倍。此时更加能够确定是发生了数据倾斜。    知道数据倾斜发生在哪一个stage之后,接着我们就需要根据stage划分原理,推算出来发生倾斜的那个stage对应代码中的哪一部分,这部分代码中肯定会有一个shuffle类算子。精准推算stage与代码的对应关系,需要对Spar

7、k的源码有深入的理解,这里我们可以介绍一个相对简单实用的推算方法:只要看到Spark代码中出现了一个shuffle类算子或者是SparkSQL的SQL语句中出现了会导致shuffle的语句(比如groupby语句),那么就可以判定,以那个地方为界限划分出了前后两个stage。    这里我们就以Spark最基础的入门程序——单词计数来举例,如何用最简单的方法大致推算出一个stage对应的代码。如下示例,在整个代码中,只有一个reduceByKey是会发生shuffle的算子,因此就可以认为,以这个算子为界限,会划分出前

8、后两个stage。·stage0,主要是执行从textFile到map操作,以及执行shufflewrite操作。shufflewrite操作,我们可以简单理解为对pairsRDD中的数据进行分区操作,每个task处理的数据中,相同的key会写入同一个磁盘文件内。·stage1,主要是执行从reduceByKey到collect操

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。