#导入MD文档图片#AWS数据湖

数据分析是当前比较热门的技术,通过利用云计算的资源,更加快速对数据进行收集、处理并分析。本文将从实践角度阐述 AWS 数据湖以及数据分析等产品,是如何帮助企业更加智能的利用数据,从而辅助业务决策。

一、数据湖的由来

很久之前,当时的数据量很少,人们都是把数据记在脑中或者记录在纸张上面,想要查看数据的时候,翻开记录就行。

#导入MD文档图片#AWS数据湖

随着科技的进步,产生了越来越多的数据,人们发现数据记录在笔记中变得繁琐不高效,而且查询数据也变得困难。在这个时候数据库产生了,数据库可以满足快速的增删改查,面对海量数据可以非常快速的进行查询。

#导入MD文档图片#AWS数据湖

比如现在的移动支付,你的每笔消费,后台数据库都会快速记下这笔交易;你在电商平台下的每个订单,后台数据库同样会快速的记录下来,这就会产生海量的数据,这也只是海量数据的冰山一角。

#导入MD文档图片#AWS数据湖

时间长了,人们发现库里的数据越来越多了,不光要支持联机业务,还要有分析的价值。但是,传统的数据库需要满足频繁、快速的读写需求,并不适合大量读取数据特征进行分析业务。人们开始寻找其他的出路。

#导入MD文档图片#AWS数据湖

当然人类还是很聪明的,既然我不能直接在数据库上面进行分析,那我应该可以把需要分析的数据导出来,放到一个专门的数据库上面进行分析,在导出的过程中我们还可以对数据进行一些格式转换,这个过程也就是我们常说的 ETL(Extract-Transform-Load)。

#导入MD文档图片#AWS数据湖

这个专门存放加工后数据的地方,我们称之为数据仓库。仓库里面的数据主要用于我们后面的数据分析,如图用于 BI、报表、经营分析、广告投放等。

那么数据库和数据仓库的区别主要在哪里呢?

  • 数据库:通常为小数据量高频读写,主要用于联机事务。
  • 数据仓库:通常为大数据量读取,主要用于联机分析业务。

虽然应用场景不一样,但他们都是结构化数据。在相当长的一段时间内,他们联合起来,共同满足企业的实时交易型业务和联机分析型的业务。

然而时代在发展,各种各样的数据类型都在产生,如半结构化和非结构化数据,面对多种类型数据分析的需求也越来越复杂。

#导入MD文档图片#AWS数据湖

这个时候,人们有陷入了沉思,该找一个什么样的存储来保存这所有的原始数据,并且可以让多个应用进行读取查询。大数据我们就是要用好所有类型的数据,并不能抛弃这些数据,并且可以接近与无限量的存储,这些数据五花八门,又多又杂,该如何存储呢?

#导入MD文档图片#AWS数据湖

索性就挖一个大坑吧,然后把所有的数据原始格式一股脑的扔进去,这些数据就如同坑中的水,因为数据库巨大,这个坑也就变成了小湖泊。你需要什么数据,直接在湖边挖个沟渠,把数据引入到你的应用上面,这就是我们所说的数据湖的雏形。

#导入MD文档图片#AWS数据湖

什么是数据湖

那么数据湖到底是什么呢?我们查看一下它在*上面的解释:

数据湖(Data Lake)是一个以原始格式存储数据的存储库或系统。它按原样存储数据,而无需事先对数据进行结构化处理。一个数据湖可以存储结构化数据(如关系型数据库中的表),半结构化数据(如CSV、日志、XML、JSON),非结构化数据(如电子邮件、文档、PDF)和二进制数据(如图形、音频、视频)。

通过数据湖的定义,我们可以从中找出一些数据湖的特点,或者数据湖满足什么条件。

  • 数据湖需要能提供足够用的数据存储能力,接近与无限量的存储。
  • 数据湖可以存储各种类型的数据,不限于结构化,包括半结构化和非结构化数据。
  • 数据湖存储的是原始数据,没有经过加工的,产生的数据是什么样存储的就是什么样。
  • 数据湖需要有完善的数据管理能力,可以管理各类数据的相关要素。
  • 数据湖需要具有多样化的分析能力,包括但不限于批处理、流式计算、机器学习等。
  • 数据湖需要具有完善的数据生命周期管理能力。

