Airflow调度AWS EMR作业PostgreSQL连接器缺失问题咨询
问题根因说明
- 第一种方案失败原因:① 配置参数写错,
spark.jar是无效参数,正确参数为复数形式spark.jars;② 代码中配置里的S3路径变量不一致,一处用s3_folder一处用s3_path,导致jar包路径错误无法加载。 - 第二种方案失败原因:①
spark.executor.extraClassPath填写了Maven坐标而非本地路径,无法识别;②$HOME变量在Spark集群运行环境中无法被正确解析;③ 自定义classPath时没有按照规范配置,导致Spark内置的JSON解析依赖包加载异常,触发_corrupt_record报错。
可行方案(二选一即可)
方案1:直接使用S3存储的jar包(无需修改bootstrap脚本,推荐)
将postgresql的jdbc jar包上传到S3对应目录后,仅需修改JOB_FLOW_OVERRIDES中的Configurations配置即可,无需调整其他逻辑:
"Configurations": [ { "Classification": "spark-defaults", "Properties": { "spark.jars": "s3://{{ var.value.s3_folder }}/scripts/postgresql-42.2.5.jar", "spark.driver.extraClassPath": "./postgresql-42.2.5.jar", "spark.executor.extraClassPath": "./postgresql-42.2.5.jar" } } ]
说明:spark.jars会自动将S3上的jar包同步到driver和executor的工作目录,对应classPath写相对路径即可识别,不会覆盖原有默认依赖,不影响JSON文件读取。
方案2:通过bootstrap脚本预安装jar包
直接把jar包下载到Spark默认加载依赖的目录,无需额外配置classPath,完全不会影响原有依赖加载:
- 修改bootstrap脚本内容:
#!/bin/bash -xe sudo pip3 install -U \ boto3 \ typing # 直接将jar包下载到Spark默认的依赖加载目录,所有节点启动时自动加载 sudo wget https://jdbc.postgresql.org/download/postgresql-42.2.5.jar -P /usr/lib/spark/jars/
- 删除
JOB_FLOW_OVERRIDES中Configurations里所有和classPath、spark.jars相关的配置即可。
内容的提问来源于stack exchange,提问作者Peterson Davis
相关产品推荐
相关产品推荐

