智能湖仓2.0实践系列:实时数仓架构搭建

数据库
Amazon Redshift
0
0
{"value":"##### **实时数仓的定义**\n\n\n\n数据仓库最早由 **Bill Inmon** (被称为数据仓库之父)提出,是一种信息系统的资料存储理论,此理论强调利用某些特殊资料存储方式,让所包含的资料,特别有利于分析处理,以产生有价值的信息并依此作决策。 一般来说,数据仓库可由关系数据库或专为数据仓库开发的多维度数据库创建,其架构可分为星状及雪花状架构,包含数个维度资料表及事实资料表。数据仓库存在的主要作用是被企业用来回答各种各样的数据问题,比如一些在各个行业都常见的数据指标的输出:日活跃用户、收入等。\n\n\n\n在大数据时代, 很多企业的数据仓库已经发展成为拥有海量数据以及成千上万张数据表的大型仓储,每天新增的数据量也已经由几年之前的 MB (Megabyte), GB (Gigabyte),增长到现在的 TB (Terabyte) 级别,怎样存储、计算这些数据也已经不再是数据领域的工作人员讨论的热点,随之而来的更重要的话题是如何能在海量数据中快速的获取业务人员所关注的数据,怎样将各个来源的数据都组织起来,以更高效的方式来支撑业务能力的提升,让数据也能体现出来它们真正的价值,因此,**实时数据仓库**应运而生。\n\n![image.png](https://dev-media.amazoncloud.cn/fae800dee6e944faadcabcb484b42e42_image.png)\n\n实时数据仓库顾名思义就是我们将实时查询和分析数据的能力纳入数据仓库中,可以在数据产生后的秒级、分钟级等(不同业务对于实时的定义不同)就可以拿到这些数据,在业务中发挥它们的价值,以提高相应的业务收益。比如游戏行业中在玩家进入游戏时可以从实时数据仓库中查询出这个玩家的活跃程度以及游戏等级,结合这些信息给玩家提供相符合的礼包等;再比如在电商行业,在一次促销活动开始后,运营人员可以及时的关注到活动的效果并采取合适的措施等。\n\n\n\n实时数据仓库区别于离线批处理数据仓库的主要特点是,它运用流式计算相关技术来达到业务对与实时性的要求,比如我们经常听到的 Spark Streaming/Flink/Storm 等。下图是一个支撑了多条业务线的大数据部门当前的离线数据仓库和实时数据仓库的对比。从技术层面来说,目前实时数据仓库常用的有Kafka/Kinesis消息队列,再用 Spark Streaming/Flink 去流式地处理数据,最终提供给数据报表,业务产品,或者作为机器学习相关的业务场景的数据输入。\n\n![image.png](https://dev-media.amazoncloud.cn/629e294c17d6409f8ece89967d79c437_image.png)\n\n##### **云原生数据仓库 Amazon Redshift 实践实时数仓**\n\n\n\nAmazon Redshift 是亚马逊云科技的一款数据仓库产品,它能处理基于列式存储的大数据的分析工作,我们的业务数据仓库也主要基于它来搭建。在亚马逊云科技 2021年的 re:Invent 大会上,Amazon Redshift 也发布了 streaming ingestion 的能力,可以直接在 Amazon Redshift 中通过为 Amazon Kinesis Stream 直接创建一个物化视图,以 SQL 来直接查询 stream 中的数据,数据报表和业务产品都可以准实时地获取到这些数据,这相比于我们之前的架构直接省掉了 Spark Streaming 计算的部分,无论从成本、可维护性上来说都有了大幅度的提升。\n\n![image.png](https://dev-media.amazoncloud.cn/04fe67880c944a1badcd2d6d6e2a1d01_image.png)\n\n接下来我们就来看看基于 Amazon Redshift streaming ingestion 的实时数据仓库是怎么搭建的。\n\n\n\n1. 创建一个 IAM role 用来赋予 Redshift 读取 Kinesis Stream 的权限,创建 role 可参考亚马逊云科技的官方文档进行创建,创建完成之后,需要给这个 role 赋予以下权限的 policy,这里因为我们的 Redshift 可以对所有的 Kinesis Stream 里的数据都进行读取,因此赋予了这个 role 对于所有的 Kinesis Stream Resource 的权限,如果您只需要访问所有 Kinesis Stream 里的其中几个,也可以在这个 policy 中进行配置:\n\n\n```\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"ReadStream\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"kinesis:DescribeStreamSummary\",\n \"kinesis:GetShardIterator\",\n \"kinesis:GetRecords\",\n \"kinesis:DescribeStream\"\n ],\n \"Resource\": \"arn:aws:kinesis:*:000000000000:stream/*\"\n },\n {\n \"Sid\": \"ListStream\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"kinesis:ListStreams\",\n \"kinesis:ListShards\"\n ],\n \"Resource\": \"*\"\n }\n ]\n}\n```\n亚马逊云科技的官方文档:\n\n[https://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/authorizing-redshift-service.html](https://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/authorizing-redshift-service.html)\n\n\n\n2.接下来我们需要在 Redshift 中创建一个 External Schema ,可以在亚马逊云科技管理控制台中打开你的 Redshift 点击“Query editor”或者“Query editor v2”,提前复制好在第一步创建的 IAM role 的 ARN(在亚马逊云科技管理控制台 IAM 服务中可以看到),在 Query editor 中执行以下 SQL:\n\n```\nCREATE EXTERNAL SCHEMA kpi_events FROM KINESIS\nIAM_ROLE 'arn:aws:iam::000000000000:role/redshift-xxxxxxxx-role';\n```\n3.创建一个 Kinesis Stream 在 Redshift 中的物化视图,其中 stream 名字以*进行保密处理。\n\n```\nCREATE MATERIALIZED VIEW raw_kpi_events DISTKEY(5) sortkey(1) AS\n SELECT approximatearrivaltimestamp,\n partitionkey,\n shardid,\n sequencenumber,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'_id')::character(36) as ID,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'gameId')::varchar(30) as gameId,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'eventTime')::varchar(20) as eventTime,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'revenue')::DECIMAL(10,2) as revenue,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'productId')::varchar(20) as productId,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'productName')::varchar(100) as productName,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'timezone')::varchar(30) as timezone,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'appVersion')::varchar(30) as appVersion,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'deviceName')::varchar(30) as deviceName,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'osVersion')::varchar(30) as osVersion,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'userID')::varchar(30) as userID\n FROM kpi_events.\"*********-stream\";\n\n-- *********-stream 代表你的Kinesis Data Stream的名字\n```\n\n4.刷新您创建的物化视图。\n\n```\nREFRESH MATERIALIZED VIEW raw_kpi_events;\n```\n![image.png](https://dev-media.amazoncloud.cn/ef309ccac14d491282dcc10ecdcb59a8_image.png)\n\n5.查询物化视图中的数据,在 payload 字段就可以看到 stream 中的数据了。\n\n```\nSELECT * FROM raw_kpi_events LIMIT 100;\n```\n\n![image.png](https://dev-media.amazoncloud.cn/3f10c3c1c5cd4d67838be20673d2d358_image.png)\n\npayload 中的格式为 JSON,以下为例子:\n\n```\n{\n \"_id\":\"271428af-2254-4b49-a669-583324a973c1\",\n \"gameId\":\"48\",\n \"eventTime\":\"2022-09-26 15:27:17\",\n \"revenue\":\"37.00\",\n \"productId\":\"103832\",\n \"productName\":\"p-18\",\n \"timezone\":\"America/Los_Angeles\",\n \"appVersion\":\"2.0.8.1\",\n \"deviceName\":\"HUAWEI\",\n \"osVersion\":\"10.0.1\",\n \"userID\":\"453292\"\n}\n```\n\n\n如果你想体验整个过程,可以参考以下亚马逊云科技的文档,可以自行创建一个 Kinesis Data Stream,用 Amazon Kinesis Data Generator 往你的 stream 中传入一些模拟的数据,进行试验。\n\n\n\n亚马逊云科技参考文档:\n\n[https://docs.aws.amazon.com/zh_cn/redshift/latest/dg/materialized-view-streaming-ingestion-example-station-data.html](https://docs.aws.amazon.com/zh_cn/redshift/latest/dg/materialized-view-streaming-ingestion-example-station-data.html)\n\nAmazon Kinesis Data Generator:\n\n[https://awslabs.github.io/amazon-kinesis-data-generator/web/producer.html?](https://awslabs.github.io/amazon-kinesis-data-generator/web/producer.html?)\n\n\n\n6.在 Redshift 中或者实时数据报表中查看、分析数据。\n\n![image.png](https://dev-media.amazoncloud.cn/2367a13b8b68471497beb591c1914f58_image.png)\n\n以上就是我们当前的业务使用 Amazon Redshift streaming ingestion 搭建实时数据仓库的一个过程示例,需要提一下的是目前刷新物化视图这一步需要手动跑,不过也可以把它做成一个 Redshift 的 Schedule Query 让它每分钟或每n分钟跑一次, Schedule Query 也支持 crontab 的格式,如下图所示:\n\n![image.png](https://dev-media.amazoncloud.cn/7f13c74f48fd42e5877ab465ab4a3bc2_image.png)\n\n欢迎同样使用了 Redshift 这个功能的小伙伴在评论区交流,大家一起讨论在实时数据仓库这个技术领域的更多话题!\n\n**本篇作者**\n\n![image.png](https://dev-media.amazoncloud.cn/3fdd35e11f24462cbebe31ddf554636c_image.png)\n\n**贾婷** \n\n亚马逊云科技快速原型解决方案架构师,致力于帮助客户设计和开发大数据方向的快速原型方案,有游戏、汽车行业的大数据开发经验。","render":"<h5><a id=\"_0\"></a><strong>实时数仓的定义</strong></h5>\n<p>数据仓库最早由 <strong>Bill Inmon</strong> (被称为数据仓库之父)提出,是一种信息系统的资料存储理论,此理论强调利用某些特殊资料存储方式,让所包含的资料,特别有利于分析处理,以产生有价值的信息并依此作决策。 一般来说,数据仓库可由关系数据库或专为数据仓库开发的多维度数据库创建,其架构可分为星状及雪花状架构,包含数个维度资料表及事实资料表。数据仓库存在的主要作用是被企业用来回答各种各样的数据问题,比如一些在各个行业都常见的数据指标的输出:日活跃用户、收入等。</p>\n<p>在大数据时代, 很多企业的数据仓库已经发展成为拥有海量数据以及成千上万张数据表的大型仓储,每天新增的数据量也已经由几年之前的 MB (Megabyte), GB (Gigabyte),增长到现在的 TB (Terabyte) 级别,怎样存储、计算这些数据也已经不再是数据领域的工作人员讨论的热点,随之而来的更重要的话题是如何能在海量数据中快速的获取业务人员所关注的数据,怎样将各个来源的数据都组织起来,以更高效的方式来支撑业务能力的提升,让数据也能体现出来它们真正的价值,因此,<strong>实时数据仓库</strong>应运而生。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/fae800dee6e944faadcabcb484b42e42_image.png\" alt=\"image.png\" /></p>\n<p>实时数据仓库顾名思义就是我们将实时查询和分析数据的能力纳入数据仓库中,可以在数据产生后的秒级、分钟级等(不同业务对于实时的定义不同)就可以拿到这些数据,在业务中发挥它们的价值,以提高相应的业务收益。比如游戏行业中在玩家进入游戏时可以从实时数据仓库中查询出这个玩家的活跃程度以及游戏等级,结合这些信息给玩家提供相符合的礼包等;再比如在电商行业,在一次促销活动开始后,运营人员可以及时的关注到活动的效果并采取合适的措施等。</p>\n<p>实时数据仓库区别于离线批处理数据仓库的主要特点是,它运用流式计算相关技术来达到业务对与实时性的要求,比如我们经常听到的 Spark Streaming/Flink/Storm 等。下图是一个支撑了多条业务线的大数据部门当前的离线数据仓库和实时数据仓库的对比。从技术层面来说,目前实时数据仓库常用的有Kafka/Kinesis消息队列,再用 Spark Streaming/Flink 去流式地处理数据,最终提供给数据报表,业务产品,或者作为机器学习相关的业务场景的数据输入。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/629e294c17d6409f8ece89967d79c437_image.png\" alt=\"image.png\" /></p>\n<h5><a id=\"_Amazon_Redshift__20\"></a><strong>云原生数据仓库 Amazon Redshift 实践实时数仓</strong></h5>\n<p>Amazon Redshift 是亚马逊云科技的一款数据仓库产品,它能处理基于列式存储的大数据的分析工作,我们的业务数据仓库也主要基于它来搭建。在亚马逊云科技 2021年的 re:Invent 大会上,Amazon Redshift 也发布了 streaming ingestion 的能力,可以直接在 Amazon Redshift 中通过为 Amazon Kinesis Stream 直接创建一个物化视图,以 SQL 来直接查询 stream 中的数据,数据报表和业务产品都可以准实时地获取到这些数据,这相比于我们之前的架构直接省掉了 Spark Streaming 计算的部分,无论从成本、可维护性上来说都有了大幅度的提升。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/04fe67880c944a1badcd2d6d6e2a1d01_image.png\" alt=\"image.png\" /></p>\n<p>接下来我们就来看看基于 Amazon Redshift streaming ingestion 的实时数据仓库是怎么搭建的。</p>\n<ol>\n<li>创建一个 IAM role 用来赋予 Redshift 读取 Kinesis Stream 的权限,创建 role 可参考亚马逊云科技的官方文档进行创建,创建完成之后,需要给这个 role 赋予以下权限的 policy,这里因为我们的 Redshift 可以对所有的 Kinesis Stream 里的数据都进行读取,因此赋予了这个 role 对于所有的 Kinesis Stream Resource 的权限,如果您只需要访问所有 Kinesis Stream 里的其中几个,也可以在这个 policy 中进行配置:</li>\n</ol>\n<pre><code class=\"lang-\">{\n &quot;Version&quot;: &quot;2012-10-17&quot;,\n &quot;Statement&quot;: [\n {\n &quot;Sid&quot;: &quot;ReadStream&quot;,\n &quot;Effect&quot;: &quot;Allow&quot;,\n &quot;Action&quot;: [\n &quot;kinesis:DescribeStreamSummary&quot;,\n &quot;kinesis:GetShardIterator&quot;,\n &quot;kinesis:GetRecords&quot;,\n &quot;kinesis:DescribeStream&quot;\n ],\n &quot;Resource&quot;: &quot;arn:aws:kinesis:*:000000000000:stream/*&quot;\n },\n {\n &quot;Sid&quot;: &quot;ListStream&quot;,\n &quot;Effect&quot;: &quot;Allow&quot;,\n &quot;Action&quot;: [\n &quot;kinesis:ListStreams&quot;,\n &quot;kinesis:ListShards&quot;\n ],\n &quot;Resource&quot;: &quot;*&quot;\n }\n ]\n}\n</code></pre>\n<p>亚马逊云科技的官方文档:</p>\n<p><a href=\"https://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/authorizing-redshift-service.html\" target=\"_blank\">https://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/authorizing-redshift-service.html</a></p>\n<p>2.接下来我们需要在 Redshift 中创建一个 External Schema ,可以在亚马逊云科技管理控制台中打开你的 Redshift 点击“Query editor”或者“Query editor v2”,提前复制好在第一步创建的 IAM role 的 ARN(在亚马逊云科技管理控制台 IAM 服务中可以看到),在 Query editor 中执行以下 SQL:</p>\n<pre><code class=\"lang-\">CREATE EXTERNAL SCHEMA kpi_events FROM KINESIS\nIAM_ROLE 'arn:aws:iam::000000000000:role/redshift-xxxxxxxx-role';\n</code></pre>\n<p>3.创建一个 Kinesis Stream 在 Redshift 中的物化视图,其中 stream 名字以*进行保密处理。</p>\n<pre><code class=\"lang-\">CREATE MATERIALIZED VIEW raw_kpi_events DISTKEY(5) sortkey(1) AS\n SELECT approximatearrivaltimestamp,\n partitionkey,\n shardid,\n sequencenumber,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'_id')::character(36) as ID,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'gameId')::varchar(30) as gameId,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'eventTime')::varchar(20) as eventTime,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'revenue')::DECIMAL(10,2) as revenue,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'productId')::varchar(20) as productId,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'productName')::varchar(100) as productName,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'timezone')::varchar(30) as timezone,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'appVersion')::varchar(30) as appVersion,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'deviceName')::varchar(30) as deviceName,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'osVersion')::varchar(30) as osVersion,\n json_extract_path_text(from_varbyte(data, 'utf-8'),'userID')::varchar(30) as userID\n FROM kpi_events.&quot;*********-stream&quot;;\n\n-- *********-stream 代表你的Kinesis Data Stream的名字\n</code></pre>\n<p>4.刷新您创建的物化视图。</p>\n<pre><code class=\"lang-\">REFRESH MATERIALIZED VIEW raw_kpi_events;\n</code></pre>\n<p><img src=\"https://dev-media.amazoncloud.cn/ef309ccac14d491282dcc10ecdcb59a8_image.png\" alt=\"image.png\" /></p>\n<p>5.查询物化视图中的数据,在 payload 字段就可以看到 stream 中的数据了。</p>\n<pre><code class=\"lang-\">SELECT * FROM raw_kpi_events LIMIT 100;\n</code></pre>\n<p><img src=\"https://dev-media.amazoncloud.cn/3f10c3c1c5cd4d67838be20673d2d358_image.png\" alt=\"image.png\" /></p>\n<p>payload 中的格式为 JSON,以下为例子:</p>\n<pre><code class=\"lang-\">{\n &quot;_id&quot;:&quot;271428af-2254-4b49-a669-583324a973c1&quot;,\n &quot;gameId&quot;:&quot;48&quot;,\n &quot;eventTime&quot;:&quot;2022-09-26 15:27:17&quot;,\n &quot;revenue&quot;:&quot;37.00&quot;,\n &quot;productId&quot;:&quot;103832&quot;,\n &quot;productName&quot;:&quot;p-18&quot;,\n &quot;timezone&quot;:&quot;America/Los_Angeles&quot;,\n &quot;appVersion&quot;:&quot;2.0.8.1&quot;,\n &quot;deviceName&quot;:&quot;HUAWEI&quot;,\n &quot;osVersion&quot;:&quot;10.0.1&quot;,\n &quot;userID&quot;:&quot;453292&quot;\n}\n</code></pre>\n<p>如果你想体验整个过程,可以参考以下亚马逊云科技的文档,可以自行创建一个 Kinesis Data Stream,用 Amazon Kinesis Data Generator 往你的 stream 中传入一些模拟的数据,进行试验。</p>\n<p>亚马逊云科技参考文档:</p>\n<p><a href=\"https://docs.aws.amazon.com/zh_cn/redshift/latest/dg/materialized-view-streaming-ingestion-example-station-data.html\" target=\"_blank\">https://docs.aws.amazon.com/zh_cn/redshift/latest/dg/materialized-view-streaming-ingestion-example-station-data.html</a></p>\n<p>Amazon Kinesis Data Generator:</p>\n<p><a href=\"https://awslabs.github.io/amazon-kinesis-data-generator/web/producer.html?\" target=\"_blank\">https://awslabs.github.io/amazon-kinesis-data-generator/web/producer.html?</a></p>\n<p>6.在 Redshift 中或者实时数据报表中查看、分析数据。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/2367a13b8b68471497beb591c1914f58_image.png\" alt=\"image.png\" /></p>\n<p>以上就是我们当前的业务使用 Amazon Redshift streaming ingestion 搭建实时数据仓库的一个过程示例,需要提一下的是目前刷新物化视图这一步需要手动跑,不过也可以把它做成一个 Redshift 的 Schedule Query 让它每分钟或每n分钟跑一次, Schedule Query 也支持 crontab 的格式,如下图所示:</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/7f13c74f48fd42e5877ab465ab4a3bc2_image.png\" alt=\"image.png\" /></p>\n<p>欢迎同样使用了 Redshift 这个功能的小伙伴在评论区交流,大家一起讨论在实时数据仓库这个技术领域的更多话题!</p>\n<p><strong>本篇作者</strong></p>\n<p><img src=\"https://dev-media.amazoncloud.cn/3fdd35e11f24462cbebe31ddf554636c_image.png\" alt=\"image.png\" /></p>\n<p><strong>贾婷</strong></p>\n<p>亚马逊云科技快速原型解决方案架构师,致力于帮助客户设计和开发大数据方向的快速原型方案,有游戏、汽车行业的大数据开发经验。</p>\n"}
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