我觉得数据湖就是一个架构体系,通过它我们可以快速地存储、处理、分析海量的数据,同时可以使用多种多样的手段对其进行分析,所有的操作都是在安全合规的场景下进行;以数据为导向,实现任意来源、任意速度、任意规模、任意类型数据的全量获取、全量存储和全生命周期管理;还可以通过接口和外面的计算资源交互集成,满足各类企业级应用需求。

有了数据湖,企业分析人员不用在不同的数据仓库和文件存储之间进行频繁切换,也不需要重复的写抽取、加载的逻辑,极大提升了分析人员的的工作效率。

二、AWS 数据湖解决方案

我们上面是介绍了数据湖比较普遍的定义,那么 AWS 是如何定义数据湖的呢?

AWS 定义数据湖是一个集中式存储库,允许您以任意规模存储所有结构化和非结构化数据。在 AWS 中, S3 可以实现数据湖的这些功能,因为 S3 有很多特性可以满足数据湖各式各样的要求,在后面数据沉淀方面,我们将着重介绍 S3 的这些特性。

#导入MD文档图片#AWS数据湖

上图整个方案基于 AWS Lake Formation 构建,AWS Lake Formation 本质上是一个管理性质的组件,与其他 AWS 服务互相配合,来完成整个企业级数据湖的构建。上图从左到右,体现了数据获取、数据存储、数据处理、数据分析四个步骤,下面我们来逐一介绍这几个步骤 AWS 提供了哪些服务来帮助我们使用数据湖服务。

数据获取

数据获取是整个数据湖构建的起始,既然 S3 是 AWS 数据湖的存储,那我们该如何把业务数据放入其中呢?

我们首先需要区分的是接入的数据是结构化数据,还是非结构化数据,是流式的数据还是批量的数据等,然后再选择合适的工具,虽然场景这么多,不过你也不用担心,AWS 提供了非常多的服务帮助用户把外部数据导入到数据湖 S3 中

我们需要,包括元数据的流入和业务数据流入两个部分。元数据流入包括数据源创建、元数据抓取两步,最终会形成数据资源目录,并生成对应的安全设置与访问控制策略。

AWS 提供了多种数据提取的服务,如:

  • AWS Snowball:提取离线传感器数据、NAS、本地 Hadoop。
  • Amazon Kinesis Data Firehose:提取 IoT、传感器数据、点击流数据、社交媒体源、流式处理日志。
  • AWS Direct Connect:提取本地数据湖、EDW、大型数据集合。
  • Amazon Database Migration:提取 Oracle、MySQL、MongoDB、DB2、SQL Server、Amazon RDS。
  • AWS Storage Gateway:提取本地 ERP、大型主机、实验室设备、NAS 存储。

这些服务可以把各式各样的数据从外部导入到 S3 中,具体每个服务的详细功能,可以参考官方文档。

数据存储

数据湖的存储主要是依托于 AWS 的 S3,S3 可以理解为数据湖最重要的一部分,这主要也依托于其强大的特性:

  • 提供 11 个 9 的数据持久性。
  • 业界领先的性能和可扩展性。
  • 完善的安全性、满足法律法规要求。
  • 对象粒度级别的权限控制。
  • 适合各类工作负载的存储类。
  • 方便与其他分析服务整合,如 Amazon Athena、Amazon Redshift 和 Amazon EMR。

AWS 的众多服务都可以和 S3 无缝结合,为数据湖的数据注入与摄取提供了强大的支持。

数据处理

数据处理这一部分主要是利用 AWS Glue 来进行处理,AWS Glue 是 ETL 和数据目录服务,它是无服务器架构,仅为作业实际使用的资源付费,方便易用,威力强大,支持自动 schema 发现,具有可视化 ETL 和代码生成和灵活的任务调度程序,是 AWS 大数据处理中非常重要的一个组件。

