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

connectionTypeConnects To
custom.*Spark, Athena, or JDBC data stores (see Custom and AWS Marketplace connectionType values
documentdbAmazon DocumentDB (with MongoDB compatibility) database
dynamodbAmazon DynamoDB database
kafkaKafka or Amazon Managed Streaming for Apache Kafka
kinesisAmazon Kinesis Data Streams
marketplace.*Spark, Athena, or JDBC data stores (see Custom and AWS Marketplace connectionType values)
mongodbMongoDB database
mysqlMySQL database (see JDBC connectionType Values)
oracleOracle database (see JDBC connectionType Values)
orcFiles stored in Amazon Simple Storage Service (Amazon S3) in the Apache Hive Optimized Row Columnar (ORC) file format
parquetFiles stored in Amazon S3 in the Apache Parquet file format
postgresqlPostgreSQL database (see JDBC connectionType Values)
redshiftAmazon Redshift database (see JDBC connectionType Values)
s3Amazon S3
sqlserverMicrosoft 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的自定义连接器

文档:

https://github.com/aws-samples/aws-glue-samples/tree/master/GlueCustomConnectors/development/Spark/glue-3.0

示例:

MinimalSpark3Connector.scala

4.3.2. 基Java JDBC API的自定义连接器

文档:

https://docs.aws.amazon.com/glue/latest/ug/connectors-chapter.html#code-jdbc-connector

示例:

https://github.com/aws-samples/aws-glue-samples/blob/master/GlueCustomConnectors/development/Spark/SparkConnectorMySQL.scala

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源码解读架构概览,如何设计?为什么这样设计?

Tomcat连接器Connector源码解读架构概览,如何设计?为什么这样设计?

extjs发布

使用glue::glue时处理命名空间的更好方法

AWS Glue CDK - 创建作业类型 Spark (Glue 2.0)