《从0开始学大数据》之性能优化介绍

背景

我们知道,现在最主流的大数据技术几乎都是开源的产品,不管是 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 后缀的邮箱。

软件性能优化

在熟悉开源社区的运作方式后,接下来我们就可以考虑开始进行性能优化了。但在上手之前,你是否清楚所谓性能优化具体要做些什么呢?

关于软件性能优化,有个著名的论断。

  1. 你不能优化一个没有经过性能测试的软件。
  2. 你不能优化一个你不了解其架构设计的软件。

软件的主要性能指标

  • 响应时间:完成一次任务(请求)花费的时间。
  • 并发数:同时处理的任务数(请求数)。
  • 吞吐量:单位时间完成的任务数(请求数、事务数、查询数……)。
  • 性能计数器:System Load,线程数,进程数,CPU、内存、磁盘、网络使用率等。

性能优化的一般过程

  1. 做性能测试,分析性能状况和瓶颈点。
  2. 针对软件架构设计进行分析,寻找导致性能问题的原因。
  3. 修改相关代码和架构,进行性能优化。
  4. 做性能测试,对比是否提升性能,并寻找下一个性能瓶颈。

大数据软件性能优化

在大数据使用、开发过程的性能优化一般可以从以下角度着手进行。

  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 这些产品的代码。修改源代码进行性能优化的方法虽然比较激进,但是对于掌控自己公司的大数据平台来说,效果可能是最好的。

思考题

如果性能测试发现,网卡是整个系统的瓶颈,程序运行过程中网卡达到了最大 I/O 能力,整个系统经常在等待网卡的数据传输,请问,你有什么性能优化建议呢?

来自极客时间的精选留言

大神1

确定问题细节原因,针对主要问题进行解决
1.如是网卡接入能力不够,则需要更换网卡或增加网卡
2.如是网卡–应用之间的io瓶颈,则需要考虑零拷贝减少copy释放性能,使用大页内存减少页表miss,使用专门核心做收包缓存到软队列等

大神2

1.批量发送数据
2.压缩传输数据
3.增加带宽

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

你可能感兴趣的:(大数据,极客时间学习,大数据,性能优化)