AWS Glue 主要组件有数据目录、作业编写、作业执行,下面介绍每个组件可以做什么事情:

  • 数据目录
    • Hive 元存储与增强功能兼容
    • 爬网程序自动提取元数据并创建表
    • 与 Athena、Amazon Redshift Spectrum 集成
  • 作业编写
    • 自动生成 ETL 代码
    • 在开源框架上构建,语言为 Python 和 Spark
    • 以开发人员为中心,包括编辑、调试、共享
  • 作业执行
    • 在无服务器 Spark 平台运行作业
    • 提供灵活时间安排
    • 处理依赖关系解析、监控和警报
    • 任务触发方式支持手动触发、定时触发、事件触发,可以和 AWS Lambda 集成

总之,借助 AWS Glue,我们不需要再去考虑数据源是什么格式,是结构化还是非结构化,Glue 都是自动智能的帮我们分析,推断出它的数据架构,数据类型等等,应对底层数据架构不断发生的变化,这些繁琐的事情我们不需要在操作,Glue 可以统统帮我们搞定。这样数据分析人员可以把更多的注意力放在业务实现上面。

Glue 也具备机器学习的能力,可以帮助用户识别不同的数据集中重复的记录,帮助用户进行数据清理和转换,这个功能不需要用户写一行代码,也不需要具备专业机器学习的算法,只需点击记下鼠标即可实现。

数据分析

在企业里面,通常的分析作业一般都是 BI 报表类的,业务部门把想看的指标告诉数据分析人员,数据分析人员编写 SQL,然后跑出结果供业务部门查看,但是由于需求的多变和不明确性,这样的过程会反反复复。

上面是我们一个非常典型的场景,但是在实际的使用过程中,客户可能还会需要更加复杂的一些分析手段,比如客户想要通过机器查询、通过 K/V 可以快速的在海量数据中查询需要的结果、想要实现全文检索,或者流式快速对数据进行统计等。

以上面对的问题,我们都可以通过 AWS 的服务进行实现,我们可以通过 Amazon Redshift 实现交互式查询分析,使用 Amazon EMR 对海量数据进行 ETL 处理和分析,使用 Amazon ElasticSearch 实现全文检索,Kinesis 实现流式快速数据统计等,借助于 Amazon Athena 可以直接对 S3 的数据进行 SQL 查询,包括目录比较流行的机器学习,也可也借助 Amazon SageMaker 来实现,SageMaker 可以读取 S3 中的训练数据,并将训练好的模型回写到 S3 中。

我们可以看到在数据湖上,这些分析都是通过不同的外部工具来实现,计算由外部的组件实现,存储统一由 S3 提供,这也是 AWS 数据湖的独特之处,计算与存储分离。

数据展示

数据的采集和生产最终是为了决策,数据的各种分析要求基本已经满足了我们大部分的需求,那这些分析结果如何以可视化的效果展现出来帮助用户决策呢?

在数据展示方面,AWS 也为客户提供了一款采用云技术的快速商业智能服务 Amazon QuickSight,企业用户可以更加便捷、快速低成本的分析数据。

QuickSight 的定位是连接用户与数据,它是整个 AWS 生态中离商业决策最近的服务,直接解决大数据应用的 “最后一公里” 问题。它不需要用户有代码能力,自动识别和整合各种不同的数据源,包括与 RedShift、S3、Athena、Aurora、RDS、IAM、CloudTrail、Cloud Directory 等 AWS 服务的原生集成。提供实时交互式的数据查询方式,并且自动进行数据可视化,最大程度降低了商业决策端用户使用大数据的成本。

权限管理

在企业数字化转型的过程中,势必会有很多数据分散在各个地方,对于这些数据如何统一管理呢,AWS 给出的答案是需要一个统一的数据目录用来注册和管理数据的元数据信息。搭建一个这样的数据目录很简单,使用 AWS Glue Catalog 很方便就可以实现。

但是对于这样一个集中的数据目录,如何管理权限边界变成了一个问题,AWS 是如何管理权限边界的呢?

