《从0开始学大数据》之Spark性能优化案例

基于软件性能优化原则和 Spark 的特点,Spark 性能优化可以分解为下面几步。

  1. 性能测试,观察 Spark 性能特性和资源(CPU、Memory、Disk、Net)利用情况。
  2. 分析、寻找资源瓶颈。
  3. 分析系统架构、代码,发现资源利用关键所在,思考优化策略。
  4. 代码、架构、基础设施调优,优化、平衡资源利用。
  5. 性能测试,观察系统性能特性,是否达到优化目的,以及寻找下一个瓶颈点。

案例 1:Spark 任务文件初始化调优

同一台服务器上的多个 Executor 进程不必每个都通过网络下载应用程序,只需要一个进程下载到本地后,其他进程将这个文件 copy 到自己的工作路径就可以了。

案例 2:Spark 任务调度优化

避免任务在每个worker服务器上分配不均匀。

案例 3:Spark 应用配置优化

看案例 2 的几张 CPU 利用率的图,我们还发现所有 4 个 Worker 服务器的 CPU 利用率最大只能达到 60% 多一点。例如下图,绿色部分就是 CPU 空闲。
极客时间《从0开始学大数据》
这种资源利用瓶颈的分析无需分析 Spark 日志和源代码,根据 Spark 的工作原理,稍加思考就可以发现,当时使用的这些服务器的 CPU 的核心数是 48 核,而应用配置的最大 Executor 数目是 120,每台服务器 30 个任务,虽然 30 个任务在每个 CPU 核上都 100% 运行,但是总的 CPU 使用率仍只有 60% 多。具体优化也很简单,设置应用启动参数的 Executor 数为 48×4=192 即可。

案例 4:操作系统配置优化

在性能测试过程中发现,当使用不同服务器的时候,CPU 资源利用情况也不同,某些服务器的 CPU 处于 sys 态,即系统态运行的占比非常高,如下图所示。
极客时间《从0开始学大数据》
图中紫色为 CPU 处于 sys 态,某些时候 sys 态占了 CPU 总使用率的近 80%,这个比例显然是不合理的,表示虽然 CPU 很忙,但是没有执行用户计算,而是在执行操作系统的计算。

那么,操作系统究竟在忙什么,占用了这么多 CPU 时间?通过跟踪 Linux 内核执行指令,发现这些 sys 态的执行指令和 Linux 的配置参数 transparent huge pages 有关。当

transparent huge pages 打开的时候,sys 态 CPU 消耗就会增加,而不同 Linux 版本的 transparent huge pages 默认是否打开是不同的,对于默认打开 transparent huge pages 的 Linux 执行下面的指令,关闭 transparent huge pages。

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/ transparent_hugepage/defrag

关闭以后,对比前面的 CPU 消耗,sys 占比明显下降,总的应用耗时也有明显下降。

案例 5:硬件优化

分析网卡的资源消耗,发现网络通信是性能的瓶颈,对整个应用的影响非常明显。比如在第二个、第三个 job,网络通信消耗长达 50 秒的时间,网络读写通信都达到了网卡的最大吞吐能力,整个集群都在等待网络传输。
极客时间《从0开始学大数据》
我们知道千兆网卡的最大传输速率是每秒 125MB,这样的速率和 CPU 内存固然没法比,而虽然比单个磁盘快一些,但是服务器磁盘是 8 块磁盘组成的阵列,总的磁盘吞吐量依然碾压千兆网卡,因此网卡传输速率的瓶颈就成为整个系统的性能瓶颈。

而优化手段其实很简单粗暴,就是升级网卡使用万兆网卡。
极客时间《从0开始学大数据》
硬件优化的效果非常明显,以前需要 50 多秒的网络通信时间,缩短为 10 秒左右。从性能曲线上看,网络通信在刚刚触及网卡最大传输速率的时候,就完成了传输,总的计算时间缩短了近 100 秒。

小结

一般说来,大数据软件性能优化会涉及硬件、操作系统、大数据产品及其配置、应用程序开发和部署几个方面。当性能不能满足需求的时候,先看看各项性能指标是否合理,如果资源没有全面利用,那么可能是配置不合理或者大数据应用程序(包括 SQL 语句)需要优化;如果某项资源利用已经达到极限,那么就要具体来分析,是集群资源不足,需要增加新的硬件服务器,还是需要对某项硬件、操作系统或是 JVM,甚至是对大数据产品源代码进行调优。

思考题

关于目前的主要大数据产品,你在学习、使用过程中,从 SQL 写法、应用编程、参数配置,到大数据产品自身的架构原理与源码实现,你有没有发现有哪些可以进行性能优化的地方?

来自极客时间的精选留言

大神1

我们公司集群作业最多的就是SQL作业约占80%,不管是hive SQL还是spark SQL,presto的SQL引擎都不是完美的,执行任务都有可能卡住99%就不动了。优化业务逻辑,SQL的写法是关键,减少重复计算,共用中间结果,还要有分区表的感念。

