尝试从 Spark 在 S3 存储桶上写入数据时找不到类 org.apache.hadoop.fs.s3a.auth.IAMInstanceCredentialsProvider

问题描述 投票:0回答:4

我正在尝试从本地计算机向 S3 存储桶写入数据:

spark = SparkSession.builder \
    .appName('application') \
    .config("spark.hadoop.fs.s3a.access.key", configuration.AWS_ACCESS_KEY_ID) \
    .config("spark.hadoop.fs.s3a.secret.key", configuration.AWS_ACCESS_SECRET_KEY) \
    .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \
    .getOrCreate()

lines = spark.readStream \
    .format('kafka') \
    .option('kafka.bootstrap.servers', kafka_server) \
    .option('subscribe', kafka_topic) \
    .option("startingOffsets", "earliest") \
    .load()

streaming_query = lines.writeStream \
                    .format('parquet') \
                    .outputMode('append') \
                    .option('path', configuration.S3_PATH) \
                    .start()

streaming_query.awaitTermination()

Hadoop版本:3.2.1, Spark 版本 3.2.1

我已将依赖项 jar 添加到 pyspark jar 中:

spark-sql-kafka-0-10_2.12:3.2.1, aws-java-sdk-s3:1.11.375, hadoop-aws:3.2.1,

执行时出现以下错误:

py4j.protocol.Py4JJavaError: An error occurred while calling o68.start.
: java.io.IOException: From option fs.s3a.aws.credentials.provider 
java.lang.ClassNotFoundException: Class 
org.apache.hadoop.fs.s3a.auth.IAMInstanceCredentialsProvider not found
apache-spark amazon-s3 hadoop pyspark spark-streaming
4个回答
14
投票

就我而言,它最终通过添加以下语句起作用:

.config('spark.hadoop.fs.s3a.aws.credentials.provider', 'org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider')

此外,site-package/pyspark/jars 中的所有 hadoop jar 必须为同一版本,hadoop-aws:3.2.2、hadoop-client-api-3.2.2、hadoop-client-runtime-3.2.2、 hadoop-yam-server-web-proxy-3.2.2

对于hadoop-aws 3.2.2版本,需要aws-java-sdk-s3:1.11.563包。

我还用 guava-23.0.jar 替换了 guava-14.0.jar。


0
投票

我和你用的是同一个包。 就我而言,当我添加到该行下方时。

config('spark.hadoop.fs.s3a.aws.credentials.provider', 'org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider')

我收到此错误。

py4j.protocol.Py4JJavaError: An error occurred while calling o56.parquet.
: java.lang.NoSuchMethodError: 'void com.google.common.base.Preconditions.checkArgument(boolean, java.lang.String, java.lang.Object, java.lang.Object)'

....

为了解决这个问题,我安装了`guava-30.0



0
投票

以下配置对我有用

spark=SparkSession.builder.master("local[*]").appName("test") \
     .config("spark.jars.packages", "org.apache.hadoop:hadoop-aws:3.3.2,com.amazonaws:aws-java-sdk-pom:1.12.365") \
     .config('spark.hadoop.fs.s3a.aws.credentials.provider', 'org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider') \
     .config("spark.hadoop.fs.s3a.access.key", '<your access key here>') \
     .config("spark.hadoop.fs.s3a.secret.key", "<your secret key here>") \
     .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \
     .getOrCreate()
© www.soinside.com 2019 - 2024. All rights reserved.