在 AWS 上面,Glue catalog 是通过 IAM 对元数据进行精细化控制的,它可以在整个数据目录级别、数据库级别、表级别对不同的 IAM 用户进行授权,非常灵活方便。这些权限管理可以通过 Lake Formation 来实现,Lake Formation 的权限进一步可以细分为数据资源目录访问权限和底层数据访问权限,分别对应元数据和实际存储的数据。实际存储数据的访问权限又进一步分为数据存取权限和数据存储访问权限。

综上,AWS 数据湖方案成熟度高,特别是元数据管理、权限管理上考虑充分,打通了异构数据源与各类计算引擎的上下游关系,让数据能够* “移动” 起来。在流计算和机器学习上,AWS 的解决方案也比较完善。流计算方面 AWS 推出了专门的流计算组件 Kinesis,同时 Kinesis 还可以访问 Glue 中的元数据,这一点也充分体现了 AWS 数据湖解决方案再生态上的完备性。

三、在 AWS 上构建数据湖

至此,围绕着数据湖 AWS 有了整个一套大数据解决方案,那么在每个阶段中不同的数据类型和不同的分析需求应该如何满足,又如何调度和管理一个数据分析的应用呢?

如果我们在 AWS 上面一步步配置的话,那会变得非常困难,毕竟 AWS 围绕数据库有如此众多的服务,这时候需要一个工具来帮助用户把这些问题都搞定,当然 AWS 为了帮助用户快速的搭建数据库而推出的一款产品 AWS Lake Formation,并且也引入了安全管理机制,真正的帮助我们把数据湖保护起来。

说了这么多,那下面我们使用 Lake Formation 去构建一个数据湖吧。

#导入MD文档图片#AWS数据湖

上图是一个数据湖的架构图,我们将准备两份数据 sales 和 customers,会使用 AWS Glue 来存取数据的元数据,在使用 Lake Formation 赋予用户 salesuser 和 customersuser 使用这两个数据表,最终他们将通过 Amazon Athena 来查询需要的数据。

准备数据和用户

我们准备了两个数据文件,下面把他们各自的字段列举一下:

  • customers:{CUSTOMERID, CUSTOMERNAME, EMAIL, CITY, COUNTRY, TERRITORY, CONTACTFIRSTNAME, CONTACTLASTNAME}
  • sales:{ORDERNUMBER, QUANTITYORDERED, PRICEEACH, ORDERLINENUMBER, SALES, ORDERDATE, STATUS, QTR_ID, MONTH_ID, YEAR_ID, PRODUCTLINE, MSRP, PRODUCTCODE, DEALSIZE, CUSTOMERID}

同样我们也会创建两个用户,分别是 salesuser 和 customersuser,并赋予相应的权限:

  • salesuser:可以查看表 sales 的所有列。
  • customersuser:只可以查询表 customers 的 CUSTOMERNAME, EMAIL 列。

下面开始让我们创建吧。

创建 IAM 用户

创建用户这里有几个注意事项,我们创建的用户是需要可以登录 Console 控制台,用户赋予以下几项权限:AmazonS3FullAccess, AmazonAthenaFullAccess, CloudWatchLogsReadOnlyAccess, AWSCloudFormationReadOnlyAccessAWSGlueConsoleFullAccess

#导入MD文档图片#AWS数据湖

#导入MD文档图片#AWS数据湖

创建 IAM Role

因为 AWS Glue crawler 需要从 S3 中爬取元数据,所以需要给 Glue 创建一个 Role,赋予 PowerUserAccess 的策略。

#导入MD文档图片#AWS数据湖

创建 S3 Bucket

为数据湖创建一个 S3 Bucket,命名为 wzlinux-datalake,然后把数据上传到上面,当然因为测试环境,我们手动上传这些数据。

在 Bucket 里面创建两个文件夹 datascriptdata 这个文件夹主要是存放数据湖数据,script 文件夹后面 Amazon Athena 会使用。

#导入MD文档图片#AWS数据湖

data 目录下面,我们创建两个文件夹,一个是 sales,一个是 customers ,把各自的 csv 文件传到其中。

#导入MD文档图片#AWS数据湖

