Glue Connector 和 Connection 的关系与区别
Posted Laurence
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Glue Connector 和 Connection 的关系与区别相关的知识,希望对你有一定的参考价值。
AWS Glue作为一种无服务器产品,其运行环境是“不可预知”的,也就是“一个黑盒”,所以如何能连接一些自有数据源是Glue必须考虑并给予满足的,为此,Glue给出的解决方案就是Connector和Connection,一个connector就是一个用于协助访问数据源的程序包(容器镜像或Jar包),如果你要使用一个connector,必须先创建一个针对该connector的connection。一个connection包含了连接一个特定数据源的属性。connector和connections联合起来为目标数据源提供访问通路。本文地址:https://laurence.blog.csdn.net/article/details/129139176,转载请注明出处!
1. 关系与区别
下面是一些明确切且重要的结论:
- 先创建Connector,再创建Connection,后者依附于前者,Connector与Connection是一对多的映射关系
- Connector与Connection非常类似于数据库客户端工具(例如DataGrip)中的Driver和DataSource之间的关系,Connector类似Driver,主要包含JAR包和基础属性(如JDBC类型的Connector需要配置Base的JDBC URL),Connection类似于DataSource,主要包含身份认证信息和网络配置
- 能在Glue控制台上编辑的主要是Custom Connector & Connection,以及Marketplace Connector关联的Connection
- Marketplace Connector是只读的,不可配置,对应Connection可由用户创建和编辑
- Marketplace Connector在架构上有更大的“运作空间”,一般以容器形式运行于EKS/ECS上
- Custom Connector只能是一个Jar包,所以它只有Spark、Athena、JDBC三种类型(对应Glue提供的三种集成API)
- Custom Connection可以独立于Connector存在,依赖Jar包可通过Job Dependent Jar配置给Job,故不一定非要依赖Connector
- 再进一步,如果配置了VPC Connection,再通过Job Dependent Jar配置Jar包,则Connection也可以省去(未必所有的Connection都可以,但测试过部分,确实是可行的)
- 尽管上述两点都已证明可行,还是建议始终使用Custom Connector + Custom Connection的标准方式配置数据源连接。跳过Connector直接创建Custom Connection会丢失一个优势:由于在Glue图形化编辑器上,只有Connector是可以直接拖放的Source/Sink组件,所以如果跳过Custom Connector直接创建Custom Connection,在Glue图形化编辑器上就没有这个数据源对应的连接器可以拖放了。
下图对以上要点进行了总结:
来自于marketplace的connector显然拥有“特权”,它们拥有更加复杂的架构,这些connector往往都有自己docker镜像,并使用ECS/EKS部署和运行镜像,独立的镜像给了connector最大化的定制空间。而自定义connector的“运作空间”远远没有marketplace上的connector大,它不能拥有自定义镜像,只能以jar包形式存在,并依附于Glue的运行环境(通过三套API接口集成),所以,自定义的connector只有三种类型,只能以Jar包形式存在:
- Spark DataSource API -> connectionType=custom.spark
- Amazon Athena Data Source API -> connectionType=custom.athena
- Java JDBC API -> connectionType=custom.jdbc
2. Connection的加载时机
此外,我们一直想找出:Glue的Connection与Spark原生数据加载方式(例如:spark.read.format(“jdbc”))之间到底有什么差异,我们以JDBC类型的Connection做了如下一些测试:
测试场景 | 测试结果 |
---|---|
Custom JDBC Connection + Glue Context with Connection | 成功 |
Custom VPC Connection + Job Dependent Jar + Glue Context with Connection | 成功 |
Custom JDBC Connection + Spark原生数据加载方式 ( spark.read.format(“jdbc”) ) | 失败 |
上述三个测试用例可有力地证明:在Glue中,对于一个数据源的连接配置只能通过Glue专属的GlueContext加载才能生效。关于这一点,我们没有办法从源代码上获得验证,但是一种合理的解释是:我们知道,Glue作为Serverless产品,其工作节点(Worker)的网络环境是不可见的“黑盒”,为了能和目标数据源打通,Glue会根据Connction中的网络配置给它的工作节点创建临时的ENI(虚拟网卡),用于连接到Connection配置的子网中,这些工作节点也因此获得了指定子网内的私有IP地址,从上面的测试结果来看,真正触发Glue去完成这一系列操作的“开关”是在代码中通过GlueContext加载Connection时(根据Spark Lazy Loading的一贯特性,触发的时机可能会更晚,有可能是在初次读取DynamicFrame时),而不是只要在Job属性中关联了一个Connection,在Job启动时就会被自动激活。
3. 重要细节
最后,补充一些测试中的细节:
-
Trino JDBC Driver的URL中user参数不得为空
-
Trino JDBC Driver的URL中user和passoword,只能通过secret manager配置方可生效
-
通过Glue专属的GlueContext加载Connection指的是类似下面的代码:
# author: https://laurence.blog.csdn.net/ Trino_node1676884948138 = glueContext.create_dynamic_frame.from_options( connection_type="custom.jdbc", connection_options= "tableName": "orders", "dbTable": "orders", "jobBookmarkKeys": ["orderkey"], "jobBookmarkKeysSortOrder": "asc", "connectionName": "my-trino-connection", , transformation_ctx="Trino_node1676884948138", )
-
通过Spark原生数据加载方式读取数据源指的是类似下面的代码:
# author: https://laurence.blog.csdn.net/ spark.read .format("jdbc") .option("url", "jdbc:trino://localhost:8889/hive/default") .option("driver", "io.trino.jdbc.TrinoDriver") .option("user", "hadoop") .option("dbtable", "orders") .load() .show()
-
Glue的官方文档对于创建ENI有专门的解释:
AWS Glue sets up elastic network interfaces that enable your jobs to connect securely to other resources within your VPC. Each elastic network interface is assigned a private IP address from the IP address range within the subnet you specified.
4. 相关资源
4.1. 内置Connectors
connectionType | Connects To |
---|---|
custom.* | Spark, Athena, or JDBC data stores (see Custom and AWS Marketplace connectionType values |
documentdb | Amazon DocumentDB (with MongoDB compatibility) database |
dynamodb | Amazon DynamoDB database |
kafka | Kafka or Amazon Managed Streaming for Apache Kafka |
kinesis | Amazon Kinesis Data Streams |
marketplace.* | Spark, Athena, or JDBC data stores (see Custom and AWS Marketplace connectionType values) |
mongodb | MongoDB database |
mysql | MySQL database (see JDBC connectionType Values) |
oracle | Oracle database (see JDBC connectionType Values) |
orc | Files stored in Amazon Simple Storage Service (Amazon S3) in the Apache Hive Optimized Row Columnar (ORC) file format |
parquet | Files stored in Amazon S3 in the Apache Parquet file format |
postgresql | PostgreSQL database (see JDBC connectionType Values) |
redshift | Amazon Redshift database (see JDBC connectionType Values) |
s3 | Amazon S3 |
sqlserver | Microsoft SQL Server database (see JDBC connectionType Values) |
4.2. Marketplace Connectors
通过下面的链接可以查找到Marketplace上所有的连接器:
https://aws.amazon.com/marketplace/search/results?searchTerms=glue+connector
4.3. Custom Connectors
这里有一篇整体介绍,建议先阅读此文:
Developing, testing, and deploying custom connectors for your data stores with AWS Glue
4.3.1. 基于Spark DataSource API的自定义连接器
文档:
示例:
4.3.2. 基Java JDBC API的自定义连接器
文档:
https://docs.aws.amazon.com/glue/latest/ug/connectors-chapter.html#code-jdbc-connector
示例:
4.3.3. 基Java JDBC API的自定义连接器
文档:
https://github.com/aws-samples/aws-glue-samples/tree/master/GlueCustomConnectors/development/Athena
示例:
https://github.com/aws-samples/aws-glue-samples/tree/master/GlueCustomConnectors/development/Athena
本文地址:https://laurence.blog.csdn.net/article/details/129139176,转载请注明出处!
以上是关于Glue Connector 和 Connection 的关系与区别的主要内容,如果未能解决你的问题,请参考以下文章
Glue Connector 和 Connection 的关系与区别
Tomcat连接器Connector源码解读架构概览,如何设计?为什么这样设计?