使用本地机器从 s3 读取数据 - pyspark

Posted

技术标签:

【中文标题】使用本地机器从 s3 读取数据 - pyspark【英文标题】:Read data from s3 using local machine - pyspark 【发布时间】:2022-01-11 08:43:16 【问题描述】:
from pyspark.sql import SparkSession
import boto3
import os
import pandas as pd

spark = SparkSession.builder.getOrCreate()

hadoop_conf = spark.sparkContext._jsc.hadoopConfiguration()
hadoop_conf.set("fs.s3.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
hadoop_conf.set("fs.s3a.access.key", "myaccesskey")
hadoop_conf.set("fs.s3a.secret.key", "mysecretkey")
hadoop_conf.set("fs.s3a.endpoint", "s3.amazonaws.com")
hadoop_conf.set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.BasicAWSCredentialsProvider")
hadoop_conf.set("fs.s3a.connection.ssl.enabled", "true")

conn = boto3.resource("s3", region_name="us-east-1")

df = spark.read.csv("s3a://mani-test-1206/test/test.csv", header=True)
df.show()

spark.stop()

运行上面的代码时出现以下错误: java.io.IOException: From option fs.s3a.aws.credentials.provider java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.BasicAWSCredentialsProvider not found

Hadoop 和 aws jars 程序正在使用:

spark-hadoop-distribution: spark-3.2.0-bin-hadoop3.2

hadoop jars:
hadoop-annotations-3.2.0.jar
hadoop-auth-3.2.0.jar
hadoop-aws-3.2.0.jar
hadoop-client-api-3.3.1.jar
hadoop-client-runtime-3.3.1.jar
hadoop-common-3.2.0.jar
hadoop-hdfs-3.2.0.jar

aws jars:
aws-java-sdk-1.11.624.jar
aws-java-sdk-core-1.11.624.jar
aws-java-sdk-dynamodb-1.11.624.jar
aws-java-sdk-s3-1.11.624.jar

任何帮助将不胜感激,谢谢。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。 对我有什么帮助:

将 hadoop-aws-3.2.0 更新到 3.2.2 版本 使用“fs.s3a.aws.credentials.provider”:“org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider”(看起来改名了)

【讨论】:

感谢第二点真的帮助了我。【参考方案2】:

您没有将 instance profile (one type of IAM roles) 正确设置为执行代码的 ec2 实例。

因此它没有适当的权限来访问指定的 s3 存储桶。

其次,查看java库是否最新并支持get aws credential from instance profile。

【讨论】:

您确定“本地机器”是 EC2 实例吗? 是的,错误中明确提到了:IAMInstanceCredentialsProvider not found java.io.IOException: From option fs.s3a.aws.credentials.provider java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.BasicAWSCredentialsProvider not found 当我设置此属性时 hadoop_conf.set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.BasicAWSCredentialsProvider") 否则 IAMInstanceCredentialsProvider 如问题中所述 另外,我使用的凭据是管理员凭据,具有 s3:* 访问权限。我不是从 ec2 实例运行,而是从我的笔记本电脑运行。更新了相关错误。 这就是您遇到问题的原因。如果实例本身没有 ec2 实例配置文件(例如从您的笔记本电脑运行),您的代码需要足够理解和足够灵活,它仍然可以从笔记本电脑的凭证中获取凭证,例如 ~/.aws/credentials 或 AWS ENV AWS_ACCESS_KEY_ID、@987654329 @等

以上是关于使用本地机器从 s3 读取数据 - pyspark的主要内容,如果未能解决你的问题,请参考以下文章

无法从 S3 读取 csv 到 AWS 上 EC2 实例上的 pyspark 数据帧

无法使用本地 PySpark 从 S3 读取 json 文件

NoClassDefFoundError:org/apache/hadoop/fs/StreamCapabilities,同时用火花读取s3数据

如何使用 pyarrow 从 S3 读取镶木地板文件列表作为熊猫数据框?

如何从不同于网络的本地文件中读取 InputStream 对象(通过 Amazon S3)?

无法使用 boto 从 S3 读取密钥,但可以使用 aws cli