以互联网行业为例(谈谈如何构建企业数据平台)

qinzhiqiang 07-15 18:23 830次浏览

以互联网行业为例(谈谈如何构建企业数据平台)

从事数据开发工作十多年,经历过银行、电商行业数据开发及系统建设。对数据仓库/ODS/大数据平台架构等数据类系统有一定的经验积累。准备将这么多年来的一些经验整理成文,一来为自己工作做个总结梳理,二来也希望能和大家互相讨论,共同学习,探讨新技术、新架构以及趋势。欢迎大家关注!

最近在给公司规划新一轮的大数据平台架构,距离上次这么系统做架构工作也有2、3年。时间上关于平台架构的好内容少之又少,所以一直想整理这块内容。既然是漫谈,就想起什么说什么吧。这几年一直在互联网行业,就以互联网行业来说。

文章目录:

  • 整体架构
  • 数据采集
  • 数据存储与分析
  • 数据共享
  • 数据应用
  • 机器学习
  • Ad-Hoc查询
  • 离线计算
  • 实时计算
  • 数据可视化
  • 任务调度与监控

互联网发展了好多年,数据平台也已经相当成熟了。数据仓库以及数据平台在这个行业的应用价值我总结了这样几点:

  • 整合公司所有业务数据,建立统一的数据中心;
  • 提供各种数据报表,有给管理层用于数据监控的,也有给各个业务支撑业务的;
  • 为经营及管理服务,增效降本。比如分析各部门的人力及产出情况,来提升单位时间的产值增效
  • 为产品/网站运营提供运营数据支持。简单来讲就是通过数据让运营及时了解产品/网站的运营效果;
  • 为各个业务提供数据支持,成为公司统一的数据交换与提供平台;
  • 分析用户行为数据,比如数据挖掘来降低投入成本,提高投入效果;比如广告定向精准投放、用户个性化推荐等;
  • 开发数据产品,直接或间接为公司盈利;
  • 建设开放数据平台,开放公司数据;
  • ……

上面列出的内容看上去和传统行业数据仓库用途差不多,并且都要求数据仓库/数据平台有很好的稳定性、可靠性。但在互联网行业包括目前银行保险零售等以C端客户服务为主导的行业,除了数据量大之外,越来越多的业务要求时效性,甚至很多是要求实时的 。互联网行业的业务变化非常快,不可能像传统行业一样,可以使用自顶向下的方法建立数据仓库,一劳永逸,它要求新的业务很快能融入数据仓库中来,老的下线的业务,能很方便的从现有的数据仓库中下线。

其实,互联网行业的数据仓库就是所谓的敏捷数据仓库,不但要求能快速的响应数据,也要求能快速的响应业务。

建设敏捷数据仓库,除了对架构技术上的要求之外,还有一个很重要的方面,就是数据建模,如果一上来就想着建立一套能兼容所有数据和业务的数据模型,那就又回到传统数据仓库的建设上了,很难满足对业务变化的快速响应。应对这种情况,一般是先将核心的持久化的业务进行深度建模。比如基于网站日志建立的网站统计分析模型和用户浏览轨迹模型;基于公司核心用户数据建立的用户模型。其它的业务一般都采用维度+宽表的方式来建立数据模型。——这块是后话。

整体架构

下面的图是我目前规划的数据平台架构图,其实大多公司应该都差不多:

以互联网行业为例,谈谈如何构建企业数据平台、仓库?

逻辑上,一般都有数据采集层、数据存储层,数据分析层、数据共享层、数据应用层。可能叫法有所不同,大家看图都能理解,本质上的角色都大同小异。

数据采集

数据采集层的任务就是把数据从各种数据源中采集和存储到数据存储上,在这个过程中可能会做一些简单的清洗。

对于关系型数据库以及部分NOSQL(Redis、MongoDB)中的数据,仍然使用DataHub按天、按小时,增量抽取到HDFS,映射到Hive表。对于日志数据,使用Flume从日志收集服务器实时抽取到Kafka,再使用Flume,从Kafka抽取到HDFS,映射到Hive表。