大神2

在第二个案例中说到,先注册的Executor可能会认领全部的任务,也就是说其所在的物理机会把那个stage的全部工作都做了吗?但是本着“移动计算比移动数据更划算的理论”,如果所有的任务都在一台机器上做岂不是会导致数据的移动?不知道我的理解有没有错哈
作者回复: 是的,数据会有更多移动

该笔记摘录自极客时间课程
《从0开始学大数据》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. 采用随机分区:通过将数据随机分布到不同的分区中,可以避免数据倾斜的问题。 2. 采用哈希分区:通过将数据按照哈希函数的结果分配到不同的分区中,可以有效地解决数据倾斜的问题。 3. 采用聚合操作:通过对数据进行聚合操作,可以将数据分散到不同的分区中,从而避免数据倾斜的问题。 4. 采用重分区:通过将数据重新分区,可以使数据更加均匀地分布到不同的分区中,从而避免数据倾斜的问题。 5. 采用广播变量:通过将小数据集广播到所有的节点上,可以避免数据倾斜的问题。 6. 采用随机抽样:通过对数据进行随机抽样,可以避免数据倾斜的问题。 7. 采用数据倾斜检测:通过对数据进行倾斜检测,可以及时发现数据倾斜的问题,并采取相应的措施进行优化。 ### 回答2: Spark是当前最为热门的数据处理框架之一,但是随着数据量的增大,数据倾斜问题也随之出现,影响了Spark的性能。数据倾斜指的是某些数据片段比其他数据片段要大很多,从而导致Spark中的任务无法平衡地处理这些数据片段,导致一些节点的处理时间变长,性能下降。 解决Spark数据倾斜可以通过以下n种姿势: 1. 使用repartition操作:通过对数据重新分片来平衡数据倾斜。可以通过设置合适的分片数来避免数据倾斜问题,并提高Spark的性能。 2. 使用broadcast操作:可以减少数据的传输量并减轻网络负载,从而提高Spark的性能。同时,也可以通过对不平衡的数据进行broadcast操作来减少数据倾斜。 3. 使用map-side join操作:对于数据量较小的表,可使用Map-side join将这些小表广播到所有的节点上进行join操作,从而减少join操作中的数据倾斜。 4. 使用groupByKey和reduceByKey操作时,避免出现大量相同的键:在键的数量很大的情况下,可把数据划分为多个小表。同样,在使用groupByKey和reduceByKey操作时,应该尽量避免相同的键出现,从而减少数据倾斜。 5. 使用自定义分区操作:在对数据进行分区时,可以定义自己的分区方式,根据不同的分区策略来分配数据。从而避免数据倾斜问题的出现。 总之,解决Spark数据倾斜问题需要综合考虑多种解决方案,需要在具体的业务场景下进行分析和选择合适的解决方案。同时,也需要了解Spark基础知识,熟练使用相关API和工具,才能解决数据倾斜问题,并提高Spark的处理性能。 ### 回答3: Apache Spark作为一种通用的大数据处理框架,性能一直是其关注的重点。其中,数据倾斜(data skew)是影响Spark性能和可靠性的一大问题,它会导致某些节点的处理任务时间过长,影响整个作业的完成时间。 针对Spark数据倾斜问题,可以采取以下n种解决方法: 1. 均衡数据:将数据划分为更小、更均衡的数据块,提高数据分配的粒度,尽量减少数据分发时的数据倾斜。通过使用Spark默认的哈希分区方式,将数据均匀分配到各个节点上。 2. 重分区:在数据倾斜的情况下,可以通过采用重分区的方式,进一步将数据细分为更多分区,以期达到更好的负载均衡效果。使用repartition或coalesce方法,将数据按照需要的分区数进行调整。 3. 增加并行度:Spark的并行度是关键的性能指标之一,可以适当增加并行度来提高作业的处理效率。通过对Spark的配置参数进行调整,如调整spark.default.parallelism参数,增加RDD的分区数量,从而提高Spark并行处理的能力。 4. 聚合操作:数据倾斜可能是由于聚合操作出现了极值,导致操作的瓶颈出现在某一个分区,可以使用更复杂的聚合操作,如扩散聚合(broadcast join)和累加器(aggregators)等来避免数据倾斜。 5. 分桶:Spark SQL提供的分桶操作可以在数据分析过程中更好地利用Spark的并行处理。将数据分成多个桶(bucket)存储,在执行聚合计算时,可以通过对每个桶中的数据单独执行计算操作,从而有效避免数据倾斜的问题。 总的来说,解决Spark数据倾斜问题需要同时考虑数据本身的特点,调整Spark的配置参数和操作方式等多个方面。只有综合考虑到多个因素,才能有效地提高Spark大数据处理的效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值