0

我使用的是胶水控制台而不是开发端点。胶水作业能够使用以下代码访问胶水目录和表格

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = 
"glue-db", table_name = "countries")
print "Table Schema:", datasource0.schema()
print "datasource0", datasource0.show() 

现在我想从胶水数据库glue-db 中获取所有表的元数据。我在 awsglue.context api 中找不到函数,因此我使用的是 boto3。

client = boto3.client('glue', 'eu-central-1')
responseGetDatabases = client.get_databases()
databaseList = responseGetDatabases['DatabaseList']
for databaseDict in databaseList:
    databaseName = databaseDict['Name']
    print ("databaseName:{}".format(databaseName))
    responseGetTables = client.get_tables( DatabaseName = databaseName, 
    MaxResults=123)
    print("responseGetDatabases{}".format(responseGetTables))
    tableList = responseGetTables['TableList']
    print("response Object{0}".format(responseGetTables))
    for tableDict in tableList:
        tableName = tableDict['Name']
        print("-- tableName:{}".format(tableName))

代码在 lambda 函数中运行,但在胶水 etl 作业中失败并出现以下错误

botocore.vendored.requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='glue.eu-central-1.amazonaws.com', port=443): 最大重试次数超出 url: / (由 ConnectTimeoutError(, 'Connection to glue .eu-central-1.amazonaws.com 超时。(连接超时=60)'))

问题似乎出在环境配置中。Glue VPC 有两个子网私有子网:使用 s3 端点进行粘合,允许来自 RDS 安全组的入站流量。它有公共子网:在带有 nat 网关的胶水 vpc 中。私有子网可通过门 nat 网关访问。我不确定我在这里缺少什么。

4

3 回答 3

2

在创建 boto3 客户端时尝试使用代理:

from pyhocon import ConfigFactory
service_name = 'glue'


default = ConfigFactory.parse_file('glue-default.conf')
override = ConfigFactory.parse_file('glue-override.conf')

host = override.get('proxy.host', default.get('proxy.host'))
port = override.get('proxy.port', default.get('proxy.port'))

config = Config()

if host and port:
    config.proxies = {'https': '{}:{}'.format(host, port)}

client = boto3.Session(region_name=region).client(service_name=service_name, config=config)

glue-default.conf 和glue-override.conf 通过glue 部署到集群,同时spark 提交到/tmp 目录。

我有一个类似的问题,我通过使用来自胶水的公共图书馆做了同样的事情:s3://aws-glue-assets-eu-central-1/scripts/lib/utils.py

于 2020-04-15T09:26:13.043 回答
0

您能否通过明确指定区域来尝试如下创建 boto 客户端?

client = boto3.client('glue',region_name='eu-central-1')
于 2019-01-07T11:19:10.313 回答
0

当我从 Glue Python Shell 运行此命令时,我遇到了类似的问题。

所以我为 Glue 服务(服务名称:“com.amazonaws.eu-west-1.glue”)创建了端点(VPC->Endpoints),这个被分配到与使用的 Glue 连接相同的子网和安全组在 Glue Python Shell 作业中。

于 2020-05-03T22:08:25.643 回答