以互联网行业为例,谈谈如何构建企业数据平台、仓库?

数据源的种类比较多:

① 网站日志:

互联网行业网站日志占的份额最大。网站日志存储在多台网站日志服务器上,一般是在每台网站日志服务器上部署flume agent,实时的收集网站日志并存储到HDFS上。

② 业务数据库:

业务数据库的种类也是多种多样,有Mysql、Oracle、SqlServer等,这时候,我们迫切的需要一种能从各种数据库中将数据同步到HDFS上的工具,Sqoop是一种,但是Sqoop太过繁重,而且不管数据量大小,都需要启动MapReduce来执行,而且需要Hadoop集群的每台机器都能访问业务数据库。应对此场景,淘宝开源的DataX是一个很好的解决方案,它是一个在异构的数据库/文件系统之间高速交换数据的工具,能够在任意的数据处理系统(RDBMS/Hdfs/Local filesystem)之间进行数据交换。有资源的话,对于复杂需求甚至可以基于DataX之上做二次开发,我们目前使用的DataHub也是。

当然,也有人会说,Flume通过配置与开发,也可以实时的从数据库中同步数据到HDFS。

③ 来自于Ftp/Http的数据源:

这个针对的是一些合作伙伴提供的数据,需要通过Ftp/Http等定时获取,DataX也可以满足该需求。

④ 其他数据源:

比如一些手工录入的数据,可能是Excel、csv等。如果是单一的数据,只需要提供一个接口或小程序,即可完成。但如果是额外新增的业务需求,这种情况我们一般是通过前端报表工具fienreport(后面会将)来采集业务流程上的数据,进入业务系统/数据库,在做抽取。

数据存储和分析

毋庸置疑,HDFS是大数据环境下数据仓库/数据平台最完美的数据存储解决方案。

离线数据分析与计算,也就是对实时性要求不高的部分,在我看来,Hive还是首当其冲的选择,丰富的数据类型、内置函数;压缩比非常高的ORC文件存储格式;非常方便的SQL支持,使得Hive在基于结构化数据上的统计分析远远比MapReduce要高效的多,一句SQL可以完成的需求,开发MR可能需要上百行代码;

当然,使用Hadoop框架自然而然也提供了MapReduce接口,如果真的很乐意开发Java,或者对SQL不熟,那么也可以使用MapReduce来做分析与计算;

Spark是这几年非常火的,经过实践,它的性能的确比MapReduce要好很多,而且和Hive、Yarn结合的越来越好,因此,必须支持使用Spark和SparkSQL来做分析和计算。因为已经有Hadoop Yarn,使用Spark其实是非常容易的,不用单独部署Spark集群。

数据共享

这里的数据共享,其实指的是前面数据分析与计算后的结果存放的地方,其实就是关系型数据库和NOSQL数据库。前面使用Hive、MR、Spark、SparkSQL分析和计算的结果,还是在HDFS上,但大多业务和应用不可能直接从HDFS上获取数据,那么就需要一个数据共享的地方,使得各业务和产品能方便的获取数据。和数据采集层到HDFS刚好相反,这里需要一个从HDFS将数据同步至其他目标数据源的工具,同样,DataX也可以满足。

另外,一些实时计算的结果数据可能由实时计算模块直接写入数据共享。

数据应用

业务系统

业务产品所使用的数据,比如ERP、OA,已经存在于数据共享层,他们直接从数据共享层访问即可;

报表

报表所使用的数据,一般也是已经统计汇总好的,存放于数据共享层,然后我们会用finereport做统一报表开发。

以互联网行业为例,谈谈如何构建企业数据平台、仓库?

即席查询&OLAP

即席查询的用户有很多,有可能是数据开发人员、网站和产品运营人员、数据分析人员、甚至是部门老大,他们都有即席查询数据的需求;

这种即席查询通常是现有的报表和数据共享层的数据并不能满足他们的需求,需要从数据存储层直接查询。

