如果说在IT时代是以自我控制、自我管理为主,那么到了DT(Data Technology)时代,则是以服务大众、激发生产力为主。阿里巴巴大数据系统体系架构主要分为数据采集、数据计算、数据服务和数据应用四大层次。
阿里巴巴的日志采集体系方案包括两大体系:Aplus.JS是Web端(基于浏览器)日志采集技术方案:UserTrack是APP端(无线客户端)日志采集技术方案。
浏览器的页面型产品/服务的日志采集可分为如下两大类。
在HTML文档内增加一个日志采集节点,当浏览器解析时将自动触发一个特定的HTTP请求到日志采集服务器。主要过程如下:
阿里巴巴的页面浏览日志采集框架,不仅指定了上述的采集技术方案,同时也规定了PV日志的采集标准规范,其中规定了PV日志应采集和可采集的数据项,并对数据格式做了规定。
在阿里巴巴,通过一套名为“黄金令箭”的采集方案来解决交互日志的采集问题。“黄金令箭”是一个开放的基于HTTP协议的日志服务,采集步骤如下。
在大部分场合下,经过上述解析处理之后的日志并不直接提供给下游使用,一般还需要进行相应的离线预处理。
在阿里巴巴内部,多使用名为UserTrack的SDK来进行无线客户端的日志采集。UserTrack(UT)把事件分成了几类,常用的包括页面事件和控件点击事件等。
每条页面事件日志记录三类信息:①设备及用户的基本信息;②被访问页面的信息;③访问基本路径。UT提供了透传参数功能,即把当前页面的某些信息,传递到下一个页面甚至下下一个页面的日志中。
交互类的行为呈现出高度自定义的业务特征,因此UT提供了一个自定义埋点类,其包括:①事件名称;②事件时长;③事件所携带的属性;④事件对应的页面。UT还提供了一些默认的日志采集方法,比如可以自动捕获应用崩溃,并且产生一条日志记录崩溃相关信息。
随着业务的不断发展,业务的复杂性不断提高,采集需要处理的特殊场景也层出不穷。比如,为了平衡日志大小,减小流量消耗、采集服务器压力、网络传输压力等,采集SDK提供了聚合功能。
考虑到后续日志数据处理的便捷性、计算成本、数据的合理性及准确性,我们需要对Native和H5日志进行统一处理。在阿里巴巴集团,我们选择Native部署采集SDK的方式。原因有二: 一是采用采集SDK可以采集到更多的设备相关数据;二是采集SDK处理日志,会先在本地缓存,而后借机上传,在网络状况不佳时延迟上报,保证数据不丢失。具体的流程如下:
互联网产品的基本指标访客数(Unique Visitors, UV),对于登录用户,可以使用用户ID来进行唯一标识,但是很多日志行为并不要求用户登录。PC端一般使用Cookie信息来作为设备的唯一信息。阿里巴巴集团无线设备唯一标识使用UTDID,就是每台设备一个ID作为唯一标识。
无线客户端日志的上传,不是产生一条日志上传一条,而是无线客户端产生日志后,先存储在客户端本地,然后再伺机上传。服务器端处理上传请求,对请求进行相关校验,将数据追加到本地文件中进行存储,存储方式使用Nginx的access_log, access_log的切分维度为天,即当天接收的日志存储到当天的日志文件中。阿里巴巴集团主要使用消息队列(TimeTunel, TT)来实现从日志采集服务器到数据计算的MaxCompute。
各类采集方案提供者所面临的主要挑战是如何实现日志数据的结构化和规范化组织,实现更为高效的下游统计计算,提供符合业务特性的数据展现,以及为算法提供更便捷、灵活的支持等方面。
首先,端上实现了服务器端推送配置到客户端,且做到高到达率;其次,对日志做了分流,结合日志的重要程度及各类日志的大小,实现了日志服务器端的拆分;最后,在实时处理方面,也做了不少的优化以提高应用的吞吐量。
不同系统间的数据流转。
同步方式可以分为三种:直连同步、数据文件同步和数据库日志解析同步。
直连同步是指通过定义好的规范接口API和基于动态链接库的方式直接连接业务库。这种方式配置简单,实现容易,比较适合操作型业务系统的数据同步。但是业务库直连的方式对源系统的性能影响较大,虽然可以从备库抽取数据,但是当数据量较大时,采取此种抽取方式性能较差,不太适合从业务系统到数据仓库系统的同步。
数据文件同步通过约定好的文件编码、大小、格式等,直接从源系统生成数据的文本文件,由专门的文件服务器,如FTP服务器传输到目标系统后,加载到目标数据库系统中。当数据源包含多个异构的数据库系统(如MySQL、Oracle、SQL Server、DB2 等)时,用这种方式比较简单、实用。
为了确保数据文件同步的完整性,通常除了上传数据文件本身以外,还会上传一个校验文件,以供下游目标系统验证数据同步的准确性。另外,在从源系统生成数据文件的过程中,可以增加压缩和加密功能,传输到目标系统以后,再对数据进行解压缩和解密, 这样可以大大提高文件的传输效率和安全性。
解析日志文件这种读操作是在操作系统层面完成的,不需要通过数据库,因此不会给源系统带来性能影响。然后可通过网络协议,实现源系统和目标系统之间的数据文件传输。数据文件被传输到目标系统后,可通过数据加载模块完成数据的导入,从而实现数据从源系统到目标系统的同步。
数据库日志解析同步方式实现了实时与准实时同步的能力,延迟可以控制在毫秒级别,并且对业务系统的性能影响也比较小,目前广泛应用于从业务系统到数据仓库系统的增量数据同步应用之中。通过数据库日志解析进行同步的方式性能好、效率高,对业务系统的影响较小。但是它也存在如下一些问题:
对于离线类型的数据仓库应用,需要将不同的数据源批量同步到数据仓库,以及将经过数据仓库处理的结果数据定时同步到业务系统。阿里巴巴的DataX就是这样一个能满足多方向高自由度的异构数据交换服务产品。对于不同的数据源,DataX 通过插件的形式提供支持,将数据从数据源读出并转换为中间状态,同时维护好数据的传输、缓存等工作。数据在DataX中以中间状态存在,并在目标数据系统中将中间状态的数据转换为对应的数据格式后写入。
DataX采用Framework + Plugin的开放式框架实现,Framework处理缓冲、流程控制、并发、上下文加载等高速数据交换的大部分技术问题,并提供简单的接口与插件接入。插件仅需实现对数据处理系统的访问,编写方便,开发者可以在极短的时间内开发一个插件以快速支持新的数据库或文件系统。数据传输在单进程(单机模式)/多进程(分布式模式)下完成,传输过程全内存操作,不读写磁盘,也没有进程间通信,实现了在异构数据库或文件系统之间的高速数据交换。
建立一个日志数据交换中心,通过专门的模块从每台服务器源源不断地读取日志数据,或者解析业务数据库系统的binlog或归档日志,将增量数据以数据流的方式不断同步到日志交换中心,然后通知所有订阅了这些数据的数据仓库系统来获取。
阿里巴巴的TimeTunnel(TT)是一种基于生产者、消费者和Topic消息标识的消息中间件,将消息数据持久化到HBase的高可用、分布式数据交互系统。Time Tunnel支持主动、被动等多种数据订阅机制,订阅端自动负载均衡,消费者自己把握消费策略。对于读写比例很高的Topic,能够做到读写分离,使消费不影响发送。同时支持订阅历史数据,可以随意设置订阅位置,方便用户回补数据。
阿里巴巴的TDDL (Taobao Distributed Data Layer)就是这样一个分布式数据库的访问引擎,通过建立中间状态的逻辑表来整合统一分库分表的访问。TDDL是在持久层框架之下、JDBC驱动之上的中间件,它与JDBC规范保持一致,有效解决了分库分表的规则引擎问题,实现了SQL解析、规则计算、表名替换、选择执行单元并合并结果集的功能,同时解决了数据库表的读写分离、高性能主备切换的问题,实现了数据库配置信息的统一管理。
阿里巴巴数据仓库研发了OneClick产品,真正实现了数据的一键化和批量化同步,一键完成DDL和DML的生成、数据的冒烟测试以及在生产环境中测试等。
IDB是阿里巴巴集团用于统一管理MySQL、OceanBase、PostgreSQL、Oracle、SQL Server等关系型数据库的平台,它是一种集数据管理、结构管理、诊断优化、实时监控和系统管理于一体的数据管理服务;在对集团数据库表的统一管理服务过程中,IDB产出了数据库、表、字段各个级别元数据信息,并且提供了元数据接口服务。
每次只同步新变更的增量数据,然后与上一个同步周期获得的全量数据进行合井,从而获得最新版本的全量数据。我们比较推荐的方式是全外连接( full outer join) + 数据全量覆盖重新加载(insert overwrite)。如果担心数据更新错误问题,可以采用分区方式,每天保持一个最新的全量版本,保留较短的时间周期。
阿里巴巴数据团队实践出了一套基于负载均衡思想的新型数据同步方案。该方案的核心思想是通过目标数据库的元数据估算同步任务的总线程数,以及通过系统预先定义的期望同步速度估算首轮同步的线程数,同时通过数据同步任务的业务优先级决定同步线程的优先级,最终提升同步任务的执行效率和稳定性。具体实现步骤如下:
数据漂移通常是指ODS表的同一个业务日期数据中包含前一天或后一天凌晨附近的数据或者丢失当天的变更数据。处理方法主要有以下两种:
阿里巴巴的数据计算层包括两大体系:数据存储及计算平台(离线计算平台MaxCompute和实时计算平台StreamCompute)、数据整合及管理体系(OneData)。
通过统一的计算平台(MaxCompute)、统一的开发平台(D2等相关平台和工具)、统一的数据模型规范和统一的数据研发规范,可以在一定程度上解决数据研发的痛点。
阿里离线数据仓库的存储和计算都是在阿里云大数据计算服务MaxCompute上完成的。MaxCompute采用抽象的作业处理框架,将不同场景的各种计算任务统一在同一个平台之上,共享安全、存储、数据管理和资源调度,为来自不同用户需求的各种数据处理任务提供统一的编程接口和界面。它提供数据上传/下载通道、SQL 、MapReduce 、机器学习算法、图编程模型和流式计算模型多种计算分析服务,并且提供完善的安全解决方案。
围绕MaxCompute计算平台,从任务开发、调试、测试、发布、监控、报警到运维管理,形成了整套工具和产品,既提高了开发效率,又保证了数据质量,并且在确保数据产出时效的同时,能对数据进行有效管理。
在大数据环境下,每天需要处理海量的任务,任务的类型也很繁杂,任务之间互相依赖且需要不同的运行环境。为了解决以上问题,阿里巴巴的大数据调度系统应运而生。
流式数据处理一般具有以下特征。
各个子系统按功能划分的话,主要分为以下几部分。
不管是数据库变更日志还是引擎访问日志,都会在业务服务器上落地成文件,所以只要监控文件的内容发生变化,采集工具就可以把最新的数据采集下来。一般情况下,出于吞吐量以及系统压力上的考虑,并不是新增一条记录就采集一次,而是按批次对数据进行采集。对于采集到的数据需要一个数据交换平台分发给下游,这个平台就是数据中间件。阿里巴巴集团内部用得比较多的是TimeTunnel(原理和Kafka类似),还有MetaQ、Notify等消息系统。
在阿里巴巴集团内使用比较多的是阿里云提供的StreamCompute系统,涵盖了从数据采集到数据生产各个环节,力保流计算开发严谨、可靠。实时任务遇到的几个典型问题。
数据存储系统必须能够比较好地支持多并发读写,并且延时需要在毫秒级才能满足实时的性能要求。在实践中,一般使用HBase 、Tair、MongoDB等列式存储系统。表名设计和rowkey设计的一些实践经验。
实时数据落地到存储系统中后,使用方就可以通过统一的数据服务获取到实时数据。比如OneService,其好处是:
实时建模跟离线建模非常类似,数据模型整体上分为五层(ODS、DWD、DWS、ADS、DIM)。由于实时计算的局限性,每一层中并没有像离线做得那么宽,维度和指标也没有那么多,特别是涉及回溯状态的指标,在实时数据模型中几乎没有。
在流式计算中常常需要把两个实时流进行主键关联,以得到对应的实时明细表。多流关联的一个关键点就是需要相互等待,只有双方都到达了,才能关联成功。实时采集两张表的数据,每到来一条新数据时都在内存中的对方表截至当前的全量数据中查找,如果能查找到,则说明关联成功,直接输出;如果没查找到,则把数据放在内存中的自己表数据集合中等待。另外,不管是否关联成功,内存中的数据都需要备份到外部存储系统中,在任务重启时,可以从外部存储系统中恢复内存数据,这样才能保证数据不丢失。因为在重启时,任务是续跑的,不会重新跑之前的数据。
在实际处理时,考虑到查找数据的性能,实时关联这个步骤一般会把数据按照关联主键进行分桶处理,并且在故障恢复时也根据分桶来进行,以降低查找数据量和提高吞吐量。
在实时计算中,关联维表一般会使用当前的实时数据(T)去关联T-2 的维表数据,相当于在T的数据到达之前需要把维表数据准备好,并且一般是一份静态的数据。主要基于以下几点的考虑。
在大促的时候一天中的峰值特别明显,数据量是其他时间点的几倍甚至数十倍,这对系统的抗压能力要求非常高,不能因为洪流的到来而把系统压垮。
阿里数据服务依次经历了内部代号为DWSOA、OpenAPI、SmartDQ和OneService的四个阶段。
将业务方对数据的需求通过SOA服务的方式暴露出去。由需求驱动,一个需求开发一个或者几个接口,编写接口文档,开放给业务方调用。一方面,接口粒度比较粗,灵活性不高,扩展性差,复用率低。随着业务方对数据服务的需求增加,接口的数量显著增加。
将数据按照其统计粒度进行聚合,同样维度的数据,形成一张逻辑表,采用同样的接口描述。这种方式有效地收敛了接口数量。
数据的维度并没有我们想象的那么可控,随着时间的推移,大家对数据的深度使用,分析数据的维度也越来越多。可以开放给业务方通过写SQL的方式对外提供服务,由服务提供者自己来维护SQL。SQL提供者只需关心逻辑表的结构,不需要关心底层由多少物理表组成,甚至不需要关心这些物理表是HBase还是MySQL的,是单表还是分库分表,因为SmartDQ已经封装了跨异构数据源和分布式查询功能。
小结:接口易上难下,即使一个接口也会绑定一批人(业务方、接口开发维护人员、调用方)。所以对外提供的数据服务接口一定要尽可能抽象,接口的数量要尽可能收敛,最后在保障服务质量的情况下,尽可能减少维护工作量。现在SmartDQ提供300多个SQL模板,每条SQL承担多个接口的需求,而我们只用l位同学来维护SmartDQ。
SmartDQ其实只满足了简单的查询服务需求。我们遇到的场景还有这么几类:个性化的垂直业务场景、实时数据推送服务、定时任务服务。所以OneService主要是提供多种服务类型来满足用户需求,分别是OneService-SmartDQ、OneService-Lego、OneService-iPush、OneService-uTiming。数据生产者将数据入库之后,服务提供者可以根据标准规范快速创建服务、发布服务、监控服务、下线服务,服务调用者可以在门户网站中快速检索服务,申请权限和调用服务。
iPush应用产品是一个面向TT、MetaQ等不同消息源,通过定制过滤规则,向Web、无线等终端推送消息的中间件平台。iPush核心服务器端基于高性能异步事件驱动模型的网络通信框架Netty4实现,结合使用Guava缓存实现本地注册信息的存储,Filter与Server之间的通信采用Thrift异步调用高效服务实现,消息基于Disruptor高性能的异步处理框架的消息队列,在服务器运行时Zookeeper实时监控服务器状态,以及通过Diamond作为统一的控制触发中心。
Lego被设计成一个面向中度和高度定制化数据查询需求、支持插件机制的服务容器。它本身只提供日志、服务注册、Diamond配置监听、鉴权、数据源管理等一系列基础设施,具体的数据服务则由服务插件提供。基于Lego的插件框架可以快速实现个性化需求并发布上线。
uTiming是基于在云端的任务调度应用,提供批量数据处理服务,支撑用户识别、用户画像、人群圈选三类服务的离线计算,以及用户识别、用户画像、人群透视的服务数据预处理、入库。
如何从海量数据中挖掘出有效信息形成真正的生产力,是所有大数据公司需要面对的共同课题。基于大数据的企业级数据挖掘需要包含两个要素:①面向机器学习算法的并行计算框架与算法平台;②面向企业级数据挖掘的算法资产管理体系。
MPI是一种基于消息传递的并行计算框架,由于没有IO操作,性能优于MapReduce。因此,阿里巴巴的算法平台选用MPI作为基础计算框架,其核心机器学习算法的开发都是基于阿里云MaxCompute的MPI实现的。
对于数据挖掘中台体系的设计也包含两大块:数据中台与算法中台。
在数据挖掘的过程中包含两类数据:特征数据与结果数据。我们把数据中台分为三层:特征层(Featural Data Mining Layer, FDM)、中间层和应用层(Application-oriented Data Mining Layer, ADM),其中中间层包括个体中间层(Individual Data Mining Layer, IDM)和关系中间层(Relational Data Mining Layer, RDM)。不同数据层的作用有所区别:
理解算法的原理不难,难的是在理解原理的基础上如何能结合业务合理地运用算法。阿里巴巴数据挖掘算法中台建设的目的同样在于从各种各样的挖掘场景中抽象出有代表性的几类场景,并形成相应的方法论和实操模板。按照个体挖掘应用和关系挖掘应用的分类方式,可以抽象出常见的几类数据挖掘应用场景一一在个体挖掘应用中,消费者画像与业务指标预测是两类非常有代表性的场景;而在关系挖掘应用中,相似关系与竞争关系是两类非常通用的关系挖掘应用,在此基础上构建的推荐系统与竞争分析系统,则是电商领域持续关注的两大热门话题。
用户画像即是为用户打上各种各样的标签,如年龄、性别、职业、商品品牌偏好、商品类别偏好等。用户画像可以分为基础属性、购物偏好、社交关系、财富属性等几大类。
从业务上看,反作弊工作主要体现在以下几个方面:
从所采用的算法技术上说,反作弊方法主要包括如下几类:
在算法实现方面的工作主要分为以下两个方面:
反作弊未来还面临着诸多挑战。比如:
数据模型就是数据组织和存储方法,它强调从业务、数据存取和使用角度合理存储数据。数据建模有以下好处。
大数据系统需要数据模型方法来帮助更好地组织和存储数据,以便在性能、成本、效率和质量之间取得最佳平衡。
现代企业信息系统几乎都使用关系数据库来存储、加工和处理数据。数据仓库系统也不例外,大量的数据仓库系统依托强大的关系数据库能力存储和处理数据,其采用的数据模型方法也是基于关系数据库理论的。
OLTP系统通常面向的主要数据操作是随机读写,主要采用满足3NF的实体关系模型存储数据,从而在事务处理中解决数据的冗余和一致性问题;而OLAP系统面向的主要数据操作是批量读写,事务处理中的一致性不是OLAP所关注的,其主要关注数据的整合,以及在一次性的复杂大数据查询和处理中的性能,因此它需要采用一些不同的数据建模方法。
从全企业的高度设计一个3NF模型,用实体关系(Entity Relationship, ER)模型描述企业业务,在范式理论上符合3NF。在不太成熟、快速变化的业务面前,构建ER模型的风险非常大,不太适合去构建ER模型。其具有以下几个特点:
采用ER模型建设数据仓库模型的出发点是整合数据,将各个系统中的数据以整个企业角度按主题进行相似性组合和合并,并进行一致性处理,为数据分析决策服务,但是并不能直接用于分析决策。其建模步骤分为三个阶段。
维度建模从分析决策的需求出发构建模型,为分析需求服务,因此它重点关注用户如何更快速地完成需求分析,同时具有较好的大规模复杂查询的响应性能。其典型的代表是星形模型,以及在一些特殊场景下使用的雪花模型。其设计分为以下几个步骤。
Data Vault模型设计的出发点也是为了实现数据的整合,但不能直接用于数据分析决策。它强调建立一个可审计的基础数据层,也就是强调数据的历史性、可追溯性和原子性,而不要求对数据进行过度的一致性处理和整合。Data Vault模型由以下几部分组成。
Data Vault模型比ER模型更容易设计和产出,它的ETL加工可实现配置化。
Anchor对Data Vault模型做了进一步规范化处理,其核心思想是所有的扩展只是添加而不是修改,因此将模型规范到6NF,基本变成了k-v结构化模型。Anchor模型的组成。
Anchor模型的创建者的观点是,数据仓库中的分析查询只是基于一小部分字段进行的,类似于列存储结构,可以大大减少数据扫描,从而对查询性能影响较小。
阿里巴巴数据公共层建设的指导方法是一套统一化的集团数据整合及管理的方法体系(称为“OneData”),其包括一致性的指标定义体系、模型设计方法体系以及配套工具。
OneData即是阿里巴巴内部进行数据整合及管理的方法体系和工具。阿里巴巴的大数据工程师在这一体系下,构建统一、规范、可共享的全域数据体系,避免数据的冗余和重复建设,规避数据烟囱和不一致性,充分发挥阿里巴巴在大数据海量、多样性方面的独特优势。
阿里巴巴集团大数据建设方法论的核心是:从业务架构设计到模型设计,从数据研发到数据服务,做到数据可管理、可追溯、可规避重复建设。
建设统一的、规范化的数据接人层(ODS)和数据中间层(DWD和DWS),通过数据服务和数据产品,完成服务于阿里巴巴的大数据系统建设,即数据公共层建设。提供标准化的(Standard)、共享的(Shared)、数据服务(Service)能力,降低数据互通成本,释放计算、存储、人力等资源,以消除业务和技术之痛。
规范定义指以维度建模作为理论基础,构建总线矩阵,划分和定义数据域、业务过程、维度、度量/原子指标、修饰类型、修饰词、时间周期、派生指标。
阿里巴巴集团数据公共层设计理念遵循维度建模思想,数据模型的维度设计主要以维度建模理论为基础,基于维度数据模型总线架构,构建一致性的维度和事实。
构建维度模型一般要经历四个阶段:
Inmon 将模型划分为三个层次,分别是ERD (Entity Relationship Diagram,实体关系图)层、DIS (Data Item Set , 数据项集)层和物理层(Physical Model,物理模型)。ERD层是数据模型的最高层,该层描述了公司业务中的实体或主题域以及它们之间的关系;DIS层是中间层,该层描述了数据模型中的关键字、属性以及细节数据之间的关系;物理层是数据建模的最底层,该层描述了数据模型的物理特性。Inmon 对于构建数据仓库模型建议采用螺旋式开发方法,采用迭代方式完成多次需求。
在维度建模中,将度量称为“事实” ,将环境描述为“维度”,维度是用于分析事实所需要的多样环境。维度所包含的表示维度的列,称为维度属性。维度属性是查询约束条件、分组和报表标签生成的基本来源,是数据易用性的关键。
如何获取维度或维度属性?一方面,可以在报表中获取;另一方面,可以在和业务人员的交谈中发现维度或维度属性。
维度使用主键标识其唯一性,主键也是确保与之相连的任何事实表之间存在引用完整性的基础。主键有两种:代理键和自然键,它们都是用于标识某维度的具体值。但代理键是不具有业务含义的键,一般用于处理缓慢变化维;自然键是具有业务含义的键。
维度的设计过程就是确定维度属性的过程,如何生成维度属性,以及所生成的维度属性的优劣,决定了维度使用的方便性,成为数据仓库易用性的关键。正如Kimball所说的,数据仓库的能力直接与维度属性的质量和深度成正比。确定维度属性的几点提示:
维度中的一些描述属性以层次方式或一对多的方式相互关联,可以被理解为包含连续主从关系的属性层次。
当属性层次被实例化为一系列维度,而不是单一的维度时,被称为雪花模式。将维度的属性层次合并到单个维度中的操作称为反规范化。
Kimball的数据仓库总线架构提供了一种分解企业级数据仓库规划任务的合理方法,通过构建企业范围内一致性维度和事实来构建总线架构。数据仓库总线架构的重要基石之一就是一致性维度。如果不同数据域的计算过程使用的维度不一致,就会导致交叉探查存在问题。下面总结维度一致性的几种表现形式。
数据仓库是一个面向主题的、集成的、非易失的且随时间变化的数据集合,用来支持管理人员的决策。其中集成是数据仓库的四个特性中最重要的一个。数据仓库的重要数据来源是大量的、分散的面向应用的操作型环境。应用之间的差异具体表现在如下几个方面:
所以数据由面向应用的操作型环境进入数据仓库后,需要进行数据集成。将面向应用的数据转换为面向主题的数据仓库数据,本身就是一种集成。具体体现在如下几个方面:
主要有两种解决方案:方案l是将维度的不同分类实例化为不同的维度,同时在主维度中保存公共属性;方案2是维护单一维度,包含所有可能的属性。选择哪种方案?在设计过程中需要重点考虑以下三个原则。
根据数据模型设计思想,在对维度进行水平拆分时,主要考虑如下两个依据。
第一个依据是维度的不同分类的属性差异情况。当维度属性随类型变化较大时,将所有可能的属性建立在一个表中是不切合实际的,也没有必要这样做,此时建议采用方案l。第二个依据是业务的关联程度。两个相关性较低的业务,耦合在一起弊大于利,对模型的稳定性和易用性影响较大。
出于扩展性、产出时间、易用性等方面的考虑,设计主从维度。主维表存放稳定、产出时间早、热度高的属性;从维表存放变化较快、产出时间晚、热度低的属性。
在数据仓库中,可以借用前台数据库的归档策略,定期将历史数据归档至历史维表。关于归档策略,有以下几种方式。
数据仓库的重要特点之一是反映历史变化,所以如何处理维度的变化是维度设计的重要工作之一。在Kimball的理论中,有三种处理缓慢变化维的方式:
在Kimball的维度建模中,必须使用代理键作为每个维表的主键,用于处理缓慢变化维。但在阿里巴巴数据仓库建设的实践过程中,虽然使用的是Kimball的维度建模理论,但实际并未使用代理键。为什么不使用代理键?第一个原因是,阿里巴巴数据量庞大,对于分布式计算系统,不存在事务的概念,对于每个表的记录生成稳定的全局唯一的代理键难度很大,此处稳定指某条记录每次生成的代理键都相同。第二个原因是,使用代理键会大大增加ETL的复杂性,对ETL任务的开发和维护成本很高。
在阿里巴巴数据仓库实践中,处理缓慢变化维的方法是采用快照方式。数据仓库的计算周期一般是每天一次,基于此周期,处理维度变化的方式就是每天保留一份全量快照数据。
首先来看历史拉链存储。历史拉链存储是指利用维度模型中缓慢变化维的第二种处理方式。这种处理方式是通过新增两个时间戳字段(start_dt和end_dt),将所有以天为粒度的变更数据都记录下来。通常分区字段也是时间戳字段。但是这种存储方式对于下游使用方存在一定的理解障碍,另外,随着时间的推移,分区数量会极度膨胀,而现行的数据库系统都有分区数量限制。为了解决上述两个问题,阿里巴巴提出来用极限存储的方式来处理。
在实际生产中,做极限存储需要进行一些额外的处理。
采用极限存储,需要避免维度的过度增长。通过将一些属性从维表中移出,放置到全新的维表中,可以解决维度的过度增长导致极限存储效果大打折扣的问题。其中一种解决方法就是上一节提到的垂直拆分,保持主维度的稳定性;另一种解决方式是采用微型维度。
微型维度的创建是通过将一部分不稳定的属性从主维度中移出,并将它们放置到拥有自己代理键的新表中来实现的。但在阿里巴巴数据仓库实践中,并未使用此技术,主要有以下几点原因:
维度的递归层次,按照层级是否固定分为均衡层次结构和非均衡层次结构。对于这种具有固定数量级别的递归层次,称为“均衡层次结构”。对于这种数量级别不固定的递归层次,称为“非均衡层次结构”。
在物理实现时,可以使用递归SQL实现,如Oracle中的connect by语句。由于很多数据仓库系统和商业智能工具不支持递归SQL ,且用户使用递归SQL的成本较高,所以在维度模型中,需要对此层次结构进行处理。
类似的维度,都和事实相关,如交易、物流等,称之为“行为维度”,或“事实衍生的维度”。按照加工方式,行为维度可以划分为以下几种:
对于行为维度,有两种处理方式,其中一种是将其冗余至现有的维表中,如将卖家信用等级冗余至卖家维表中;另一种是加工成单独的行为维表,如卖家主营类目。具体采用哪种方式主要参考如下两个原则:
针对多值维度,常见的处理方式有三种,可以根据业务的表现形式和统计分析需求进行选择。
维表中的某个属性字段同时有多个值,称之为“多值属性”。它是多值维度的另一种表现形式。对于多值属性,常见的处理方式有三种,可以根据具体情况进行选择。
杂项维度是由操作型系统中的指示符或者标志字段组合而成的,一般不在一致性维度之列。一个事实表中可能会存在多个类似的字段,如果作为事实存放在事实表中,则会导致事实表占用空间过大;如果单独建立维表,外键关联到事实表,则会出现维度过多的情况;如果将这些字段删除,则会有人不同意。通常的解决方案就是建立杂项维度,将这些字段建立到一个维表中,在事实表中只需保存一个外键即可。多个字段的不同取值组成一条记录,生成代理键,存入维表中,并将该代理键保存到相应的事实表字段下。
在阿里巴巴的实践中,一般在逻辑建模中,会使用实体的主键作为杂项维度的主键。只考虑杂项维度,忽略其他维度,会将维度属性退化至事实表中。
事实表作为数据仓库维度建模的核心,紧紧围绕着业务过程来设计,通过获取描述业务过程的度量来表达业务过程,包含了引用的维度和与业务过程有关的度量。事实表中一条记录所表达的业务细节程度被称为粒度。通常粒度可以通过两种方式来表述:一种是维度属性组合所表示的细节程度;一种是所表示的具体业务含义。作为度量业务过程的事实,一般为整型或浮点型的十进制数值,有可加性、半可加性和不可加性三种类型。
维度属性也可以存储到事实表中,这种存储到事实表中的维度列被称为“退化维度”。事实表有三种类型: 事务事实表、周期快照事实表和累积快照事实表。事务事实表用来描述业务过程,跟踪空间或时间上某点的度量事件,保存的是最原子的数据,也称为“原子事实表”。周期快照事实表以具有规律性的、可预见的时间间隔记录事实,时间间隔如每天、每月、每年等。累积快照事实表用来表述过程开始和结束之间的关键步骤事件,覆盖过程的整个生命周期,通常具有多个日期字段来记录关键时间点, 当过程随着生命周期不断变化时,记录也会随着过程的变化而被修改。
对于维度模型设计采用四步设计方法:选择业务过程、声明粒度、确定维度、确定事实。为了更有效、准确地进行维度模型建设,基于Kimball的四步维度建模方法,我们进行了更进一步的改进。
任何类型的事件都可以被理解为一种事务。事务事实表,即针对这些过程构建的一类事实表,用以跟踪定义业务过程的个体行为,提供丰富的分析能力,作为数据仓库原子的明细数据。事务事实表的一般设计过程。
针对每个业务过程设计一个事实表。可以方便地对每个业务过程进行独立的分析研究。
多事务事实表,将不同的事实放到同一个事实表中,即同一个事实表包含不同的业务过程。多事务事实表在设计时有两种方法进行事实的处理:①不同业务过程的事实使用不同的事实字段进行存放:②不同业务过程的事实使用同一个事实字段进行存放,但增加一个业务过程标签。上面介绍了两种多事务事实表的设计方式,在实际应用中需要根据业务过程进行选择。
将父事实的度量分摊到子事实上,将父子事实同时冗余到事务表中。
快照事实表在确定的间隔内对实体的度量进行抽样,这样可以很容易地研究实体的度量值,而不需要聚集长期的事务历史。
事务事实表的粒度能以多种方式表达,但快照事实表的粒度通常以维度形式声明;事务事实表是稀疏的,但快照事实表是稠密的;事务事实表中的事实是完全可加的,但快照模型将至少包含一个用来展示半可加性质的事实。
子快照事实表的设计步骤可以归纳为:
可以从事务事实表进行汇总产出,这是周期快照事实表常见的一种产出模式。还有一种产出模式,即直接使用操作型系统的数据作为周期快照事实表的数据源进行加工,比如淘宝卖家星级、卖家DSR事实表等。
对于类似于研究事件之间时间间隔的需求,采用累积快照事实表可以很好地解决。
对于累积快照事实表,其建模过程和事务事实表相同,适用于维度建模的步骤。
第一种方式是全量表的形式。此全量表一般为日期分区表,每天的分区存储昨天的全量数据和当天的增量数据合并的结果,保证每条记录的状态最新。此种方式适用于全量数据较少的情况。如果数据量很大,此全量表数据量不断膨胀,存储了大量永远不再更新的历史数据,对ETL和分析统计性能影响较大。
第二种方式是全量表的变化形式。此种方式主要针对事实表数据量很大的情况。较短生命周期的业务实体一般从产生到消亡都有一定的时间间隔,可以测算此时间间隔,或者根据商业用户的需求确定一个相对较大的时间间隔。比如针对交易订单,设计最近200 天的交易订单累积快照事实表,每天的分区存储最近200天的交易订单。
第三种方式是以业务实体的结束时间分区。每天的分区存放当天结束的数据,设计一个时间非常大的分区,比如3000-12-31,存放截至当前未结束的数据。
事务事实表记录的事务层面的事实,用于跟踪业务过程的行为,并支持几种描述行为的事实,保存的是最原子的数据,也称为“原子事实表”。事务事实表中的数据在事务事件发生后产生,数据的粒度通常是每个事务一条记录。一旦事务被提交,事实表数据被插入,数据就不能更改,其更新方式为增量更新。
周期快照事实表以具有规律性的、可预见的时间间隔来记录事实,如余额、库存、层级、温度等,时间间隔为每天、每月、每年等,典型的例子如库存日快照表等。周期快照事实表的日期维度通常记录时间段的终止日,记录的事实是这个时间段内一些聚集事实值或状态度量。事实表的数据一旦插入就不能更改,其更新方式为增量更新。
累积快照事实表被用来跟踪实体的一系列业务过程的进展情况,它通常具有多个日期字段,用于研究业务过程中的里程碑过程的时间间隔。另外,它还会有一个用于指示最后更新日期的附加日期字段。由于事实表中许多日期在首次加载时是不知道的,而且这类事实表在数据加载完成后,可以对其数据进行更新,来补充业务状态变更时的日期信息和事实。
在维度模型中,事实表用事实来度量业务过程,不包含事实或度量的事实表称为“无事实的事实表”。常见的无事实的事实表主要有如下两种:
数据仓库的性能是数据仓库建设是否成功的重要标准之一。聚集主要是通过汇总明细粒度数据来获得改进查询性能的效果。
按照传统的定义,元数据(Metadata)是关于数据的数据。元数据主要记录数据仓库中模型的定义、各层级间的映射关系、监控数据仓库的数据状态及ETL的任务运行状态。在数据仓库系统中,元数据可以帮助数据仓库管理员和开发人员非常方便地找到他们所关心的数据,用于指导其进行数据管理和开发工作,提高工作效率。
将元数据按用途的不同分为两类:技术元数据(Technical Metadata)和业务元数据(Business Metadata)。技术元数据是存储关于数据仓库系统技术细节的数据,是用于开发和管理数据仓库使用的数据。阿里巴巴常见的技术元数据有:
业务元数据从业务角度描述了数据仓库中的数据,它提供了介于使用者和实际系统之间的语义层,使得不懂计算机技术的业务人员也能够“读懂”数据仓库中的数据。阿里巴巴常见的业务元数据有:
元数据有重要的应用价值,是数据管理、数据内容、数据应用的基础,在数据管理方面为集团数据提供在计算、存储、成本、质量、安全、模型等治理领域上的数据支持。
元数据建设的目标是打通数据接入到加工,再到数据消费整个链路,规范元数据体系与模型,提供统一的元数据服务出口,保障元数据产出的稳定性和质量。
数据的真正价值在于数据驱动决策,通过数据指导运营。
核心思路是为纷繁复杂的数据建立一个脉络清晰的血缘图谱。通过图计算、标签传播算法等技术,系统化、自动化地对计算与存储平台上的数据进行打标、整理、归档。形象地说,Data Profile实际承担的是为元数据“画像”的任务。Data Profile开发出了四类标签:
元数据门户致力打造一站式的数据管理平台、高效的一体化数据市场。包括“前台”和“后台”,“前台”产品为数据地图,定位消费市场,实现检索数据、理解数据等“找数据”需求;“后台”产品为数据管理,定位于一站式数据管理,实现成本管理、安全管理、质量管理等。
通过应用链路分析,产出表级血缘、字段血缘和表的应用血缘。其中表级血缘主要有两种计算方式:一种是通过MaxCompute任务日志进行解析;一种是根据任务依赖进行解析。
其中难度最大的是表的应用血缘解析,其依赖不同的应用。按照应用和物理表的配置关系,可以分为配置型和无配置型。无配置型主要通过统一的应用日志打点SDK来解决此问题,可以做到配置化、应用无痕化。常见的应用链路分析应用主要有影响分析、重要性分析、下线分析、链路分析、寻根溯源、故障排查等。
通过元数据驱动的数据仓库模型建设,提高数据仓库建模的数据化指导,提升建模效率。所使用的元数据主要有:
在星形模型设计过程中,可能类似于如下使用元数据。
通过元数据,指导ETL工作,提高ETL的效率。我们可以通过Data Profile得到数据的下游任务依赖情况、最近被读写的次数、数据是否可再生、每天消耗的存储计算等,这些信息足以让我们判断数据是否可以下线;如果根据一些规则判断可以下线,则会通过OneClick触发一个数据下线的工作任务流,数据Owner可能只需要点击提交按钮,删除数据、删除元数据、下线调度任务、下线DQC监控等一系列操作就会自动在后台执行完成。
在任务稳定的情况下,可以考虑基于任务的历史执行情况进行资源评估,即采用HBO (History-Based Optimizer,基于历史的优化器)。提到CBO (Cost-Based Optimizer ,基于代价的优化器),首先会想到Oracle的CBO。Oracle会根据收集到的表、分区、索引等统计信息来计算每种执行方式的代价(Cost),进而选择其中最优的执行方式。但对表和列上统计信息的收集也是有代价的,尤其是在大数据环境下,表的体量巨大,消耗大量资源收集的统计信息利用率很低。MaxCompute采用各种抽样统计算法,通过较少的资源获得大量的统计信息,基于先进的优化模型,具备了完善的CBO能力,与传统的大数据计算系统相比,性能提升明显。
HBO是根据任务历史执行情况为任务分配更合理的资源,包括内存、CPU以及Instance个数。HBO是对集群资源分配的一种优化,概括起来就是:任务执行历史+集群状态信息+优化规则→更优的执行配置。
基础资源数量的逻辑:对于Map Task,根据期望的每个Map能处理的数据量,再结合用户提交任务的输入数据量,就可以估算出用户提交的任务所需要的Map数量。对于Reduce Task,比较Hive使用Map输入数据量,MaxCompute使用最近7天Reduce对应Map 的平均输出数据量作为Reduce的输入数据量,用于计算Instance的数量。
加权资源数量的逻辑:对于Map Task,通过该Map在最近一段时间内的平均处理速度与系统设定的期望值做比较,如果平均处理速度小于期望值,则按照同等比例对基础资源数量进行加权,估算出该Map的加权资源数量。对于Reduce Task,方法同上。
根据收集的统计信息来计算每种执行方式的代价,进而选择最优的执行方式。
对于数据爆炸式的增长,存储管理也将面临着一系列挑战。如何有效地降低存储资源的消耗,节省存储成本,将是存储管理孜孜追求的目标。
目前MaxCompute中提供了archive压缩方法,它采用了具有更高压缩比的压缩算法,可以将数据保存为RAID file的形式,数据不再简单地保存为3份,而是使用盘古RAID file的默认值(6, 3)格式的文件,即6份数据+3份校验块的方式,这样能够有效地将存储比约为1:3 提高到1:1.5,大约能够省下一半的物理空间。当然,这样恢复数据块的时间将要比原来的方式更长,读的性能会有一定的损失。
在MaxCompute中主要采用基于列存储的方式,由于每个表的数据分布不同,插人数据的顺序不一样,会导致压缩效果有很大的差异,因此通过修改表的数据重分布,避免列热点,将会节省一定的存储空间。目前我们主要通过修改distribute by和sort by字段的方法进行数据重分布。一般我们会筛选出重分布效果高于15%的表进行优化处理。
在元数据的基础上,诊断、加工成多个存储治理优化项。目前已有的存储治理优化项有未管理表、空表、最近62天未访问表、数据无更新无任务表、数据无更新有任务表、开发库数据大于lOOGB且无访问表、长周期表等。通过对该优化项的数据诊断,形成治理项,治理项通过流程的方式进行运转、管理,最终推动各个ETL开发人员进行操作,优化存储管理,并及时回收优化的存储效果。在这个体系下,形成现状分析、问题诊断、管理优化、效果反馈的存储治理项优化的闭环。
从数据价值及数据使用性方面综合考虑,数据的生命周期管理是存储管理的一项重要手段。生命周期管理的根本目的就是用最少的存储成本来满足最大的业务需求,使数据价值最大化。
可以采用最简单的方式,将一个数据表的成本分为存储成本和计算成本。存储成本是为了计量数据表消耗的存储资源,计算成本是为了计量数据计算过程中的CPU消耗。但这会存在较大的质疑和挑战,在计量数据表的成本时,除考虑数据表本身的计算成本、存储成本外,还要考虑对上游数据表的扫描带来的扫描成本。我们将数据成本定义为存储成本、计算成本和扫描成本三个部分,能够很好地体现出数据在加工链路中的上下游依赖关系,使得成本的评估尽量准确、公平、合理。
在阿里巴巴集团内部,分别依据这三部分成本进行收费,称为:计算付费、存储付费和扫描付费。我们把数据资产的成本管理分为数据成本计量和数据使用计费两个步骤。通过成本计量,可以比较合理地评估出数据加工链路中的成本,从成本的角度反映出在数据加工链路中是否存在加工复杂、链路过长、依赖不合理等问题,间接辅助数据模型优化,提升数据整合效率;通过数据使用计费,可以规范下游用户的数据使用方法,提升数据使用效率,从而为业务提供优质的数据服务。
数据质量是数据分析结论有效性和准确性的基础,也是这一切的前提。如何保障数据质量,确保数据可用性是阿里巴巴数据仓库建设不容忽视的环节。
阿里巴巴对数据仓库主要从四个方面进行评估,即完整性、准确性、一致性和及时性。
基于不断膨胀的数据和对数据类的应用,阿里巴巴内部提出了数据资产等级的方案,旨在解决消费场景知晓的问题。
主要是针对数据在日常运行过程中容易出现的风险进行监控并设置报警机制,主要包括在线数据和离线数据运行风险点监控。
调度是一个树形结构,当配置了叶子节点的优先级后,这个优先级会传递到所有上游节点,所以优先级的设置都是给到叶子节点,而叶子节点往往就是服务业务的消费节点。
本章主要介绍两个应用:提供给外部商家使用的数据产品平台一一生意参谋和服务于阿里巴巴内部的数据产品平台。
在对外产品方面,阿里巴巴主要以“生意参谋”作为官方统一的数据产品平台,为商家提供多样化、普惠性的数据赋能。
商家只要通过生意参谋一个平台,就能体验统一、稳定、准确的官方数据服务。目前平台的数据巳覆盖淘宝、天猫等阿里系所有平台和PC、无线等终端,涉及指标上千个。在产品功能方面,已拥有店铺自有分析、店铺行业分析、店铺竞争分析三大基础业务模块。另外,它还支持多个专题工具的使用和自助取数等个性化需求。
目前平台共有七个板块,除首页外,还有实时直播、经营分析、市场行情、自助取数、专题工具、数据学院。从商家实际应用场景来看,这些数据服务可以划分为三个维度,即看我情、看行情和看敌情。
其实数据服务并不是提供得越多越好,还要注重数据的统一性、及时性和准确性;否则,数据提供越多,给商家带来的困扰可能就越大。平台背后看不见的“数据中台”给生意参谋提供了大量技术保障。OneData体系、One ID技术等在其中为生意参谋等数据产品提供了稳定的技术支持。
一方面,生意参谋不断开放阿里巴巴的大数据能力;另一方面,其服务对象正受益于大数据,基于数据不断提升自身运营效率和获客能力。
数据产品的本质是产品,既然是产品,那么首先要回答用户是谁,用户的痛点是什么,产品要解决用户的哪些痛点,即产品给用户带来的价值是什么。对于企业内部数据产品,它的用户是公司的员工,包括销售、BD、运营、产品、技术、客服、管理者等多种角色:解决的痛点是用户对业务发展中的数据监控、问题分析、机会洞察、决策支持等诉求,提供给用户高效率获取数据、合理分析框架、数据辅助业务决策的价值。
数据质量和数据安全是数据产品最基础的要求。阿里数据平台共有四个层次,即数据监控、专题分析、应用分析和数据决策。