1. 数据采集
采集是指集中企业待分析的原始数据的过程,例如可能是包含但不限于以下:
- 企业服务器的日志;
- 企业各种信息系统的数据(CRM/ERP/数据库);
- 企业的网站/App/小程序等客户端的用户行为记录;
- 使用的第三方系统(客服、IM、HR)提供的API;
采集的方式基本上分为两种:
PUSH模式:企业的数据一般来讲都是散落在很多地方,各种系统或者各种服务器,所以有一个数据采集中心,然后在各个数据产生的位置都有一个agent(可以认为是采集程序)然后朝数据采集中心发送数据的过程就是PUSH,比如在App或者网站植入了SDK,定期发送采集到的用户行为数据到服务端的过程就是PUSH模式;
PULL模式:企业有数据采集中心,从采集中心去访问获取各个数据产生点的数据,这个过程就是PULL,比如从企业的数据中心去调用第三方系统的API获取数据,就是PULL模式。
2. 数据的清洗
数据清洗的过程是指对数据进行一些处理,过滤无用的信息,规范得到能用到的数据。包括但不限于以下情况:
- 过滤SPAM垃圾数据,例如被攻击/造假/BUG产生的大量数据
- 抽取有用字段,例如上传的数据包含的信息很多,只用到一小部分
- 原始数据有很多格式不规范,要统一格式
3.数据的加工
数据加工是指清洗后的数据,还需要补充一些信息,可能是通过数据库查询出来的,也可能是通过计算规则计算出来的,或者算法技术加工出来的新字段。
例如,数据里面有个ip地址,需要计算出用户的地理位置,那么地理位置就是加工出来的字段。一般来讲,对于大多数大数据分析平台而言,加工是很重要的过程,基本上最后可用来进行分析的数据,要通过这一步充分完成加工计算。
4. 数据加载
数据加载是指把加工后的数据加载到合适的存储,可能是Hadoop集群的HDFS上,也可能是某个数据库,有可能是文件等等其他存储类型。
5. 建模分析
建模分析是指在查询前需要把数据进行处理,以优化查询,例如以下:
- 数据仓库建好了仓库模型,要把数据加载到数据仓库中
- 需要做数据索引,把数据进行索引优化
数据模型很重要,是整个数据处理分析的核心之一。每个企业都有自己的核心业务,以及核心目标,并且也有各自的数据源以及数据类型,所以也就意味着每一家企业的数据模型多少都会有些差异,也就是最个性化的一个地方,数据仓库就是这个数据模型的载体,一般来讲数据就是数据库技术,常见数据库之外,还有Infobright,Greenplum,Vertica,也有基于Hadoop技术的,用HDFS作为基础的存储,然后使用的查询引擎,包括Imapla,Presto,SparkSQL等等。
通常而言,数据团队要进行复杂的查询和分析,都是在此基础之上,通过SQL语言或者代码查询来实现的。
6. 可视化
可视化是最终分析结果要展示的过程,例如“双十一”酷炫的图表,一般企业都有自己的数据看板等等。
可视化背后主要是执行SQL或者运行代码得到的数据结果,可能是一维,也可能是二维,还有可能是多维,然后选择合适的图表类型进行展示,例如“线状图”、“柱状图”、“饼状图”、“雷达图”、“中国地图”等等。
以上是通用的大数据平台整个数据处理的方式,接下来就从诸葛io与通用的数据平台的差异入手,然后带入诸葛io的技术设计。诸葛io的整套技术能够做到的是,对企业分析流程的效率提升。
自建或者第三方统计平台(百度统计/友盟/Talkingdata)+ 数据BI团队(早期团队人数很少,甚至是一两个工程师兼任);
自建或者第三方统计平台:大多都是汇总统计指标平台。对通用指标(例如PV、UV、DAU、留存)的计算,对企业设定好的业务行为(打车、订单、参与、金额)等汇总统计人数或者次数,数据平台存储的都是指标的汇总结果。指标的选择和下钻分析都需要数据团队的支撑。
如果有新的分析需求,已经建模好的,那么数据团队就需要根据业务去写SQL然后得到结果,如果没有建模好的,就需要开始采集原始数据,然后重新开始清洗,这样一个过程,往往都比较反复耗时,分析效率很低
主要原因是,这样一种分析流程,是由固定的业务指标驱动数据的采集和处理,然后数据处理的过程基本上都是多维汇总的统计和计算
所以也就造成了问题:各个业务部门的分析需求需要依赖数据团队专业的数据分析能力进行问题建模,并且依赖他们SQL语言或者代码能力完成分析目标。但数据部门往往也有核心的分析需求和任务,所以公司变大过程中很多问题变得很低效。
诸葛io的亮点如下:
诸葛io采用的是HTTPS加密传输,以及支持HTTP2协议:
采用HTTPS的原因是,防止数据在传输过程中被抓包截获;
采用HTTP2协议,服务端的处理性能能够极大的提升,连接也有优化。
使用LVS的原因是,虽然Nginx的性能很高,但是在高并发压力情况下,能够快速添加Nginx节点,再加上数据采集是异步,所以大流量情况下,LVS+Nginx基本上都能保证不会出现连接等待的情况了。
Lua是一种轻型的脚本语言,直接在nginx配置中嵌入,在很多游戏的服务端架构以及电商秒杀的架构中使用。服务端接收到上传数据之后,Lua会进行解析,并且添加上传时一些信息(ip,服务端时间,User-Agent)等等,然后push到Kafka的集群。
这套架构也是在诸葛io的日上传数据量逐步上涨过程中,逐步演化出来的。
简单来讲,数据采集具有高并发、高伸缩性性、HTTPS安全传输的特点。
-识别用户和设备的身份关系
-加工字段:地理位置、UTM推广信息、设备、系统版本(网站或者微站根据UA)
-事件行为匹配系统id
加工信息之后,还会对数据按照数据模型进行格式转化和预计算处理,得到所需要的最优于查询的数据。
关于数据清洗加工部分,和其他大数据技术还有一些差异:
-独立的用户行为跟踪;
-基于用户身份的数据整合;
-精准的用户和设备关系识别;
-事件的标签化;
接下来是数据加载。数据加载的过程,就是把数据处理后的结果写入存储,这里,诸葛io主要加载的目标位置有以下:
因为诸葛io同时支持SaaS和私有部署,私有部署采用的方案会有差异,S3和HDFS都是文件访问,所以业务层基本是一致,S3是因为存储成本低,HDFS是大多数企业的Hadoop平台。加工后的数据同上。
模型仓库,Redshift和Greenplum都是基于PostgreSQL的。加上自定义函数,在数据访问层保持一致。
然后在建模分析的过程,建模分析的核心是诸葛io的数据模型,也就是数据仓库设计,诸葛io现在的核心数据模型,分为以下主题:
用户:用户的属性信息;事件/行为(包含属性信息和触发环境);行为发生平台:平台(设备)的基础信息;
诸葛io的数据模型底层都已经对用户和行为进行建模,从上层指标的计算,可以直接下钻用户群体,并且对于用户的行为历史也有完整的还原和实时的洞察。
传统的数据分析平台都以设备进行统计,诸葛io是基于用户的,所以用户和设备的关系精准还原。
诸葛io的数据查询和访问:
数据访问层,是诸葛io把基于数据仓库的SQL查询访问抽象了一层服务,分为对内和对外两部分,用以控制对数据访问的统一管理。主要分为两部分:
对内是通过统一的API服务来进行访问
对外是有Open API的开放平台
Kafka具有多消费组的特点,也就意味着,可以在不同应用场景下对统一数据进行多种处理,并产生多种应用,例如下面场景:
收集到各种数据,并会添加到Kafka消息中心,然后会有以下不同消费应用。
实时计算中心,诸葛io用的是Spark Streaming进行处理,也有其他套件辅助进行一些数据挖掘,实时数据和关系缓存,诸葛io用的是Codis以及SSDB,Codis是分布式的Redis实现框架(由前豌豆荚团队开源)诸葛io会用来做分布式的消息以及状态存储,而SSDB是基于Redis协议的硬盘实现(作者是懒投资的CTO吴总)诸葛io会存储一些键值比较大或者多的数据,例如实时数据以及数据缓存。