我无法在本地运行pyspark/spark来从s3读取(截至2023年)

m2xkgtsf  于 2023-11-16  发布在  Spark
关注(0)|答案(1)|浏览(154)

**问题:**在部署到AWS EMR之前,您可能需要在本地运行一些Spark/Pyspark实现来测试逻辑。您正在本地使用s3://路径而不是s3a://。如果您的设计模式在整个项目中与生成基于s3的路径不一致,则可能会发生这种情况。

您可能会遇到以下问题:org.apache.hadoop.fs.UnsupportedFileSystemException: No FileSystem for scheme "s3"或其他与Java相关的问题。
你可以使用localstack或者moto或者其他s3的mocking库。

w1jd8yoj

w1jd8yoj1#

解决方案确定你需要哪些jar文件。你可以通过访问Maven并查找依赖项来实现。

要从EMR之外的其他东西连接到AWS S3(它应该为您抽象出场景背后的jar),您需要使用aws-java-sdk-bundlehadoop-aws jar。
例如,如果您使用的是Spark 3.1.3,那么Hadoop 3.2.0就附带了这个。所以您需要获取Hadoop客户端jar hadoop-aws-3.2.0.jar,并确定它需要的aws-java-sdk-bundle版本。因此,对于hadoop-aws==3.2.0,您可以使用aws-java-sdk-bundle==1.11.375
您需要配置您的spark示例。

  1. SparkSession.builder.master("local[1]")
  2. .appName("pytest")
  3. .config("spark.driver.extraClassPath", f"{SPARK_JARS_LOCATION}/aws-java-sdk-bundle-1.11.375.jar")
  4. .config("spark.executor.extraClassPath", f"{SPARK_JARS_LOCATION}/aws-java-sdk-bundle-1.11.375.jar")
  5. .config("spark.jars", f"{SPARK_JARS_LOCATION}/hadoop-aws-3.2.0.jar")
  6. .config("fs.s3a.endpoint", "http://127.0.0.1:5000")
  7. .config("spark.hadoop.fs.s3.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
  8. )
  9. .enableHiveSupport()
  10. .getOrCreate()

字符串
fs.s3a.endpoint指向mocking服务器,moto for Python。spark.hadoop.fs.s3.impl键将s3://路径转换为s3a://,因为这是支持AWS s3连接器所必需的。
这里假设你已经手动下载了jar文件。如果你想直接从Maven下载jar文件,你可以使用这个配置选项来代替2 extraClassPath和1 spark.jars配置。

  1. .config("spark.jars.packages", "aws-java-sdk-1.11.375.jar")
  2. .config("spark.jars.packages", "hadoop-aws-3.2.0.jar")

展开查看全部

相关问题