关于amazon-web-services:智能湖仓架构实践利用-Amazon-Redshift-的流式摄取构建实时数仓

71次阅读

共计 6632 个字符,预计需要花费 17 分钟才能阅读完成。

Amazon Redshift 是一种疾速、可扩大、平安且齐全托管的云数据仓库,能够帮忙用户通过规范 SQL 语言简略、经济地剖析各类数据。相比其余任何云数据仓库,Amazon Redshift 可实现高达三倍的性能价格比。数万家客户正在借助 Amazon Redshift 每天解决 EB 级别的数据,借此为高性能商业智能(BI)报表、仪表板利用、数据摸索和实时剖析等剖析工作负载提供弱小能源。

咱们很冲动地为 Amazon Kinesis Data Streams 公布了 Amazon Redshift 流式摄取性能,借此用户无需当时将数据存储在 Amazon Simple Storage Service(Amazon S3)中,即可将 Kinesis 数据流摄取到云数据仓库中。流式摄取能够帮忙用户以极低提早,在几秒钟内将数百 MB 数据摄取到 Amazon Redshift 云数据仓库集群。

本文将介绍如何围绕 Amazon Redshift 云数据仓库创立 Kinesis 数据流,生成并加载流式数据,创立物化视图,并查问数据流并对后果进行可视化出现。此外本文还讲介绍流式摄取的益处和常见用例。

云数据仓库无关流式摄取的需要

很多客户向咱们反馈称想要将批处理剖析能力进一步拓展为实时剖析能力,并以低提早高吞吐量的形式拜访本人存储在数据仓库中的流式数据。此外,还有很多客户心愿将实时剖析后果与数据仓库中的其余数据源相结合,借此取得更丰盛的剖析后果。

Amazon Redshift 流式摄取的次要用例均具备这样的特色:用于解决一直生成的(流式)数据,并且须要在数据生成后很短的工夫(提早)里解决实现。从 IoT 设施到零碎遥测,从公共事业服务到设施定位,数据起源形形色色。

在流式摄取性能公布前,如果心愿从 Kinesis Data Steams 摄取实时数据,须要将数据暂存至 Amazon S3,而后应用 COPY 命令加载。这通常会产生数分钟的提早,并且须要在从数据流加载数据的操作之上建设数据管道。但当初,用户曾经能够间接从数据流摄取数据。

解决方案概述

Amazon Redshift 流式摄取可让用户间接连贯到 Kinesis Data Streams,彻底消除了通过 Amazon S3 暂存数据并载入集群所导致的提早和复杂性。借此,用户能够应用 SQL 命令连贯并拜访流式数据,并间接在数据流的根底上创立具体化试图,借此简化数据管道。物化视图亦可蕴含 ELT(提取、加载和转换)管道所需的 SQL 转换。

定义了物化视图后,即可刷新视图以查问最新流式数据。这意味着咱们能够应用 SQL 对流式数据执行上游解决和转换,并且无需付出额定老本,随后即可应用原有的 BI 和剖析工具进行实时剖析。

Amazon Redshift 流式摄取会作为数据流的使用者来实现本人的工作,物化视图则可看作所要应用的流式数据的登陆区。刷新物化视图时,Amazon Redshift 计算节点会将每个数据分片调配给一个计算切片。每个计算切片会开始解决所调配数据分片中的数据,直到物化视图达到与数据流对等的水平。物化视图的第一次刷新可从数据流的 TRIM_HORIZON 中获取数据,后续刷新则可从上一次刷新所产生的最初一个 SEQUENCE_NUMBER 中读取数据,直到其状态与流式数据实现对等。整个流程如下图所示。

在 Amazon Redshift 中设置流式摄取须要执行两个步骤。首先,咱们须要创立一个内部 Schema 以映射至 Kinesis Data Streams,随后须要创立一个物化视图以便从数据流中拉取数据。物化视图必须可能增量保护。

创立 Kinesis 数据流

首先咱们须要创立接管流式数据的 Kinesis 数据流。

  1. 在 Amazon Kinesis 控制台中抉择 Data streams。
  2. 抉择 Create data stream。
  3. 为 Data stream name 输出 ev_stream_data
  4. 为 Capacity mode 抉择 On-demand。
  1. 按需提供其余配置以创立数据流。

应用 Kinesis Data Generator 生成流式数据

咱们能够应用 Amazon Kinesis Data Generator(KDG)工具和下列模板,以聚合的形式生成 JSON 格局的数据:

{"_id" : "{{random.uuid}}",
   "clusterID": "{{random.number(
        {   "min":1,
            "max":50
        }
    )}}","connectionTime":"{{date.now("YYYY-MM-DD HH:mm:ss")}}","kWhDelivered":"{{commerce.price}}","stationID":"{{random.number(
        {   "min":1,
            "max":467
        }
    )}}","spaceID":"{{random.word}}-{{random.number(
        {   "min":1,
            "max":20
        }
    )}}","timezone":"America/Los_Angeles","userID":"{{random.number(
        {   "min":1000,
            "max":500000
        }
    )}}"
}