配置数据湖

打开 Lake Formation 控制台,赋予我们使用的 IAM 用户 administrators 权限。

#导入MD文档图片#AWS数据湖

在 Databases 里面,我们添加刚刚创建的存储桶作为数据库,用作我们的数据目录,后面会用 Glue 爬取,如下图:

#导入MD文档图片#AWS数据湖

下一步我们来到 Data Lake locations,把创建的 S3 作为数据湖存储。

#导入MD文档图片#AWS数据湖

爬取数据目录

数据湖中的所有数据都需要被数据目录所记录才可以使用,数据目录可以使用 AWS Glue 来爬取创建,下面我们配置数据目录爬取任务。

选择我们刚刚创建的数据目录 wzlinux-db,并赋予其爬取 S3 数据的权限。

#导入MD文档图片#AWS数据湖

权限设置如下。

#导入MD文档图片#AWS数据湖

然后我们找到 Crawlers,添加一个 Crawlers

#导入MD文档图片#AWS数据湖

#导入MD文档图片#AWS数据湖

添加我们 S3 数据存储的目录。

#导入MD文档图片#AWS数据湖

选择我们创建好的角色。

#导入MD文档图片#AWS数据湖

选择我们在 Lake Formation 创建好的数据库作为输出目录。

#导入MD文档图片#AWS数据湖

创建完成之后,运行我们的爬网程序。

#导入MD文档图片#AWS数据湖

爬取完成之后,我们就可以去 Lake Formation 里面去查看数据目录了,可以看到多了两张表。

#导入MD文档图片#AWS数据湖

赋予用户权限

目前数据湖的数据目录我们已经创建好了,现在我们分别赋予用户对数据目录的操作权限,以满足我们开始的要求。

  • salesuser:可以查看表 sales 的所有列。
  • customersuser:只可以查询表 customers 的 CUSTOMERNAME, EMAIL 列。

首先为 salesuser 添加权限,找到 Sales 表,选择 Grant 按钮,添加权限。

#导入MD文档图片#AWS数据湖

同样的方式赋予 customersuser 权限。

#导入MD文档图片#AWS数据湖

权限授权好了,那我们可以分别登陆这两个用户进行数据查询验证。

数据查询验证

首先我们登陆 salesuser 用户验证测试,我们可以看到所有的表。

#导入MD文档图片#AWS数据湖

在查询之前,我们需要做一个设定,配置一下结果输出,这个也就是我们创建 script 的原因。

#导入MD文档图片#AWS数据湖

然后我们开始查询,结果和我们设定的一样,可以查看所有的列数据。

 SELECT * FROM "wzlinux-db"."sales" limit 10;

#导入MD文档图片#AWS数据湖

现在我们登陆另外一个用户查看,只可以看到我们分配的两个列。

#导入MD文档图片#AWS数据湖

同样的进行数据查询,查看一下结果。

#导入MD文档图片#AWS数据湖

我们可以看到,所有的测试结果和我们预期的一样,通过整个实验过程,我相信大家对 Lake Formation 如何规范化数据湖有了一定的了解。

这么好的工具,你是否也急切的想使用一下呢,目前 Lake Formation 在中国区的北京区域已经上线,欢迎大家去使用体验 AWS 的数据湖的方便之处。

四、经验总结

  • 我个人觉得 AWS 在数据湖方面最好的就是计算存储分离,AWS Glue Data Catalog 维护所有存储/查询系统的元数据,实现计算和存储分开,计算按量付费,节省资源,各种计算模型可以直接从 S3 中获取数据进行分析,使得计算资源可以动态扩展以响应业务的变化。
  • S3 作为数据的存储,成本较 EBS 有巨大的优势,同时还获得了更高的数据持久性和可靠性。
  • 大数据的最终目的是为了机器学习提供能具备生产力的模型。
  • 一个公司中大数据部门真正的价值是产出产品价值,并非一个报表部门自己造*。
  • 数据的统一化方便进行前期特征处理和分析任务。
上一篇:windows操作系统对于程序运行时堆栈的管理的研究


下一篇:C#基础知识之七