亚马逊AWS官方博客

Glue – “连接“功能介绍& Glue 通过连接对 Redshift 写入数据

在上一篇文章中,我们简单讲述了Glue的组件功能和使用Glue快速构建ETL的 过程。本篇文章里我们简单讲述一下Glue里连接的作用,以及展示两个Demo,强烈建议您看完第一篇文章后,再来看这篇文章。https://aws.amazon.com/cn/blogs/china/glue-function-introduction-build-serverless-etl-quickly/

 

Glue连接的作用:AWS Glue 中的爬网程序和作业使用连接来访问某些类型的数据存储。

何时使用连接?

如果数据存储需要一个连接,则在网络爬取数据存储以在 AWS Glue 数据目录 中对其元数据进行编目时,将使用该连接。任何使用数据存储作为源或目标的作业也将使用该连接。

 

AWS Glue 可以使用 JDBC 协议连接到以下数据存储:

Amazon Redshift

Amazon Relational Database Service

  • Amazon Aurora
  • MariaDB
  • Microsoft SQL Server
  • MySQL
  • Oracle
  • PostgreSQL

可公开访问的数据库

  • Amazon Aurora
  • MariaDB
  • Microsoft SQL Server
  • MySQL
  • Oracle
  • PostgreSQL

 

Demo1 – Glue如何与Redshift连接,将ETL后的数据直接写入到Redshift里,并自己定义Distribute Key和SortKey

准备条件一 : 创建Glue连接Redshift的VPC安全组 – Glue在连接VPC内的服务时,是通过创建一个新的ENI,并使用私网地址连接,所以需要有能够访问VPC服务的Security Group

1 进入VPC或EC2控制页面,选择安全组,点击创建安全组

2 输入安全组名称,描述,选择默认VPC,这里先不添加规则,直接创建

3 安全组创建好之后,选中该安全组,复制安全组 的ID,点击编辑

4 端口范围选择所有TCP端口,来源把安全组ID粘贴上,这样写的意思是只要有相同Security Group的AWS资源就可以访问5439端,点击保存

注意:如果不选择所有端口,在测试连接的时候会报如下错误

 

准备条件二:  创建VPC的S3 Endpoint – Glue在创建连接的时候,需要有访问S3的IAM权限和网络条件,详情参看

https://docs.aws.amazon.com/zh_cn/glue/latest/dg/populate-add-connection.html

1 进入到VPC控制页面,选择终端节点,点击创建终端节点

2 选择s3 endpoint服务,选择默认VPC,这里子网选择私有子网,私有子网定义请看https://docs.aws.amazon.com/zh_cn/vpc/latest/userguide/working-with-vpcs.html,终端节点功能请看https://docs.aws.amazon.com/zh_cn/vpc/latest/userguide/vpc-endpoints.html

3 请注意警告部分,出于安全目的,通常建议使用私有子网+S3 Endpoint来打通VPC和S3或其他托管服务,如果您正在使用公有子网连接S3或其他托管服务,请注意对自己程序的影响

4 点击创建终端节点

 

准备条件三: 准备一份sample数据

1 打开https://mockaroo.com/

2 在sample数据生成中,添加一行日期

3  点击Download Data,并上传到s3,这里我们上传到创建好的s3://myglue-sample-data/rawdata/gluetoredshift/ 下

 

准备条件四:  创建测试用的Redshift

1 进入Redshift控制页面,点击启动集群

2 输入集群标识,数据库名称,用户名密码,端口默认5439,点击继续

3 由于是测试所以我们选择最小机型和单节点,在生产环境中则需要选择多节点,点击继续

4 依次选择,默认VPC,子网(选择设置好的私有子网),选择之前创建好的安全组,IAM角色暂时不选,在生产环境中需要设置相应的IAM策略,具体参考https://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/redshift-iam-authentication-access-control.html

点击继续

5 检查一下参数没问题后,点击启动集群

 

6 集群创建好之后,确认集群是可用状态,数据库也运行正常

 

准备条件五: 创建一个用于测试连接的Role – 该Role必须有访问源数据s3的权限和GlueServiceRole的权限

1 进入IAM控制页面,点击创建角色

2 选择Glue作为使用此角色的服务,点击下一步权限

3 这里需要创建一个新的策略,点击创建策略

4 进入策略编辑页面,把以下S3的权限粘贴进去,这里的S3路径是源数据所在的路径,点击查看策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::myglue-sample-data/rawdata/gluetoredshift/gluetoredshift*"
            ]
        }
    ]
}

5 输入策略的名字AWSGlueServiceRole-gluetoredshift,点击创建策略

注意:这里策略的名字一定要加AWSGlueServiceRole- 的前缀,否则在添加策略的时候无法识别

6 回到第3步的页面,选择两个Role ,AWSGlueServiceRole和刚才创建的AWSGlueServiceRole-gluetoredshift,点击下一步标签

7 输入标签,点击下一步

8 输入角色名称AWSGlueServiceRole-gluetoredshift,点击创建角色

以上条件都准备好之后,开始进入Glue连接的设置

1.进入Glue控制页面,点击添加连接

2.输入连接名字,连接类型选择Amazon Redshift,点击下一步

3.选择刚刚创建好的Redshift集群,输入创建好的Database名字,用户名,密码

4.可以看到系统会默认选择Redshift所在子网和安全组,点击完成

5.选中刚才创建的连接,点击测试连接/p>

6.选择之前创建好的Role,点击测试连接

7.连接成功

8.重复第一章的操作先爬取源数据的数据结构,并写入到mymetastore里,具体步骤省略,确认爬取后的数据表

9.创建写入到Redshift的ETL任务,进入到Glue控制页面,选择添加作业

10.输入作业名字,选择刚才创建的角色,其他默认,点击下一步

11.选择刚才爬取的数据源

12.选择更改架构,点击下一步

13.选择在数据目标中创建表,选择JDBC,选择之前创建的GlueToRedshift连接,数据数据库的名字,点击下一步

14.对字段进行重命名和对date字段类型转换,点击保持作业并编辑脚本

15.进入作业编辑界面,在写入Redshift的时候,指定distkey和sortkey,详细参数见 https://github.com/databricks/spark-redshift

修改如下代码

datasink4 = glueContext.write_dynamic_frame.from_jdbc_conf(frame = dropnullfields3, catalog_connection = "GlueToRedshift", connection_options = {"dbtable": "redshift_table", "database": "fromglue","diststyle":"KEY","distkey":"redshift_id","sortkeyspec":"SORTKEY(redshift_date)"}, redshift_tmp_dir = args["TempDir"], transformation_ctx = "datasink4")

保存,并运行

16.确认任务执行成功后,到Redshift里查询表

17.点开Query Editor执行以下语句

查询新表字段情况

SELECT
  "column","type","distkey","sortkey"
FROM
  PG_TABLE_DEF
WHERE
  tablename = 'redshift_table';

可以看到,已经按照指定参数,并写入了Redshift

 

 

在下一篇文章中,我们继续展示爬虫使用连接的Demo2。

 

本篇作者

韩宇光

AWS解决方案架构师,熟悉互联网的大数据业务场景,有丰富的基于AWS上大数据解决方案的经验,对开源hadoop组件有一定研究。在加入AWS之前,在猎豹移动任职大数据高级运维工程师,有10多年的运维经验,深入理解云架构设计,对云上的运维,Devops,大数据解决方案有丰富的实践经验。