基于AWS Glue Python Shell的Redshift ETL连接问题咨询
Glue Python Shell 连接Redshift 落地配置方案
驱动选型:从根源避免版本冲突
别自己到处找pg8000/psycopg2的whl包上传,90%的依赖冲突都是乱传第三方包覆盖Glue内置依赖导致的:
- 优先用Glue Python Shell环境默认预装的pg8000 1.19.5,完全不需要额外上传依赖。这个版本是AWS官方适配过的,兼容Redshift全版本的认证、SSL校验逻辑,没有底层C依赖,根本不会出现glibc、libpq版本不匹配的问题。
- 如果你有强需求必须用psycopg2,只选
psycopg2-binary==2.9.3的manylinux2014_x86_64 whl包,更高版本依赖的openssl、libpq版本和Glue运行底层的Amazon Linux 2内置库不兼容,装了必报符号表缺失、动态链接库找不到的错。 - 别装redshift-connector、高版本sqlalchemy这类包:Glue内置的boto3、sqlalchemy都是锁版本的,第三方库依赖的botocore版本和内置版本不匹配,装完直接导致所有AWS API调用报错。
连接配置实操
不要硬编码连接信息、手动配VPC网络,直接复用Glue Data Catalog的连接配置,省掉网络、凭证配置的坑:
- 提前在Glue控制台的「连接」模块建好Redshift连接,配置好VPC、子网、安全组(确保安全组放通Glue网段到Redshift 5439端口的入站规则)、数据库用户名密码,测试连通性通过。
- 在你的Python Shell作业配置页,找到「安全配置、脚本库和作业参数」板块,把刚才建好的Redshift关联到作业的「连接」选项里,作业启动时会自动注入网络配置、临时凭证,不用自己在代码里硬写AK/SK。
- 代码里直接从Glue上下文拉取连接配置,不要硬拼连接串,示例代码可以直接用:
import pg8000 from awsglue.context import GlueContext from pyspark.context import SparkContext # Python Shell作业自带轻量Glue上下文,不需要启动Spark集群 sc = SparkContext() glue_ctx = GlueContext(sc) # 拉取预配置的Redshift连接参数,替换成你自己的连接名 conn_conf = glue_ctx.extract_jdbc_conf("redshift-conn-name") # 解析连接地址建立连接 host = conn_conf["url"].split("//")[1].split(":")[0] port = int(conn_conf["url"].split(":")[-1].split("/")[0]) db_name = conn_conf["url"].split("/")[-1] conn = pg8000.connect( host=host, port=port, database=db_name, user=conn_conf["user"], password=conn_conf["password"], ssl_context=True # Redshift强制SSL连接,这个参数别漏 ) # 测试执行Spectrum转换、UNLOAD逻辑就行,计算全在Redshift侧完成 cur = conn.cursor() # 示例:执行你写好的Spectrum转换SQL,最后UNLOAD为Parquet到S3 # cur.execute(""" # UNLOAD ('SELECT * FROM spectrum.your_transformed_table') # TO 's3://your-target-bucket/path/' # IAM_ROLE 'your-redshift-spectrum-role-arn' # FORMAT PARQUET # """) cur.execute("SELECT 1") print(cur.fetchone()) conn.commit() cur.close() conn.close()
这种模式完全匹配你的架构需求:Python Shell只做调度、状态校验,所有计算、格式转换全在Redshift Spectrum侧完成,不需要Spark算力,选1 DPU的Python Shell配置(1vCPU 4G内存)就能跑,成本只有Spark作业的十分之一不到。
常见问题排查
- 报pg8000相关ImportError:直接去作业的S3依赖路径里把你自己上传的pg8000 whl删掉,用内置版本即可,绝大多数情况都是自定义包覆盖了内置适配版本导致的。
- 报SSL握手失败:检查是不是用了低于1.16.0版本的pg8000,老版本不支持Redshift的SSL证书校验规则,还是删自定义包用内置版本解决。
- 报连接超时:检查关联的Glue连接是不是配对了子网和安全组,Redshift集群是不是允许对应安全组的入站访问。
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

