一 、总述
人类正在从IT时代走向DT时代。现在的数据呈爆炸式增长,其潜在的巨大价值有待发掘。但是如果不对数据进行有序、有结构的分类组织和存储,它将变成一场灾难。
在阿里内部,数据的存储达到EB级别。这些给数据采集、存储、计算都带来了极大的挑战。随着数阿里内部数据量的剧增,以及日益丰富的业态,这些都给大数据系统的构建提供了更复杂的要求。
本书介绍的阿里巴巴大数据系统架构,就是为了满足不断变化的业务需求,同时实现系统的高度扩展性、灵活性以及数据展现的高性能而设计的。
其系统机构大致包含六层。
数据采集层
阿里巴巴建立了一套标准的数据采集体系方案,致力于全面,高性能,规范的完成海量数据的采集,并将其传输到大数据平台。
其日志采集体系方案主要包括量大体系:
- Aplus.JS 是Web端日志采集技术方案
- UserTrack 是APP端日志采集技术方案。
数据计算层
从采集系统收集带大量原始数据,进入数据计算层中被进一步整合和计算。
阿里巴巴的数据计算层包含两大体系:
- 数据存储及计算云平台
- 数据整合及管理体系
数据服务层
数据被整合计算好后,需要提供给产品和应用进行数据消费。数据服务层对外提供数据服务主要是通过统一的数据服务平台(OneService)。OneService以数据仓库整合计算好的数据作为数据源,对外通过接口的方式提供数据服务。
数据应用层
阿里对数据的应用表现在各个方面,如搜索、推荐、广告等。商家、阿里内部 的搜索、推荐、广告、金融等平台,阿里内部的运营和管理人员都是数据应用方。
二、日志采集
浏览器的页面日志采集
浏览器的页面日志采集可以分为两大类:
- 页面浏览(展现日志采集)。
指当一个页面诶浏览器价值呈现时采集的日志。
目前阿里巴巴采用的页面浏览日志采集方案的大体流程如下:
- 客户端采集日志。由一小段被植入页面HTML文档的JavaScript脚本执行。
- 客户端发送日志。采集脚本执行时,会向日志服务器发起一个日志请求,将采集 到的数据发送到日志服务器。
- 服务器端日志收集。服务器收到日志后向浏览器回应请求成功响应。并将日志请求内容写入日志缓冲区。
- 服务器端日志解析存档。
- 页面交互日志采集
用于了解用户在访问某个页面时具体的互动特征。在阿里巴巴,通过一套名为“黄金令箭”的采集方案来解决交互日志的采集问题。
- 业务方在元数据管理界面注册需求,系统生成日志采集模板代码。
- 业务方将交互日志采集代码植入目标页面
- 用户在页面互动时,采集代码被触发
- 代码触发后发送日志请求。
无线客户端的日志采集
- 页面事件
UserTrack提供页面事件的无痕埋点,无需开发者进行任何编码即可实现。同时UT提供透传参数功能。 - 控件点击及其他事件
控件点击相对简单,就是操作页面上的某个控件,因此只需把相关基础信息告诉采集SDK即可。
日志采集挑战
- 日志分流与定制处理
采用分治策略作为日志采集体系的基本原则 - 采集与计算一体化设计
以PV为例,阿里日志采集针对这个问题使用两套日志规范和与之对应的元数据中心。 - 大促保证
- 首先实现服务器推送配置到客户端
- 其次对日志进行分流
- 最后,在实时处理方面做优化提高吞吐量
三、数据同步
数据同步技术通用的指的是不同系统之间的数据流转,有多种不同的应用场景。主要有三种直连同步、数据文件同步、数据库日志解析同步。
阿里数据仓库的同步方式
阿里数据仓库的数据同步有两个特点,一是数据来源的多样性,二是体现在在他的数据量上。
批量数据同步
离线类型的数据仓库应用,需要将不同的数据源批量同步到数据仓库,以及将数据仓库处理的数据数据批量同步到业务系统。阿里采用DataX来实现。
数据实时同步
对于日志类数据来,每天产生的日志是源源不断,且分布在不同的服务器,需要实时尽快的将数据同步到数据仓库。大多数情况下,是通过消息订阅模式来实现数据实时同步。阿里的TimeTunnel就是这样的一个数据实时传输平台。
数据同步遇到的问题
分库分表的处理
目前主流的数据库都支持分库分表操作。阿里的TDDL是一个分布式数据库访问引擎,通过建立中间表的逻辑状态来整合统一分库分表的访问。
高效同步和批量同步
阿里研发OneClick产品,对不同数据源的同步配置透明化,简化了数据同步的操作步骤,降低了数据同步技能门槛。实现了数据的一键化和批量化同步。
增量同步与全量同步的合并
随着数据表量的发展,周期的进行全量同步的方式会影响处理效率。此时采用同步更新增量数据与上次的全量数据进行合并,从而获得最版本的全量数据。
同步性能的处理
传统的数据同步模式存在的几个问题导致数据同步的任务运行不稳定。其数据实践团队总结出了一套基于负载均衡的新型数据同步方案。
数据漂移处理
源系统同步进入数据仓库的第一层数据成为ODS。数据漂移通常指的是同一个业务日期数据中包含前一天或后一天凌晨附近的数据或者丢失当天变更的数据。
通常有两种处理方式:
- 多获取后一天的数据。但此方法有可能出错,比如后一天关闭了前一天支付的订单。</