Spark性能优化案例

别裁伪体亲风雅,转益多师是汝师。这篇文章主要讲述Spark性能优化案例相关的知识,希望能为你提供帮助。
主流大数据技术都是开源的:

  • Hadoop大数据存储与计算产品
  • Hive、Spark SQL大数据仓库
  • Storm、Flink这样的大数据流计算产品
  • Mahout、MLlib大数据机器学习算法库
如何参与Apache软件开发,如何进行软件性能优化及Spark源码优化:
  • 更深入、系统地了解软件性能优化
  • 更深入了解Spark的一些运行机制,同时也可以了解Apache开源社区的运作模式。因为我们在使用各类大数据产品的时候,一定会遇到各种问题,想要解决这些问题,你可以直接到官方的开源社区去求助并寻找答案。在使用过程中,如果这些大数据产品不能满足你的需求,你可以阅读源代码并直接对源代码进行修改和优化。因为你在实践过程中产生的需求可能其他人也会有,你可以将你修改的源代码提交到开源社区,请求合并到发布版本上,供全世界开发者使用。
Apache开源社区的组织和参与方式Apache是一个以基金会方式运作的非盈利开源软件组织,旗下有超过一百个各类开源软件,如Apache、Tomcat、Kafka、Hadoop、Spark。
Apache每个项目的管理团队叫项目管理委员会(PMC),一般由项目发起者、核心开发者、Apache基金会指定的资深导师组成,主导整个项目发展。项目主要开发者叫committer,是指有将代码合并到主干代码权限的开发者,而其他没有代码合并权限的开发者叫作contributor。
一般参与Apache开源产品开发,先从contributor做起。从GitHub项目仓库fork代码到自己的仓库,在自己仓库修改代码然后创建pull request,提交到Spark仓库后,若有committer认为没问题,就merge到Spark主干代码。
一旦你为某个Apache项目提交的代码被merge到代码主干,你就可以宣称自己是这个项目的contributor了,写入自己的简历!如果能持续提交高质量的代码,甚至直接负责某个模块,你就有可能被邀请成为committer,拥有apache.org后缀邮箱。
希望你提交的是质量代码,而不仅是对代码注释里某个单词拼写错误修改。虽然修改注释也有价值,但你的pull request总是修改注释的拼写错误,很难被认为是强力开发者。
软件性能优化熟悉开源社区的运作方式后,开始考虑开始进行性能优化了。性能优化具体要做些什么呢?有个著名论断。
1.你不能优化一个没有经过性能测试的软件
2.你不能优化一个你不了解其架构设计的软件
若无性能测试,你就不会知道当前软件主要性能指标。通常来说,软件的主要性能指标包括:
  • 响应时间:完成一次任务(请求)花费的时间。
  • 并发数:同时处理的任务数(请求数)。
  • 吞吐量:单位时间完成的任务数(请求数、事务数、查询数……)。
  • 性能计数器:System Load,线程数,进程数,CPU、内存、磁盘、网络使用率等。
如果没有性能指标,我们也就不清楚软件性能的瓶颈,优化前和优化后也是无从对比。这样的优化工作只能是主观臆断:别人这样做说性能好,我们也这样优化。
而如果不了解软件的架构设计,你可能根本无从判断性能瓶颈产生的根源,也不知道该从哪里优化。
性能优化的过程
  • 做性能测试,分析性能状况和瓶颈点
  • 针对软件架构设计进行分析,寻找导致性能问题的原因
  • 修改相关代码和架构,进行性能优化
  • 做性能测试,对比是否提升性能,并寻找下一个性能瓶颈
大数据软件性能优化在大数据使用、开发过程的性能优化一般可以从以下角度着手进行。
1. SQL语句优化。使用关系数据库的时候,SQL优化是数据库优化的重要手段,因为实现同样功能但是不同的SQL写法可能带来的性能差距是数量级的。我们知道在大数据分析时,由于数据量规模巨大,所以SQL语句写法引起的性能差距就更加巨大。典型的就是Hive的MapJoin语法,如果join的一张表比较小,比如只有几MB,那么就可以用MapJoin进行连接,Hive会将这张小表当作Cache数据全部加载到所有的Map任务中,在Map阶段完成join操作,无需shuffle。
2. 数据倾斜处理。数据倾斜是指当两张表进行join的时候,其中一张表join的某个字段值对应的数据行数特别多,那么在shuffle的时候,这个字段值(Key)对应的所有记录都会被partition到同一个Reduce任务,导致这个任务长时间无法完成。淘宝的产品经理曾经讲过一个案例,他想把用户日志和用户表通过用户ID进行join,但是日志表有几亿条记录的用户ID是null,Hive把null当作一个字段值shuffle到同一个Reduce,结果这个Reduce跑了两天也没跑完,SQL当然也执行不完。像这种情况的数据倾斜,因为null字段没有意义,所以可以在where条件里加一个userID != null过滤掉就可以了。
3. MapReduce、Spark代码优化。了解MapReduce和Spark的工作原理,了解要处理的数据的特点,了解要计算的目标,设计合理的代码处理逻辑,使用良好的编程方法开发大数据应用,是大数据应用性能优化的重要手段,也大数据开发工程师的重要职责。
4. 配置参数优化。根据公司数据特点,为部署的大数据产品以及运行的作业选择合适的配置参数,是公司大数据平台性能优化最主要的手段,也是大数据运维工程师的主要职责。比如Yarn的每个Container包含的CPU个数和内存数目、HDFS数据块的大小和复制数等,每个大数据产品都有很多配置参数,这些参数会对大数据运行时的性能产生重要影响。
5. 大数据开源软件代码优化。曾经和杭州某个SaaS公司的大数据工程师聊天,他们的大数据团队只有5、6个人,但是在使用开源大数据产品的时候,遇到问题都是直接修改Hadoop、Spark、Sqoop这些产品的代码。修改源代码进行性能优化的方法虽然比较激进,但是对于掌控自己公司的大数据平台来说,效果可能是最好的。


Spark性能优化性能测试,使用Intel为某视频网站编写的一个基于Spark的关系图谱计算程序,用于计算视频的级联关系。
使用5台服务器对样例数据进行性能测试,程序运行总体性能:
Spark性能优化案例

文章图片

将4台Worker服务器上主要计算资源利用率指标和这张图各个job与stage的时间点结合,就可以看到不同运行阶段的性能指标如何,从而发现性能瓶颈:
Spark性能优化案例

文章图片
Spark性能优化案例

文章图片
Spark性能优化案例

文章图片
Spark性能优化案例

文章图片

可见,CPU、内存、网络、磁盘这四种主要计算资源的使用和Spark的计算阶段密切相关。后面我主要通过这些图来分析Spark的性能问题,进而寻找问题根源,并进一步进行性能优化。
【Spark性能优化案例】


    推荐阅读