如何获取AWS Glue读取BigQuery时访问的所有URL及解决代理阻塞问题
获取连接器访问的所有URL/端点
开启DEBUG日志抓取请求URL
在Glue作业的「作业参数」中添加以下配置,强制Connector输出DEBUG级别的日志:--conf spark.driver.extraJavaOptions=-Dorg.slf4j.simpleLogger.defaultLogLevel=debug --conf spark.executor.extraJavaOptions=-Dorg.slf4j.simpleLogger.defaultLogLevel=debug运行作业后,前往CloudWatch日志组中搜索包含
http、request、endpoint的日志条目,就能找到Connector发起的所有请求URL。Google的BigQuery客户端库会在DEBUG模式下打印完整的请求地址。用tcpdump抓包分析流量
通过Glue作业的生命周期脚本,在EC2工作节点启动时安装tcpdump并执行抓包命令,过滤HTTPS流量:tcpdump -i any port 443 -w /tmp/glue_bq_traffic.pcap作业结束后将抓包文件上传到S3,用Wireshark等工具分析,提取所有目标域名和URL。注意需要给Glue作业的IAM角色添加S3写入权限,以及允许在VPC中执行网络抓包的权限。
参考官方文档整理核心端点
BigQuery Connector依赖的核心端点包括:- BigQuery API:
*.bigquery.googleapis.com - GCS存储端点(数据中转用):
*.storage.googleapis.com - OAuth认证端点:
accounts.google.com/o/oauth2/token
但部分动态生成的分区存储URL可能会用到*.googleapis.com下的其他子域名,建议结合日志补全白名单。
- BigQuery API:
替代实现方法
配置全局JVM代理参数
确保Glue作业的驱动和执行器所有HTTP/HTTPS请求都走指定代理,在作业参数中添加:--conf spark.driver.extraJavaOptions="-Dhttp.proxyHost=你的代理IP -Dhttp.proxyPort=代理端口 -Dhttps.proxyHost=你的代理IP -Dhttps.proxyPort=代理端口" --conf spark.executor.extraJavaOptions="-Dhttp.proxyHost=你的代理IP -Dhttp.proxyPort=代理端口 -Dhttps.proxyHost=你的代理IP -Dhttps.proxyPort=代理端口"若代理需要认证,追加
-Dhttp.proxyUser=用户名 -Dhttp.proxyPassword=密码 -Dhttps.proxyUser=用户名 -Dhttps.proxyPassword=密码即可。检查代理服务器规则
确认代理允许CONNECT方法(HTTPS请求依赖该方法建立隧道),同时放行所有Google相关域名的流量,避免因代理的HTTPS拦截规则导致请求失败。重新配置原生Spark BigQuery Connector
若之前配置失败,可按以下步骤调整:- 上传Google服务账号密钥文件到S3,确保Glue角色有读取权限。
- 在作业参数中添加Hadoop和Spark的核心配置:
--conf spark.hadoop.fs.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem --conf spark.hadoop.google.cloud.auth.service.account.enable=true --conf spark.hadoop.google.cloud.auth.service.account.json.keyfile=s3://你的密钥文件路径.json --conf spark.hadoop.http.proxyHost=你的代理IP --conf spark.hadoop.http.proxyPort=代理端口 - 确保作业依赖的Spark BigQuery Connector版本与Glue的Spark版本兼容,避免版本冲突。
内容的提问来源于stack exchange,提问作者Abhinav S J

