在分布式系统中分发执行代码并启动执行,这样的计算方式必然不会很快,即使在一个规模不太大的数据集上进行一次简单计算,MapReduce 也可能需要几分钟,Spark 快一点,也至少需要数秒的时间。而互联网产品处理用户请求,需要毫秒级的响应,也就是说,要在 1 秒内完成计算,因此大数据计算必然不能实现这样的响应要求。但是互联网应用又需要使用大数据,实现统计分析、数据挖掘、关联推荐、用户画像等一系列功能。
那么如何才能弥补这互联网和大数据系统之间的差异呢?解决方案就是将面向用户的互联网产品和后台的大数据系统整合起来,也就是构建一个大数据平台
大数据平台
大数据平台,顾名思义就是整合网站应用和大数据系统之间的差异,将应用程序产生的数据导入到大数据系统,经过处理计算后再导出给应用程序使用。
下图是一个典型的互联网大数据平台的架构。
大数据平台由上到下,可分为三个部分:数据采集、数据处理、数据输出与展示。
数据采集
将应用程序产生的数据和日志等同步到大数据系统中,由于数据源不同,这里的数据同步系统实际上是多个相关系统的组合。数据库同步通常用 Sqoop,日志同步可以选择 Flume,打点采集的数据经过格式化转换后通过 Kafka 等消息队列进行传递。
不同的数据源产生的数据质量可能差别很大,数据库中的数据也许可以直接导入大数据系统就可以使用了,而日志和爬虫产生的数据就需要进行大量的清洗、转化处理才能有效使用。
数据处理
这部分是大数据存储与计算的核心,数据同步系统导入的数据存储在 HDFS。MapReduce、Hive、Spark 等计算任务读取 HDFS 上的数据进行计算,再将计算结果写入 HDFS。MapReduce、Hive、Spark 等进行的计算处理被称作是离线计算,HDFS 存储的数据被称为离线数据。
在大数据系统上进行的离线计算通常针对(某一方面的)全体数据,比如针对历史上所有订单进行商品的关联性挖掘,这时候数据规模非常大,需要较长的运行时间,这类计算就是离线计算。
除了离线计算,还有一些场景,数据规模也比较大,但是要求处理的时间却比较短。比如淘宝要统计每秒产生的订单数,以便进行监控和宣传。这种场景被称为大数据流式计算,通常用 Storm、Spark Steaming 等流式大数据引擎来完成,可以在秒级甚至毫秒级时间内完成计算。
数据输出与展示
大数据计算产生的数据还是写入到 HDFS 中,但应用程序不可能到 HDFS 中读取数据,所以必须要将 HDFS 中的数据导出到数据库中。数据同步导出相对比较容易,计算产生的数据都比较规范,稍作处理就可以用 Sqoop 之类的系统导出到数据库。
这时,应用程序就可以直接访问数据库中的数据,实时展示给用户,比如展示给用户关联推荐的商品。淘宝卖家的量子魔方之类的产品,其数据都来自大数据计算产生。
除了给用户访问提供数据,大数据还需要给运营和决策层提供各种统计报告,这些数据也写入数据库,被相应的后台系统访问。很多运营和管理人员,每天一上班,就是登录后台数据系统,查看前一天的数据报表,看业务是否正常。如果数据正常甚至上升,就可以稍微轻松一点;如果数据下跌,焦躁而忙碌的一天马上就要开始了。
任务调度管理系统
将上面三个部分整合起来的是任务调度管理系统,不同的数据何时开始同步,各种 MapReduce、Spark 任务如何合理调度才能使资源利用最合理、等待的时间又不至于太久,同时临时的重要任务还能够尽快执行,这些都需要任务调度管理系统来完成。有时候,对分析师和工程师开放的作业提交、进度跟踪、数据查看等功能也集成在这个任务调度管理系统中。
简单的大数据平台任务调度管理系统其实就是一个类似 Crontab 的定时任务系统,按预设时间启动不同的大数据作业脚本。
复杂的大数据平台任务调度还要考虑不同作业之间的依赖关系,根据依赖关系的 DAG 图进行作业调度,形成一种类似工作流的调度方式。对于每个公司的大数据团队,最核心开发、维护的也就是这个系统,大数据平台上的其他系统一般都有成熟的开源软件可以选择,但是作业调度管理会涉及很多个性化的需求,通常需要团队自己开发。开源的大数据调度系统有 Oozie,也可以在此基础进行扩展。
Lambda 架构
是构建大数据平台的一种常规架构原型方案。Lambda 架构原型请看下面的图。
- 数据(new data)同时写入到批处理大数据层(batch layer)和流处理大数据层(speed layer)。
- 批处理大数据层是数据主要存储与计算的地方,所有的数据最终都会存储到批处理大数据层,并在这里被定期计算处理。
- 批处理大数据层的计算结果输出到服务层(serving layer),供应用使用者查询访问。
- 由于批处理的计算速度比较慢,数据只能被定期处理计算(比如每天),因此延迟也比较长(只能查询到截止前一天的数据,即数据输出需要 T+1)。所以对于实时性要求比较高的查询,会交给流处理大数据层(speed layer),在这里进行即时计算,快速得到结果。
- 流处理计算速度快,但是得到的只是最近一段时间的数据计算结果(比如当天的);批处理会有延迟,但是有全部的数据计算结果。所以查询访问会将批处理计算的结果和流处理计算的结果合并起来,作为最终的数据视图呈现。
小结
大数据平台听起来高大上,事实上它充当的是一个粘合剂的作用,将互联网线上产生的数据和大数据产品打通,它的主要组成就是数据导入、作业调度、数据导出三个部分,因此开发一个大数据平台的技术难度并不高。
思考题
如果你所在的公司安排你去领导开发公司的大数据平台,你该如何开展工作?建议从资源申请、团队组织、跨部门协调、架构设计、开发进度、推广实施多个维度思考。
该笔记摘录自极客时间课程
《从0开始学大数据》