即席查询一般是通过SQL完成,最大的难度在于响应速度上,使用Hive有点慢,目前我的解决方案是用Kylin作为OLAP引擎,数据开发人员在Hive数据仓库中设计好事实表,维度表,在Kylin中设计好Cube,每天将数据由Hive加载到Kylin,数据分析、产品运营通过Kylin来完成90%以上的数据分析需求,对于一些特别复杂和定制的需求,才会提临时需求给数据开发。

另外,使用Caravel经过简单的二次开发,作为OLAP的前端,用户不用写SQL,即可完成数据多维分析与可视化。

当然,上面几块应用也可以用一些现成的BI来解决,但是性能和稳定性上,目前我们还没找到合适的产品。

其它数据接口

这种接口有通用的,有定制的。比如:一个从Redis中获取用户属性的接口是通用的,所有的业务都可以调用这个接口来获取用户属性。

机器学习

目前只使用了Spark MLlib提供的机器学习算法,完成了文本分类的需求。其他还暂未涉及

Ad-Hoc查询

在Hive的基础上,也提供了SparkSQL的方式,主要是给数据开发以及懂SQL的数据分析和运营提供更快的Ad-Hoc查询响应。

离线计算

离线计算80%以上使用Hive,部分新业务使用SparkSQL,很少一部分老的业务仍然使用MR;

离线计算的结果,根据业务用途不同,分别保存在Hive、Redis以及业务关系型数据库中;

实时计算

以互联网行业为例,谈谈如何构建企业数据平台、仓库?

现在业务对数据仓库实时性的需求越来越多,比如:实时的了解网站的整体流量;实时的获取一个广告的曝光和点击;在海量数据下,依靠传统数据库和传统实现方法基本完成不了,需要的是一种分布式的、高吞吐量的、延时低的、高可靠的实时计算框架;Storm在这块是比较成熟了,但我选择Spark Streaming,原因很简单,不想多引入一个框架到平台中,另外,Spark Streaming比Storm延时性高那么一点点,那对于我们的需要可以忽略。

我们目前使用Spark Streaming以及部分Java程序消费Kafka中收集的日志数据,实时计算结果大多保存在Redis中。实现了实时的网站流量统计、实时的广告效果统计两块功能。

做法也很简单,由Flume在前端日志服务器上收集网站日志和广告日志,实时的发送给Spark Streaming,由Spark Streaming完成统计,将数据存储至Redis,业务通过访问Redis实时获取。

数据可视化

基于Caravel做了二次开发,提供近20种数据可视化图表。底层基于DataHub、Kylin,用户还可以自助数据接入、自助建模、自助分析与可视化。也尝试过用现成的商业BI,但是一些复杂需求无法实现,定制成本太大,再加上性能不稳定放弃了。

以互联网行业为例,谈谈如何构建企业数据平台、仓库?

任务调度与监控

在数据仓库/数据平台中,有各种各样非常多的程序和任务,比如:数据采集任务、数据同步任务、数据分析任务等。这些任务除了定时调度,还存在非常复杂的任务依赖关系,比如:数据分析任务必须等相应的数据采集任务完成后才能开始;数据同步任务需要等数据分析任务完成后才能开始。

这就需要一个非常完善的任务调度与监控系统,它作为数据仓库/数据平台的中枢,负责调度和监控所有任务的分配与运行。关于大数据平台的任务调度与监控系统,可以说上一万字,后面我会找机会再写,欢迎关注。

以互联网行业为例,谈谈如何构建企业数据平台、仓库?

最后

在我看来,架构并不是技术越多越新越好,而是在可以满足需求的情况下,越简单越稳定越好。

目前在我们的数据平台开发更多的是关注业务,而不是技术。技术的价值最终还是要通过业务来体现。他们把业务和需求搞清楚了,基本上只需要做简单的SQL开发,然后配置到调度系统就可以了,如果任务异常,会收到告警。这样,可以使更多的资源专注于业务之上。