数据分析是当前比较热门的技术,通过利用云计算的资源,更加快速对数据进行收集、处理并分析。本文将从实践角度阐述 AWS 数据湖以及数据分析等产品,是如何帮助企业更加智能的利用数据,从而辅助业务决策。
很久之前,当时的数据量很少,人们都是把数据记在脑中或者记录在纸张上面,想要查看数据的时候,翻开记录就行。
随着科技的进步,产生了越来越多的数据,人们发现数据记录在笔记中变得繁琐且不高效,而且查询数据也变得困难。于是产生了,数据库可以满足海量数据快速地增删改查等需求。
比如现在的移动支付,用户的每笔消费,后台数据库都会快速记录这笔交易;用户在电商平台下的每个订单,后台数据库同样会快速地记录下来,这就会产生海量的数据,而这也只是海量数据的冰山一角。
时间长了,人们发现库里的数据越来越多了,不光要支持联机业务,还要有分析的价值。但是,传统的数据库需要满足频繁、快速的读写需求,并不适合大量读取数据特征进行分析业务。人们开始寻找其他的方法。
当然人类还是很聪明的,既然不能直接在数据库中进行分析,那我应该可以把需要分析的数据导出来,放到一个专门的数据库中面进行分析,在导出的过程中我们还可以对数据进行一些格式转换,这个过程也就是我们常说的 ETL(Extract-Transform-Load)。
这个专门存放加工后数据的地方,我们称之为数据仓库。数据仓库里面的数据主要用于我们后面的数据分析,如用于 BI、报表、经营分析、广告投放等。
那么数据库和数据仓库的区别主要在哪里呢?
虽然应用场景不一样,但数据库和数据仓库都是适用于结构化数据。在相当长的一段时间内,数据库和数据仓库联合,共同满足企业的实时交易型业务和联机分析型的业务。
在过去几十年中,系统、应用程序和设备生成的数据量显著增加。 数据无处不在。 有各种不同结构和格式的数据,如半结构化和非结构化数据,面对多种类型数据分析的需求也越来越复杂。
这个时候,人们又陷入了沉思,该找一个什么样的存储来保存所有的原始数据,并且可以让多个应用进行读取查询。大数据需要使用好所有类型的数据,并不能抛弃这些数据,并且需要近似无限量的存储,这些数据五花八门,又多又杂,该如何存储呢?
索性就挖一个大坑吧,然后把所有的原始格式的数据一股脑地扔进去,这些数据就如同坑中的水,因为数据量巨大,这个坑也就变成了小湖泊。你需要什么数据,直接在湖边挖个沟渠,把数据引入到你的应用上面,这就是我们所说的数据湖的雏形。
那么数据湖到底是什么呢?我们查看一下维基百科上面的解释:
数据湖(Data Lake)是一个以原始格式存储数据的存储库或系统。它按原样存储数据,而无需事先对数据进行结构化处理。一个数据湖可以存储结构化数据(如关系型数据库中的表),半结构化数据(如CSV、日志、XML、JSON),非结构化数据(如电子邮件、文档、PDF)和二进制数据(如图形、音频、视频)。
通过数据湖的定义,我们可以从中找出一些数据湖的特点,或者数据湖满足什么条件。
我觉得数据湖就是一个架构体系,通过它我们可以快速地存储、处理、分析海量的数据,同时可以使用多种多样的手段进行分析,所有的操作都是在安全合规的场景下进行;以数据为导向,实现任意来源、任意速度、任意规模、任意类型数据的全量获取、全量存储和全生命周期管理;还可以通过接口和外面的计算资源交互集成,满足各类企业级应用需求。
数据湖是用于存储大量原始数据的存储库。 由于数据原始且未经处理,因此其加载和更新速度非常快,但数据并未采用适合高效分析的结构。 可以将数据湖看作是在引入数据进行修改并转换为适合执行分析的格式前的暂存点。
有了数据湖,企业分析人员不用在不同的数据仓库和文件存储之间进行频繁切换,也不需要重复地写抽取、加载的逻辑,极大提升了分析人员的的工作效率。
我们上面是介绍了数据湖比较普遍的定义,那么 AWS 是如何定义数据湖的呢?
AWS 定义数据湖是一个集中式存储库,允许用户以任意规模存储所有结构化和非结构化数据。在 AWS 中, Amazon S3 可以实现数据湖的这些功能,因为 Amazon S3 有很多特性可以满足数据湖各式各样的要求,在后面数据存储方面,我们将着重介绍 Amazon S3 的这些特性。
上图中的整个方案是基于 AWS Lake Formation 构建,AWS Lake Formation 本质上是一个管理性质的组件,与其他 AWS 服务互相配合,来完成整个企业级数据湖的构建。上图从左到右,体现了数据获取、数据存储、数据处理、数据分析四个步骤,下面我们将逐一介绍,阐述 AWS 提供的服务是如何帮助我们使用数据湖。
现在,数据更容易收集,托管成本更低,数据获取是整个数据湖构建的起始,既然 Amazon S3 是 AWS 数据湖的存储,那我们该如何把业务数据放入其中呢?
首先,需要判断接入数据的类型,是结构化数据还是非结构化数据,是流式的数据还是批量的数据,然后再选择合适的工具。AWS 针对不同场景提供了丰富的服务,帮助用户将外部数据导入到数据湖 Amazon S3 中。
为了使数据湖中的数据可以统一进行管理,流入的数据需要包括元数据和实际数据两个部分。元数据流入包括数据源创建、元数据抓取两步,最终会形成数据资源目录,并生成对应的安全设置与访问控制策略。
AWS 提供了多种数据提取的服务,如:
这些服务可以把各式各样的数据从外部导入到 Amazon S3 中,具体每个服务的详细功能,AWS 都做了详细的介绍,用户可以参考官方文档进行配置。
数据湖的存储主要是依托于 Amazon S3,Amazon S3 可以理解为数据湖最重要的一部分,Amazon S3 采用传统文件系统的分层目录结构和文件系统语义,同时具备 AWS 提供的安全性和可伸缩性。组织为近乎无限大的文件系统。 其具有以下特征:
AWS 的众多服务都可以和 Amazon S3 无缝结合,如与 Hadoop 分布式文件系统 (HDFS) 兼容,为数据湖的数据注入与摄取提供了强大的支持。
数据处理这一部分主要是利用 AWS Glue 来进行处理,AWS Glue 是 ETL 和数据目录服务,它是无服务器架构,仅为作业实际使用的资源付费,方便易用,威力强大,支持自动 schema 发现,具有可视化 ETL 和代码生成和灵活的任务调度程序,是 AWS 大数据处理中非常重要的一个组件。
AWS Glue 主要组件有数据目录、作业编写、作业执行,下面介绍每个组件可以做什么事情:
总之,借助 AWS Glue,我们无需再去考虑数据源是什么格式,是结构化还是非结构化,AWS Glue 可以自动智能地进行分析,推断出数据架构,数据类型等等。应对底层数据架构不断发生的变化,如果没有 AWS Glue,数据源结构发生变化,用户需要重新去创建数据目录,这些繁琐的事情现在用户不需要再去关系,AWS Glue 可以统统搞定,数据分析人员可以把更多的注意力放在业务实现方面。
AWS Glue 也具备机器学习的能力,可以帮助用户识别不同的数据集中重复的记录,帮助用户进行数据清理和转换,这个功能不需要用户写一行代码,也不需要具备专业机器学习的算法的能力,只需点击几下鼠标即可实现。
在企业里面,一般分析作业都是 BI 报表类型,业务部门把想看的指标告诉数据分析人员,数据分析人员编写 SQL 语句,然后运行结果提供给业务部门查看,但是由于需求的多变和不明确性,这样的过程会反反复复。
这是企业中一个非常典型的场景,但是在实际的使用过程中,客户可能还会需要更加复杂的一些分析手段,比如客户想要通过机器查询、通过 K/V 可以快速地在海量数据中查询需要的结果、想要实现全文检索,或者流式快速对数据进行统计等。
面对以上的问题,我们都可以通过 AWS 提供的服务进行实现。通过 Amazon Redshift 实现交互式查询分析,使用 Amazon EMR 对海量数据进行 ETL 处理和分析,使用 Amazon ElasticSearch 实现全文检索,Amazon Kinesis 实现流式快速数据统计等,借助于 Amazon Athena 可以直接对 Amazon S3 的数据进行 SQL 查询,当下比较流行的机器学习方面也可也借助 Amazon SageMaker 来实现,Amazon SageMaker 可以读取 Amazon S3 中的训练数据,并将训练好的模型回写到 Amazon S3 中。
我们可以看到,在 AWS 数据湖上,这些分析都是通过不同的外部工具来实现,计算由外部的组件实现,存储统一由 Amazon S3 提供,这也是 AWS 数据湖的独特之处,计算与存储分离。
数据的采集和生产最终是为了决策,数据的各种分析要求基本已经满足了企业大部分的需求,那这些分析结果如何以可视化的效果展现从而帮助用户决策呢?
在数据展示方面,AWS 也为用户提供了一款采用云技术的快速商业智能服务 Amazon QuickSight,企业用户可以更加便捷、快速低成本地分析数据。
Amazon QuickSight 的定位是连接用户与数据,它是整个 AWS 生态中离商业决策最近的服务,直接解决大数据应用的 “最后一公里” 问题。它不需要用户有代码能力,可自动识别和整合各种不同的数据源,包括与 Amazon RedShift、Amazon S3、Amazon Athena、Amazon Aurora、Amazon RDS、AWS IAM、AWS CloudTrail、Amazon Cloud Directory 等 AWS 服务的原生集成。提供实时交互式的数据查询方式,并且自动进行数据可视化,最大程度降低了商业决策端用户使用大数据的成本。
在企业数字化转型的过程中,势必会有很多数据分散在各个地方,这些数据如何统一管理?AWS 给出的答案是需要一个统一的数据目录用来注册和管理数据的元数据信息。在 AWS 搭建一个这样的数据目录并不难,使用 AWS Glue Catalog 可以很方便实现。
但是对于一个集中的数据目录,如何管理权限边界变成了一个问题,AWS 是如何管理权限边界的呢?
AWS Glue Catalog 是通过 AWS IAM 对元数据进行精细化控制的,它可以在整个数据目录级别、数据库级别、表级别对不同的 AWS IAM 用户进行授权,非常灵活方便。这些权限管理可以通过 AWS Lake Formation 来实现,AWS Lake Formation 的权限进一步可以细分为数据资源目录访问权限和底层数据访问权限,分别对应元数据和实际存储的数据。实际存储数据的访问权限又进一步分为数据存取权限和数据存储访问权限。
综上,AWS 数据湖方案成熟度高,特别是元数据管理、权限管理上考虑充分,打通了异构数据源与各类计算引擎的上下游关系,让数据能够自由 “移动” 。在流计算和机器学习上,AWS 的解决方案也比较完善。在流计算方面,AWS 推出了专门的流计算组件 Amazon Kinesis,同时 Amazon Kinesis 还可以访问 AWS Glue 中的元数据,这一点也充分体现了 AWS 数据湖解决方案在生态上的完备性。
至此,围绕着数据湖 AWS 提供整个一套大数据解决方案,那么在每个阶段中,不同的数据类型和不同的分析需求应该如何满足,应如何调度和管理一个数据分析的应用呢?
如果我们在 AWS 上面一步步配置的话,那会变得非常困难,毕竟 AWS 围绕数据库有如此众多的服务,服务之间的关联和权限配置变得很复杂,这时候就需要一个工具来帮助用户把这些问题都搞定,AWS Lake Formation 可以帮助用户快速地搭建数据湖,并且也引入了安全管理机制,真正地帮助用户把数据湖保护起来。
说了这么多,那下面我们使用 AWS Lake Formation 去构建一个数据湖吧。
上图是一个数据湖的架构图,我们将准备两份数据 sales 和 customers,会使用 AWS Glue 来存取数据的元数据,在使用 AWS Lake Formation 赋予用户 salesuser 和 customersuser 使用这两个数据表,最终他们将通过 Amazon Athena 来查询需要的数据。
我们准备了两个数据文件,下面把他们各自的字段列举一下:
同样我们也会创建两个用户,分别是 salesuser 和 customersuser,并赋予相应的权限:
下面开始让我们创建吧。
创建用户这里有几个注意事项,我们创建的用户是需要可以登录 AWS Console 控制台,用户赋予以下几项权限:AmazonS3FullAccess, AmazonAthenaFullAccess, CloudWatchLogsReadOnlyAccess, AWSCloudFormationReadOnlyAccess 和 AWSGlueConsoleFullAccess。
因为 AWS Glue crawler 需要从 Amazon S3 中爬取元数据,所以需要给 AWS Glue 创建一个 Role,赋予 PowerUserAccess 的策略。
为数据湖创建一个 Amazon S3 Bucket,命名为 wzlinux-datalake
,然后把数据上传到上面,因为测试环境,我们手动上传这些数据,生产环境都是自动上传更新数据。
在 Bucket 里面创建两个文件夹 data
和 script
,data
这个文件夹主要是存放数据湖数据,script
文件夹后面 Amazon Athena 会使用,作为 Amazon Athena 查询结果输出位置。
在 data
目录下面,创建两个文件夹,一个是 sales
,一个是 customers
,把各自的 csv 文件传到其中。
打开 AWS Lake Formation 控制台,赋予使用的 AWS IAM 用户 administrators 权限。
在 Databases 里面,添加刚刚创建的存储桶作为数据库,用作数据目录,后面会用 AWS Glue 爬取,如下图:
下一步来到 Data Lake locations,把创建的 Amazon S3 作为数据湖存储。
数据湖中的所有数据都需要被数据目录所记录才可以使用,数据目录可以使用 AWS Glue 来爬取创建,下面我们配置数据目录爬取任务。
选择刚刚创建的数据目录 wzlinux-db
,并赋予其爬取 Amazon S3 数据的权限。
权限设置如下。
然后找到 Crawlers,添加一个 Crawlers。
添加 Amazon S3 数据存储的目录。
选择创建好的角色。
选择在 AWS Lake Formation 创建好的数据库作为输出目录。
创建完成之后,运行我们的爬网程序。
爬取完成之后,我们就可以去 AWS Lake Formation 里面去查看数据目录了,可以看到多了两张表。
目前数据湖的数据目录我们已经创建好了,现在我们分别赋予用户对数据目录的操作权限,以满足我们开始的要求。
首先为 salesuser 添加权限,找到 Sales 表,选择 Grant 按钮,添加权限。
同样的方式赋予 customersuser 权限。
权限授权好了,那我们可以分别登陆这两个用户进行数据查询验证。
首先我们登陆 salesuser 用户验证测试,我们可以看到所有的表。
在查询之前,我们需要做一个设定,配置一下结果输出,这也就是之前创建的 script
目录。
然后我们开始查询,结果和我们设定的一样,可以查看所有的列数据。
SELECT * FROM "wzlinux-db"."sales" limit 10;
现在我们登陆另外一个用户查看,只可以看到我们分配的两个列。
同样的进行数据查询,查看一下结果,和开始的设定也一样。
可以看到,所有的测试结果和之前预期的一样,通过整个实验过程,我相信大家对 AWS Lake Formation 如何规范化数据湖有了一定的了解。
这么好的工具,你现在是否也想体验一下呢,目前 AWS Lake Formation 在中国区的北京区域也已经上线,欢迎大家去使用体验 AWS 数据湖的方便之处。