背景
我们知道,现在最主流的大数据技术几乎都是开源的产品,不管是 Hadoop 这样的大数据存储与计算产品,还是 Hive、Spark SQL 这样的大数据仓库,又或者 Storm、Flink 这样的大数据流计算产品,还有 Mahout、MLlib 这样的大数据机器学习算法库,它们都来自开源社区。所以,我们在使用大数据、学习大数据的过程中肯定少不了要和开源社区打交道。
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 后缀的邮箱。
软件性能优化
在熟悉开源社区的运作方式后,接下来我们就可以考虑开始进行性能优化了。但在上手之前,你是否清楚所谓性能优化具体要做些什么呢?
关于软件性能优化,有个著名的论断。
- 你不能优化一个没有经过性能测试的软件。
- 你不能优化一个你不了解其架构设计的软件。
软件的主要性能指标
- 响应时间:完成一次任务(请求)花费的时间。
- 并发数:同时处理的任务数(请求数)。
- 吞吐量:单位时间完成的任务数(请求数、事务数、查询数……)。
- 性能计数器:System Load,线程数,进程数,CPU、内存、磁盘、网络使用率等。
性能优化的一般过程
- 做性能测试,分析性能状况和瓶颈点。
- 针对软件架构设计进行分析,寻找导致性能问题的原因。
- 修改相关代码和架构,进行性能优化。
- 做性能测试,对比是否提升性能,并寻找下一个性能瓶颈。
大数据软件性能优化
在大数据使用、开发过程的性能优化一般可以从以下角度着手进行。
- SQL 语句优化。使用关系数据库的时候,SQL 优化是数据库优化的重要手段,因为实现同样功能但是不同的 SQL 写法可能带来的性能差距是数量级的。我们知道在大数据分析时,由于数据量规模巨大,所以 SQL 语句写法引起的性能差距就更加巨大。典型的就是 Hive 的 MapJoin 语法,如果 join 的一张表比较小,比如只有几 MB,那么就可以用 MapJoin 进行连接,Hive 会将这张小表当作 Cache 数据全部加载到所有的 Map 任务中,在 Map 阶段完成 join 操作,无需 shuffle。
- 数据倾斜处理。数据倾斜是指当两张表进行 join 的时候,其中一张表 join 的某个字段值对应的数据行数特别多,那么在 shuffle 的时候,这个字段值(Key)对应的所有记录都会被 partition 到同一个 Reduce 任务,导致这个任务长时间无法完成。淘宝的产品经理曾经讲过一个案例,他想把用户日志和用户表通过用户 ID 进行 join,但是日志表有几亿条记录的用户 ID 是 null,Hive 把 null 当作一个字段值 shuffle 到同一个 Reduce,结果这个 Reduce 跑了两天也没跑完,SQL 当然也执行不完。像这种情况的数据倾斜,因为 null 字段没有意义,所以可以在 where 条件里加一个 userID != null 过滤掉就可以了。
- MapReduce、Spark 代码优化。了解 MapReduce 和 Spark 的工作原理,了解要处理的数据的特点,了解要计算的目标,设计合理的代码处理逻辑,使用良好的编程方法开发大数据应用,是大数据应用性能优化的重要手段,也是大数据开发工程师的重要职责。
- 配置参数优化。根据公司数据特点,为部署的大数据产品以及运行的作业选择合适的配置参数,是公司大数据平台性能优化最主要的手段,也是大数据运维工程师的主要职责。比如 Yarn 的每个 Container 包含的 CPU 个数和内存数目、HDFS 数据块的大小和复制数等,每个大数据产品都有很多配置参数,这些参数会对大数据运行时的性能产生重要影响。
- 大数据开源软件代码优化。曾经和杭州某个 SaaS 公司的大数据工程师聊天,他们的大数据团队只有 5、6 个人,但是在使用开源大数据产品的时候,遇到问题都是直接修改 Hadoop、Spark、Sqoop 这些产品的代码。修改源代码进行性能优化的方法虽然比较激进,但是对于掌控自己公司的大数据平台来说,效果可能是最好的。
思考题
如果性能测试发现,网卡是整个系统的瓶颈,程序运行过程中网卡达到了最大 I/O 能力,整个系统经常在等待网卡的数据传输,请问,你有什么性能优化建议呢?
来自极客时间的精选留言
大神1
确定问题细节原因,针对主要问题进行解决
1.如是网卡接入能力不够,则需要更换网卡或增加网卡
2.如是网卡–应用之间的io瓶颈,则需要考虑零拷贝减少copy释放性能,使用大页内存减少页表miss,使用专门核心做收包缓存到软队列等
大神2
1.批量发送数据
2.压缩传输数据
3.增加带宽
该笔记摘录自极客时间课程
《从0开始学大数据》