在亚马逊云科技上构建智能湖仓(上)
通过将不同结构、不同类型、不同来源的相关数据汇总起来并加以分析,用户能够得出更深刻、更丰富的洞察见解。为此,用户需要从不同孤岛中获取所有数据、将其聚合至统一位置(也就是人们常说的「数据湖」),再以此为基础执行分析与机器学习。但在其他用例中,用户也会将数据放置在其他专用存储体系之内,例如存储在数据仓库内以针对结构化数据执行复杂查询并快速获得结果;或者存储在搜索服务中以快速搜索/分析日志数据,进而监控生产系统的运行状况。无论如何,要想从这些数据中获取最佳洞见,用户必须有能力轻松在数据湖与专用存储系统之间移动数据。但随着系统中数据规模的持续增长,数据移动也变得越来越困难。为了解决这一挑战、进而从数据中获取最大收益,亚马逊云科技提出了Lake House“智能湖仓”方案。
在本文中,我们将共同了解如何在亚马逊云科技的云平台上构建智能湖仓,借此从指数级增长的海量数据中获取洞见,并帮助您快速灵活做出决策。这套智能湖仓方案首先指定中央数据湖,再围绕数据湖建立专用数据服务环,同时提供轻松易行的数据往来移动能力,帮助用户从容运用数据资源以及蕴藏其中的重要价值。
智能湖仓方案
作为一类现代化数据架构,智能湖仓方法不仅强调将数据湖与数据仓库集成起来,同时也涉及将数据湖、数据仓库以及所有其他专用服务接入统一且连续的整体。数据湖为我们提供对主体数据的分析环境,而专用分析服务则负责以令人满意的速度为您提供具体用例支持(例如实时仪表板与日志分析功能)。
本文中的智能湖仓方案包含以下几大关键要素:
·可扩展数据湖
·专用数据服务
·无缝数据移动
·统一治理机制
·高效率低成本
下图所示,为真实客户数据与常见数据迁移需求(包括数据分析服务与数据存储间的数据迁移、由内向外、由外向内、周边移动等情况)共同建立的智能湖仓方案。
这样一套分层与组件化数据分析架构,使您可以通过正确的工具完成正确的任务,同时提供以迭代及增量方式构建架构的良好敏捷性。在添加新数据源、发现新的用例/需求以及开发新的分析方法时,我们可以更灵活地调整智能湖仓中的相应组件,借此满足当前及未来的各类需求。
对于我们的这套智能湖仓架构,您可以把它组织成一套五层逻辑堆栈,其中各个层对应着负责满足特定需求的专用组件。
下面,我们将具体介绍这五个层级。但在此之前,不妨先来聊聊智能湖仓架构的数据来源。
数据源
这套智能湖仓架构可供您摄取并分析来自不同来源的数据。无论是业务线(LOB)应用、ERP应用还是CRM应用,大部分数据源都会以固定的间隔生成高度结构化的批量数据。除了内部结构化来源之外,您还可以从现代数据源(例如Web应用程序、移动设备、传感器、视频流以及社交媒体等)处接收数据。这些现代数据源往往会以连续数据流方式生成半结构化乃至非结构化数据。
数据摄取层
智能湖仓架构中的摄取层,负责将数据摄取至智能湖仓的存储层内。它会借助各类协议接入内部及外部数据源,批量或实时摄取数据,再将结果传送至数据仓库乃至智能湖仓存储层的数据湖组件中。
数据存储层
智能湖仓架构中的数据存储层,负责提供持久、可扩展且具有良好成本效益的组件,用以存储及管理大量数据。在智能湖仓架构中,数据仓库与数据湖将原生集成以提供经济高效的存储层体系,用以支持非结构化以及高度结构化和建模数据。存储层会按照不同消费就绪状态对存储数据进行划分,具体包括原始数据、可信数据、丰富数据与建模数据。
数据仓库中的结构化数据存储
数据仓库中存储的是符合标准且高度可信的数据,具体结构化形式则包括传统的星形、雪花形、数据保管库乃至其他非规范化模式。仓库中存储的数据通常获取自高度结构化的内部与外部来源(例如交易系统、关系数据库以及其他结构化运营资源),而且往往以一定的规律保持运作。现代云原生数据仓库通常能够在内置的高性能存储卷中存放经过压缩的PB级列式数据。通过MPP引擎配合快速连接通道,现代云原生数据仓库能够为复杂SQL查询提供低延迟与高执行速度。
为了提供经过严格筛选、一致且受信的数据,在将数据存储至仓库之前,您需要首先通过提取、转换、加载(ETL)或者提取、加载、转换(ELT)管道对源数据进行预处理、验证及转换,借此建立起跨业务域的高可信度真实数据集源。
智能湖仓架构中的结构化与非结构化数据存储
数据湖,是一套用于存储并组织所有数据的集中式数据存储库。它支持以结构化、半结构化以及非结构化等形式存储数据,支持分层存储以高度优化成本,同时可自动扩展以容纳EB级海量数据。常见的数据湖被划分为登陆区、原始区、受信区与策划区几个部分,用于根据数据的消费就绪状态进行分别存储。通常,数据在摄取完成后会被原样存储在数据湖内(无需预先定义schema),借此加快摄取速度并缩短数据探索之前的准备时间。数据湖可以通过多种方法(包括大数据处理与机器学习)对各类数据集进行分析。数据湖与数据仓库间的原生集成,还允许您从仓库存储中移出大量访问频率较低的历史数据,借此降低存储成本。
目录层
目录层负责存储智能湖仓存储层内所托管数据集的业务与技术元数据。在智能湖仓架构中,目录由数据湖与数据仓库共享,并允许用户编写查询。这些查询将把存储在数据湖与数据仓库内的数据合并至同一SQL中,由此跟踪版本化schema与数据集的细粒度分区信息。随着数据集数量的增加,该层还提供搜索功能以保证智能湖仓中的数据集始终可被发现与查询。
智能湖仓接口
在智能湖仓架构中,数据仓库与数据湖在存储乃至公共目录层上保持原生集成,因此能够为处理及消费层提供统一的智能湖仓接口。以此为基础,智能湖仓的处理与消费层组件又可以通过统一的单个智能湖仓接口(例如SQL或Spark)使用存储层内存储的所有数据(分别存储在数据仓库与数据湖内)。这样的架构设计,使您无需沿任一方向在数据仓库及数据湖之间移动数据,即可访问智能湖仓中的所有存储数据。
数据仓库与数据湖间的原生集成,使您得以灵活执行以下操作:
·将EB级别的结构化与非结构化数据存储在极具成本效益的数据湖之内,同时将经过高度策划、建模与整合的结构化数据存储在热数据仓库存储内。
·利用Spark等单一处理框架通过单一管道合并并分析所有数据,包括数据湖中的非结构化数据与数据仓库中的结构化数据。
·构建基于SQL的数据仓库原生ETL或ELT管道,将仓库中的平面关系数据与数据湖内复杂的多层结构化数据相结合。
数据处理层
智能湖仓架构的数据处理层组件负责通过验证、清洗、规范化、转换与扩充等方式将数据转换为可消费状态。处理层提供专用组件执行各类转换,包括数据仓库SQL、大数据处理以及近实时ETL等。
处理层提供与正确的数据集特征(包括大小、格式、schema、速度)、当前处理任务以及可用技术集(SQL、Spark)相匹配的专用组件,由此尽可能加快交付速度。处理层能够经济高效地扩展以处理大量数据,同时支持schema-on-write、schema-on-read、分区数据集以及多种数据格式。处理层还能够访问统一的智能湖仓存储接口与通用目录,由此访问智能湖仓中的所有数据及元数据,进而实现以下优势:
·避免分析处理数据湖与数据仓库时可能导致的数据冗余、非必要数据移动以及ETL代码重复。
·加快交付速度。
数据消费层
智能湖仓架构中的数据消费层负责提供可扩展的高性能组件,利用统一的智能湖仓接口访问存储层中的数据以及目录中的元数据。数据消费层还提供专用分析组件以全面开放分析功能,确保组织内的所有职能角色都能够通过交互式SQL查询、仓库式分析、商务智能仪表板以及机器学习等形式获取洞察见解。
消费层中的组件支持以下功能:
·编写查询与分析/机器学习作业,访问及合并来自传统数据仓库的维度schema以及数据湖托管表(需要配合schema-on-read)。
·处理以各种开放文件格式(例如Avro、Parquet或者ORC)存储的数据湖托管数据集。
·在读取数据湖中托管的大型分区数据集时,通过分区裁剪优化性能与成本。
在本文的后续部分,我们将介绍一套参考架构,展示如何使用亚马逊云科技服务构建智能湖仓逻辑架构中的各个层。在这套方案中,亚马逊云科技服务将托管以下工作:
·提供并管理可扩展、具有良好弹性、安全且成本效益出色的基础设施组件。
·确保各基础设施组件彼此原生集成。
这套方案将帮助您将主要精力集中在以下工作身上:
·快速建立数据与分析管道。
·显著加快新数据的导入速度,并从数据中获取洞见。
·支持多个用户角色。
亚马逊云科技平台上的智能湖仓参考架构
下图所示,为亚马逊云科技平台上的智能湖仓参考架构。
在以下章节中,我们将具体介绍各逻辑层的细节信息。
数据摄取层
智能湖仓参考架构中的摄取层包含一组专用的亚马逊云科技服务,负责将不同来源的数据摄取至智能湖仓存储层内。大部分摄取服务能够直接将数据传递至数据湖与数据仓库存储。此外,其中使用的定制化专用服务还能充分满足以下来源的连接性、数据格式、数据结构与数据速度等具体要求:
·运营数据库源
·软件即服务(SaaS)应用程序
·文件共享
·流式数据源
运营数据库源(OLTP、ERP、CRM等)
摄取层中的AWS Data Migration Service(AWS DMS)组件能够接入多个运营RDBMS与NoSQL数据库,并将其中的数据摄取至数据湖内的Amazon Simple Storage Service(Amazon S3)存储桶中,或者直接摄取至Amazon Redshift数据仓库的staging表。借助AWS DMS,您可以一次性导入源数据,然后再复制源数据库的数据持续变化。
SaaS应用程序
摄取层使用Amazon AppFlow轻松将SaaS应用程序数据摄取至您的数据湖内。只需单击几下,您就可以在Amazon AppFlow中设置无服务器数据获取流。您的数据流可以接入多种SaaS应用程序(例如Salesforce、Marketo以及Google Analytics)、摄取数据,再将结果传递至智能湖仓存储层或者数据湖内的S3存储桶,也可以直接传递至Amazon Redshift数据仓库中的staging表。您可以调度Amazon AppFlow摄取流,或者根据SaaS应用程序内的事件进行即时触发。在将摄取数据传递至智能湖仓存储层之前,您还可以对数据内容加以验证、过滤、映射及脱敏。
文件共享
相当一部分应用程序会将结构化与非结构化数据存储在托管于网络附加存储(NAS)阵列上的文件中。AWS DataSync能够从启用NFS与SMB的NAS设备中快速将数百万个文件、数百TB大小的数据摄取至数据湖登陆区内。DataSync不仅能够自动处理复制作业的脚本、调度并监控转移过程,还能够验证数据完整性并优化网络资源利用率。在完成一轮文件转移之后,DataSync还可监控并将后续发生变更的文件同步至智能湖仓。更重要的是,DataSync是一项完全托管服务,整个设置过程只需要几分钟。
流式数据源
摄取层使用Amazon Kinesis Data Firehose从内部或外部源处接收流式数据,并将其传递至智能湖仓存储层。只需单击几下,您就可以配置Kinesis Data Firehose API端点,供数据源发送流式数据——包括点击流、应用程序与基础设施日志及监控指标,以及设备遥测与传感器读数等物联网数据。Kinesis Data Firehose将执行以下操作:
·缓冲输入流。
·对数据进行分批、压缩、转换、分区与加密。
·将数据作为S3对象传递至数据湖,或作为行传递至Amazon Redshift数据仓库内的staging表。
Kinesis Data Firehose为无服务器服务,不需要额外管理且提供成本模型,您只需要为通过该服务传输及处理的实际数据量付费。Kinesis Data Firehose会自动伸缩以适应传入数据的规模及吞吐量。在构建实时流式分析管道期间,摄取层会直接提供Amazon Kinesis Data Streams。
智能湖仓存储层
Amazon Redshift与Amazon S3为本文中的智能湖仓参考架构提供了统一的原生集成存储层。一般而言,Amazon Redshift负责存储高度规范化、符合标准要求的可信数据,这些结构化数据遵循标准维度schema;对于其他结构化、半结构化与非结构化数据,则由Amazon S3提供EB级别的数据湖存储支持。但Amazon Redshift同样支持半结构化数据,供您在其中摄取及存储半结构化数据。Amazon S3则提供行业领先的可扩展性、数据可用性、安全性与性能表现。开放文件格式允许您使用多种处理及消费层组件对同一批Amazon S3数据执行分析。公共目录层在Amazon S3中负责存储结构化或半结构化数据集的schema。消费该S3数据集的组件通常会在读取数据集时,将这些schema应用于数据集(即schema-on-read)。
Amazon Redshift Spectrum是原生集成智能湖仓存储层中的核心组成部分之一。Redshift Spectrum帮助Amazon Redshift提供一个统一的SQL接口,用以接收及处理SQL语句,并在同一查询内引用及合并托管在数据湖及数据仓库内的数据集。凭借数千个瞬态Redshift Spectrum节点配合Amazon Redshift的复杂查询优化功能,Amazon Redshift能够高效查询存储在Amazon S3中的PB级数据。Redshift Spectrum还能够查询S3数据湖内的分区数据,包括读取使用开源编解码器压缩的数据,并支持包括JSON、CSV、Avro、Parquet、ORC以及Apache Hudi在内的多种开源行或列式存储。
当Redshift Spectrum读取存储在Amazon S3中的数据集时,会将来自公共AWS Lake Formation目录的相应schema应用于数据(即schema-on-read)。借助Redshift Spectrum,您可以建立起执行以下操作的Amazon Redshift原生管道:
·使用Redshift Spectrum将大量历史数据保留在数据湖内,并将最近几个月的热数据摄取至数据仓库中。
·处理附加存储内的热数据与数据湖中的历史数据,由此生成丰富数据集,全程无需执行任何数据移动操作。
·将丰富数据集插入至附加存储中的表内,或者直接插入由数据湖托管的外部表中。
·轻松将大量冷门历史数据由数据仓库转移至成本更低廉的数据湖存储内,且仍保证将其作为Amazon Redshift查询的一部分以供轻松获取。
Amazon Redshift中的高度结构化数据通常负责为交互式查询及高度受信的即时商务智能仪表板提供支持;而Amazon S3内的结构化、非结构化与半结构化数据,则常被用于驱动机器学习、数据科学与大数据处理用例。
AWS DMS与Amazon AppFlow能够将数据从结构化来源直接传递至S3数据湖或Amazon Redshift数据仓库,充分满足用例的具体需求。在摄取数据文件之后,DataSync会将数据存储至Amazon S3。处理层组件可通过单一统一接口(例如Amazon Redshift SQL)访问统一智能湖仓存储层内的数据,并由接口使用Redshift Spectrum将Amazon Redshift集群中存储的数据与Amazon S3的数据加以合并。
在S3数据湖内,结构化与非结构化数据均被存储为S3对象。数据湖内的各S3对象会按存储桶或前缀名称被划分为登陆区、原始区、受信区及策划区等几种类别。对于将数据存储在S3数据湖内的管道,数据将从来源处被直接摄取至登陆区内。接下来,处理层将验证登陆区数据并将结果存储在原始区内或添加相应前缀以供永久存储。之后,处理层对原始区数据执行schema、分区以及其他转换,确保数据达到一致状态,处理后的结果被统一存储在受信区内。最后一步,处理层对受信区数据集进行建模,再将结果与其他数据集进行合并以实施策划,最终结果被存储在策划层内。通常,来自策划层的数据集会被部分或全部纳入Amazon Redshift数据仓库中,以支持那些要求极低访问延迟、或者需要运行高复杂度SQL查询的用例。
各个区内的数据集,通常会根据相应区(原始、受信或策划区)消费模式的匹配键进行分区。参考架构使用GZIP、BZIP以及Snappy等开源编解码器对数据集所对应的S3对象执行压缩,借此降低存储成本并缩短处理层与消费层内的组件读取时间。数据集通常以Parquet及ORC等开源列式存储格式存在,以进一步减少处理层与消费层组件查询某些列子集时所需读取的数据量。Amazon S3提供一系列针对不同用例设计的存储类。其中Amazon S3智能分层存储类专门用于在不影响性能或运营开销的前提下,自动将数据转移至最具成本效益的访问层内。
Amazon Redshift提供PB级数据仓库存储容量,用于存储按维度或非规范化schema建模的高度结构化数据。在Amazon Redshift上,数据将以高压缩比列式格式存储,并分布式存储在高性能节点集群上。各个节点最多提供64 TB高性能托管存储容量。Amazon Redshift会强制执行schema-on-write、ACID事务与工作负载隔离等机制,借此保障数据的高质量与一致性。用户大多在Amazon Redshift上存储高一致性、统一、可信且受控的结构化数据集,借此满足高吞吐量、低延迟与高并发性用例。当然,您也可以使用Amazon Redshift中增量式刷新的物化视图,以显著提高商务智能仪表板中复杂查询的性能与吞吐量。
在通过各种来源获取数据并构建智能湖仓时,我们一般可以直接在整个数据湖及数据仓库中托管数百甚至数千个数据集。中央数据目录将统一为智能湖仓存储(数据仓库与数据湖)内的全部数据集提供元数据,这将大大降低搜索难度、保证智能湖仓能够始终保持良好的数据发现能力。此外,这种将元数据由数据湖托管数据分离至统一中央schema的处理方式,还可帮助处理层/消费层组件及Redshift Spectrum轻松实现schema-on-read。
在本文的智能湖仓参考架构中,Lake Formation提供的中央目录负责存储智能湖仓中托管的全部数据集的元数据(无论数据集实际存储在Amazon S3还是Amazon Redshift内)。用户可以将全部数据集的技术元数据(例如版本化表schema、分区信息、物理数据位置以及更新时间戳等)与业务属性(例如数据所有者、数据管理者、列业务定义以及列信息敏感性等)存储在Lake Formation中。
大部分由数据湖托管的数据集,其schema都在不断变化、数据分区也在持续增加;而由数据仓库托管的数据集schema则大多以受控方式持续演进。AWS Glue crawlers能够跟踪数据湖托管数据集以及数据仓库数据集内不断变化的数据schema与新增分区,并在Lake Formation目录中为相应schema添加新的版本。此外,Lake Formation还提供API,供您使用自定义脚本及第三方产品实现元数据注册与管理。
Lake Formation为数据湖管理员们提供了中央管理位置,可以为数据湖内托管的数据库和表设置细化的表级与列级权限。在设置Lake Formation权限之后,用户和各分组只能使用多个处理层与消费层服务(例如AWS Glue、Amazon EMR、Amazon Athena以及Redshift Spectrum等)访问授权的表和列。
数据处理层
智能湖仓架构中的处理层提供多种专用组件,能够支持各类数据处理用例。为了匹配智能湖仓内各数据集的独特结构(平面表、多层或者非结构化)及速度(批量或流式),您可以灵活选择不同的专用处理组件。各个组件都能够面向Amazon S3与Amazon Redshift(统称为智能湖仓存储)读写数据。
我们可以使用处理层组件构建数据处理作业,这些作业将使用以下接口对存储在数据仓库及数据湖内的数据进行读写:
Amazon Redshift SQL(配合Redshift Spectrum)。
运行在Amazon EMR上的Apache Spark作业。
运行在AWS Glue上的Apache Spark作业。
您可以使用AWS Glue crawlers或Lake Formation API,将结果数据集中的元数据添加到Lake Formation中央目录内。
您也可以使用专用组件构建出能够实现以下功能的数据转换管道:
使用Amazon Redshift(配合Redshift Spectrum)、基于SQL的ELT
使用AWS Glue或Amazon EMR实现的大数据处理
使用Amazon Kinesis实现的近实时流式数据处理。
通过流式无服务器处理获取实时洞见
使用Apache Flink与Amazon Kinesis Data Analytics实现流式ETL
使用Spark Streaming在AWS Glue上实现近实时流式数据处理。
使用Spark Streaming在Amazon EMR上实现近实时流式数据处理。
基于SQL的ELT
要在智能湖仓存储层中转换结构化数据,您可以使用您所熟悉的SQL语义构建起功能强大的ELT管道。这些ELT管道将使用Amazon Redshift中的大规模并发处理(MPP)功能以及Redshift Spectrum功能启动数千个瞬态节点,即时将处理容量扩展至PB级别。Amazon Redshift上基于存储过程的这类ELT管道能够对以下对象进行转换:
·由AWS DMS或Amazon AppFlow直接传递至Amazon Redshift staging表的平面结构化数据
·使用开源文件格式(例如JSON、Avro、Parquet及ORC等)托管在数据湖内的数据
在数据丰富期间,这些管道还可以使用SQL语句将内部维度表与S3数据湖内托管的大型事实表(使用Redshift Spectrum层)连接起来。在最后一步中,数据处理管道可以将经过策划、丰富与建模的数据插入至Amazon Redshift内部表或存储在Amazon S3中的外部表内。