未找到 S3AFileSystem:使用笔记本访问 EC2 上的 s3 文件

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

围绕这个问题有多种答案,例如thisthis。我经历了两者,但无法解决问题。这是总结:

  1. 我有一个使用此 AMI 克隆的 EC2:“深度学习 AMI GPU TensorFlow 2.11.0 (Ubuntu 20.04)”

  2. 我通过 ssh 连接到此实例,启动了 jupyter 笔记本。

  3. !pip install pyspark import pyspark

  4. spark 配置是否:

    sc = SparkSession.builder.getOrCreate()  conf = SparkConf().setAppName("SMB_classification") sc._jsc.hadoopConfiguration().set("fs.s3a.access.key",ACCESS_KEY) sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", SECRET_KEY) sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3-us-west-2.amazonaws.com") sc._jsc.hadoopConfiguration().set("com.amazonaws.services.s3.enableV4", "true") sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") sc._jsc.hadoopConfiguration().setInt("fs.s3a.connection.maximum", 100) sc._jsc.hadoopConfiguration().set("fs.s3a.buffer.dir", "/var/tmp/spark") spark = SparkSession(sc)

  5. df=spark.read.parquet('s3a://s3path/file.parquet')

我收到错误:

java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found 

我在 EC2 中看不到 Spark 或 hadoop。

apache-spark amazon-s3 hadoop pyspark
1个回答
0
投票

这就是我解决问题的方法:

正如问题中所解释的,我使用此 AMI 来启动我的 ec2:

深度学习 AMI GPU TensorFlow 2.11.0 (Ubuntu 20.04)

在Jupyter笔记本上,我安装了pyspark,如下所示:

!pip install pyspark
import pyspark

我设置了标准火花。

################################# Spark Config ############################################
sc = SparkSession.builder.getOrCreate()
conf = SparkConf().setAppName("SMB_classification")
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key",key)
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", secret_key)
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "Cloud Object Storage - Amazon S3  - AWS ")
sc._jsc.hadoopConfiguration().set("com.amazonaws.services.s3.enableV4", "true")
sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
sc._jsc.hadoopConfiguration().set("fs.AbstractFileSystem.s3a.impl", "org.apache.hadoop.fs.s3a.S3A")

sc._jsc.hadoopConfiguration().setInt("fs.s3a.connection.maximum", 100)
sc._jsc.hadoopConfiguration().set("fs.s3a.buffer.dir", "/var/tmp/spark")

sql = SQLContext(sc)

spark = SparkSession(sc)

现在,我尝试访问 s3 中的数据集。

df=spark.read.parquet('s3a://s3yodlee-dev/preethy/SMB/train_data.parquet')

收到错误“

java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found
。”

我是怎么解决的?

发现python及相关文件在这里:“/opt/tensorflow/lib/python3.10”(How do you find out where python is ? -which python/find / -name “python”)。

接下来,找到 pyspark 版本 - pyspark。版本:3.5.1。

如何找到 jar?(诚实的答案 - Stackoverflow:Spark 3.1.2 的 hadoop-aws 和 aws-java-sdk 版本兼容性,AWS SDK:java.lang.NoSuchMethodError,未找到 S3AFileSystem:访问 EC2 上的 s3 文件使用笔记本。我没有超越)

哪些是罐子?我添加了这些罐子

aws-java-sdk-1.12.696.jar

aws-java-sdk-bundle-1.12.696.jar

hadoop-aws-3.3.4.jar

hadoop-common-3.4.0.jar

我们应该把罐子放在哪里?

/opt/tensorflow/lib/python3.10/site-packages/pyspark/jars/

© www.soinside.com 2019 - 2024. All rights reserved.