下图展现了 KDG 控制台中的模板。

加载参考数据

上一个步骤中,咱们介绍了如何应用 Kinesis Data Generator 将聚合数据载入数据流。本节咱们须要将与电动汽车充电站相干的参考数据载入到集群。

请从奥斯丁市凋谢数据门户下载插电式电动汽车充电站网络数据。将数据集中的经纬度数据拆离开,并将其载入到具备如下 Schema 的表中:

CREATE TABLE ev_station
  (
     siteid                INTEGER,
     station_name          VARCHAR(100),
     address_1             VARCHAR(100),
     address_2             VARCHAR(100),
     city                  VARCHAR(100),
     state                 VARCHAR(100),
     postal_code           VARCHAR(100),
     no_of_ports           SMALLINT,
     pricing_policy        VARCHAR(100),
     usage_access          VARCHAR(100),
     category              VARCHAR(100),
     subcategory           VARCHAR(100),
     port_1_connector_type VARCHAR(100),
     voltage               VARCHAR(100),
     port_2_connector_type VARCHAR(100),
     latitude              DECIMAL(10, 6),
     longitude             DECIMAL(10, 6),
     pricing               VARCHAR(100),
     power_select          VARCHAR(100)
  ) DISTTYLE ALL

创立物化视图

咱们能够应用 SQL 从数据流中拜访本人的数据,并间接在数据流的根底上创立物化视图,借此简化数据管道的搭建。为此请执行如下操作:

  1. 创立一个内部 Schema,以便将数据从 Kinesis Data Streams 映射至 Amazon Redshift 对象:
CREATE EXTERNAL SCHEMA evdata FROM KINESIS
IAM_ROLE 'arn:aws:iam::0123456789:role/redshift-streaming-role';
  1. 创立一个 Amazon Identity and Access Management(IAM)角色(相干策略请参考流式摄取上手指南)。

随后即可创立用于应用流式数据的物化视图。咱们能够抉择应用 SUPER 数据类型来存储 JSON 格局的有效载荷,或应用 Amazon Redshift JSON 函数将 JSON 数据解析为独自的列。本文咱们将应用第二种办法,因为 Schema 曾经定义好了。

  1. 创立物化视图,使其依据数据流中的 UUID 值进行散布,并按 approximatearrivaltimestamp 值排序:
CREATE MATERIALIZED VIEW ev_station_data_extract DISTKEY(5) sortkey(1) AS
    SELECT approximatearrivaltimestamp,
    partitionkey,
    shardid,
    sequencenumber,
    json_extract_path_text(from_varbyte(data, 'utf-8'),'_id')::character(36) as ID,
    json_extract_path_text(from_varbyte(data, 'utf-8'),'clusterID')::varchar(30) as clusterID,
    json_extract_path_text(from_varbyte(data, 'utf-8'),'connectionTime')::varchar(20) as connectionTime,
    json_extract_path_text(from_varbyte(data, 'utf-8'),'kWhDelivered')::DECIMAL(10,2) as kWhDelivered,
    json_extract_path_text(from_varbyte(data, 'utf-8'),'stationID')::DECIMAL(10,2) as stationID,
    json_extract_path_text(from_varbyte(data, 'utf-8'),'spaceID')::varchar(100) as spaceID,
    json_extract_path_text(from_varbyte(data, 'utf-8'),'timezone')::varchar(30) as timezone,
    json_extract_path_text(from_varbyte(data, 'utf-8'),'userID')::varchar(30) as userID
    FROM evdata."ev_stream_data";
  1. 刷新这个物化视图:
REFRESH MATERIALIZED VIEW ev_station_data_extract;

目前的预览版中,物化视图不会主动刷新,因而咱们须要在 Amazon Redshift 中打算一个查问,每分钟刷新一次物化视图。相干阐明请参考在 Amazon Redshift 数据仓库中打算 SQL 查问。

查问数据流

随后即可查问刷新后的物化视图以查看应用状况统计数据:

SELECT to_timestamp(connectionTime, 'YYYY-MM-DD HH24:MI:SS') as connectiontime
,SUM(kWhDelivered) AS Energy_Consumed
,count(distinct userID) AS #Users
from ev_station_data_extract
group by to_timestamp(connectionTime, 'YYYY-MM-DD HH24:MI:SS')
order by 1 desc;

后果如下表所示。

接下来,咱们能够将物化视图与参考数据联接起来,进而剖析过来 5 分钟里充电站的使用量数据,并依照充电站的类型进行细分:

