通过在亚马逊 EMR 上提交 spark-submit 添加 postgresql jar

Adding postgresql jar though spark-submit on amazon EMR

我尝试过使用 --driver-class-path 和 --jars 进行 spark-submit 并尝试过这种方法 https://petz2000.wordpress.com/2015/08/18/get-blas-working-with-spark-on-amazon-emr/

关于在命令行中使用 SPARK_CLASSPATH,如

SPARK_CLASSPATH=/home/hadoop/pg_jars/postgresql-9.4.1208.jre7.jar pyspark

我收到这个错误

Found both spark.executor.extraClassPath and SPARK_CLASSPATH. Use only the former.

但是我无法添加它。如何添加 postgresql JDBC jar 文件以从 pyspark 使用它?我正在使用 EMR 版本 4.2

谢谢

1) 清除环境变量:

unset SPARK_CLASSPATH

2) 使用 --jars 选项在您的集群上分发 postgres 驱动程序:

pyspark --jars=/home/hadoop/pg_jars/postgresql-9.4.1208.jre7.jar
//or
spark-submit --jars=/home/hadoop/pg_jars/postgresql-9.4.1208.jre7.jar <your py script or app jar>

spark.driver.extraClassPath 行将 jar 路径添加到 /etc/spark/conf/spark-defaults.conf 解决了我的问题。

我通常使用下面的方法并且效果很好。

1) 第 1 步:使用 bootstrap 操作 shell 脚本下载 postgres 驱动程序 jar:

#!/bin/bash

mkdir -p /home/hadoop/lib/
cd /home/hadoop/lib

wget https://jdbc.postgresql.org/download/postgresql-42.2.12.jar
chmod +x postgresql-42.2.12.jar

2) 第 2 步:在集群 EMR 设置上添加配置 JSON 以将 jar 文件包含到 spark-defaults 文件的执行程序和驱动程序 extraClassPath 中:

{
    "Classification": "spark-defaults",
    "Properties": {
        "spark.executor.extraClassPath": ":/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/goodies/lib/emr-spark-goodies.jar:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/usr/share/aws/emr/s3select/lib/emr-s3-select-spark-connector.jar:/home/hadoop/lib/postgresql-42.2.12.jar",
        "spark.driver.extraClassPath": ":/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/goodies/lib/emr-spark-goodies.jar:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/usr/share/aws/emr/s3select/lib/emr-s3-select-spark-connector.jar:/home/hadoop/lib/postgresql-42.2.12.jar",
    },
}

如果您的 EMR 集群可以访问互联网,您可以使用 Maven:

$ spark-sql --packages org.postgresql:postgresql:42.2.18 --driver-class-path ~/.ivy2/jars/org.postgresql_postgresql-42.2.18.jar

其中 spark-sql 可以替换为 pyspark 或另一个 Spark CLI

这会将 PostgreSQL JDBC 驱动程序和依赖项从 Maven Central 下载到您的 EMR Master,最有可能在 /home/hadoop/.ivy2/jars/(您可以查看 spark 控制台/日志以加倍检查),并将该驱动程序加载到 Spark