SELECT to_timestamp(connectionTime, 'YYYY-MM-DD HH24:MI:SS') as connectiontime
,SUM(kWhDelivered) AS Energy_Consumed
,count(distinct userID) AS #Users
,st.category
from ev_station_data_extract ext
join ev_station st on
ext.stationID = st.siteid
where approximatearrivaltimestamp > current_timestamp -interval '5 minutes'
group by to_timestamp(connectionTime, 'YYYY-MM-DD HH24:MI:SS'),st.category
order by 1 desc, 2 desc

后果如下表所示。

后果的可视化出现

咱们能够应用 Amazon QuickSight 设置一个简略的可视化出现。相干阐明请参考疾速上手指南:应用样本数据创立一个具备繁多可视化后果的 Amazon QuickSight 剖析。

咱们在 QuickSight 中创立了一个数据集,借此将物化视图与充电站参考数据联接在一起。

随后创立一个能够显示耗电量以及连贯用户随工夫变动的仪表板。该仪表板还会依照类别在地图上显示对应的地点。

流式摄取所带来的益处

本节咱们将介绍流式摄取所能带来的一些益处。

高吞吐量低提早

Amazon Redshift 能以每秒数 GB 的速度接管并解决来自 Kinesis Data Streams 的数据(吞吐量取决于数据流中数据分片的数量以及 Amazon Redshift 集群配置)。借此咱们将能以低提早高带宽的形式应用流式数据,进而在几秒钟之内从数据中取得见解,不再像以往那样期待数分钟。

如上文所述,Amazon Redshift 间接摄取并拉取的办法最大的劣势在于提早更低,通常只需数秒。这与创立流程以应用流式数据,将数据暂存到 Amazon S3,随后运行 COPY 命令将数据载入 Amazon Redshift 的做法造成了显明的比照。因为数据处理过程波及多个环节,后一种办法往往会产生数分钟的提早。

设置简略

流式摄取办法能够轻松上手。Amazon Redshift 中的所有设置与配置均可应用 SQL 实现,绝大部分云数据仓库的用户对此曾经十分相熟了。随后,无需治理简单的管道,即可在几秒钟内取得实时见解。Amazon Redshift 和 Kinesis Data Streams 是齐全托管的,用户无需治理根底构造即可运行本人的流式应用程序。

进步生产力

用户无需学习新的技能或语言,即可在 Amazon Redshift 中应用相熟的 SQL 技能针对散失数据进行丰盛的剖析工作。此外还能够创立其余物化视图,或针对物化视图创立视图,借此间接在 Amazon Redshift 中应用 SQL 实现大部分 ELT 数据管道转换工作。

流式摄取用例

通过对流式数据进行近乎实时的剖析,很多用例和垂直行业特定利用将变为可能。下文列举的仅仅是诸多用例中的一部分:

  • 改善游戏体验:通过剖析来自玩家的实时数据,即可专一于游戏转化率、玩家留存率并优化游戏体验。
  • 剖析在线广告的点击流用户数据:每个客户在一次会话中均匀会拜访几十个网站,然而营销人员通常只能剖析本人网站的拜访数据。咱们能够剖析数据仓库中摄入的已受权点击流数据,借此评估客户的脚印和行为,并即时为客户投放更有针对性的广告。
  • 通过流式 POS 数据进行实时批发剖析:咱们能够拜访并可视化所有寰球销售点(POS)批发交易数据,借此进行实时剖析、报表并可视化。
  • 提供实时的应用程序洞察力:通过拜访并剖析来自应用程序日志文件和网络日志的流式数据,开发者和工程师能够围绕问题进行实时排错,打造更优质的产品,并通过警报揭示采取预防性措施。
  • 实时剖析 IoT 数据:咱们能够将 Amazon Redshift 流式摄取与 Amazon Kinesis 服务配合应用来构建实时应用程序,例如设施状态和属性检测,如地位和传感器数据、应用程序监控、欺诈检测、实时仪表板等。咱们能够应用 Kinesis Data Streams 摄取流式数据,应用 Amazon Kinesis Data Analytics 进行解决,随后应用 Kinesis Data Streams 以极低的端到端提早将后果发送给任何数据存储或应用程序。

总结

本文介绍了如何创立 Amazon Redshift 物化视图,进而应用 Amazon Redshift 流式摄取性能从 Kinesis 数据流摄取数据。借助这个全新性能,咱们能够轻松构建并保护数据管道,借此以低提早、高吞吐量的形式摄取并剖析流式数据。

流式摄取性能目前为预览版,所有提供了 Amazon Redshift 服务的亚马逊云科技区域均已能够应用该性能。若要上手应用 Amazon Redshift 流式摄取,请在您的以后栈上预配一个 Amazon Redshift 集群,并确认您的集群版本不低于 1.0.35480。

详细信息请参考流式摄取(预览),此外也可查看 YouTube 上的应用 Amazon Redshift 流式摄取进行实时剖析演示。

本篇作者

Sam Selvan

亚马逊云科技资深解决方案架构师。

AWS 智能湖仓

正文完
 0