【问题标题】:No FileSystem for scheme "s3" when trying to read a list of files with Spark from EC2尝试使用 Spark 从 EC2 读取文件列表时,方案“s3”没有文件系统
【发布时间】:2022-03-02 16:11:08
【问题描述】:

我正在尝试提供一个文件列表,以便 spark 在需要时读取它们(这就是为什么我宁愿不使用 boto 或其他任何东西将所有文件预下载到实例上的原因)将它们读入“本地”火花)。

os.environ['PYSPARK_SUBMIT_ARGS'] = "--master local[3] pyspark-shell"
spark = SparkSession.builder.getOrCreate()
spark.sparkContext._jsc.hadoopConfiguration().set('fs.s3.access.key', credentials['AccessKeyId'])
spark.sparkContext._jsc.hadoopConfiguration().set('fs.s3.access.key', credentials['SecretAccessKey'])
spark.read.json(['s3://url/3521.gz', 's3://url/2734.gz'])

不知道local[3] 是关于什么,但没有这个--master 标志,我又遇到了另一个异常:

Exception: Java gateway process exited before sending the driver its port number.

现在,我明白了:

Py4JJavaError: An error occurred while calling o37.json.
: org.apache.hadoop.fs.UnsupportedFileSystemException: No FileSystem for scheme "s3"
...

不确定o37.json 在这里指的是什么,但可能无关紧要。

我看到一堆类似问题的答案,建议添加以下标志:

os.environ['PYSPARK_SUBMIT_ARGS'] = "--packages com.amazonaws:aws-java-sdk-pom:1.10.34,org.apache.hadoop:hadoop-aws:2.7.2 pyspark-shell"

我尝试将它添加到另一个标志的前面,但它不起作用。

就像我在其他答案和互联网上其他地方看到的许多变化一样(使用不同的包和版本),例如:

os.environ['PYSPARK_SUBMIT_ARGS'] = '--master local[*] --jars spark-snowflake_2.12-2.8.4-spark_3.0.jar,postgresql-42.2.19.jar,mysql-connector-java-8.0.23.jar,hadoop-aws-3.2.2,aws-java-sdk-bundle-1.11.563.jar'

【问题讨论】:

    标签: amazon-web-services apache-spark amazon-s3 hadoop pyspark


    【解决方案1】:

    从 S3 读取文件的典型示例如下 -

    另外,您可以通过此答案确保简约结构和必要的模块到位 - java.io.IOException: No FileSystem for scheme: s3

    读取 Parquet - S3

    os.environ['PYSPARK_SUBMIT_ARGS'] = "--packages=com.amazonaws:aws-java-sdk-bundle:1.11.375,org.apache.hadoop:hadoop-aws:3.2.0 pyspark-shell"
    
    
    sc = SparkContext.getOrCreate()
    sql = SQLContext(sc)
    
    hadoop_conf = sc._jsc.hadoopConfiguration()
    
    config = configparser.ConfigParser()
    
    config.read(os.path.expanduser("~/.aws/credentials"))
    
    access_key = config.get("****", "aws_access_key_id")
    secret_key = config.get("****", "aws_secret_access_key")
    session_key = config.get("****", "aws_session_token")
    
    
    hadoop_conf.set("fs.s3.aws.credentials.provider", "org.apache.hadoop.fs.s3.TemporaryAWSCredentialsProvider")
    hadoop_conf.set("fs.s3a.access.key", access_key)
    hadoop_conf.set("fs.s3a.secret.key", secret_key)
    hadoop_conf.set("fs.s3a.session.token", session_key)
    
    s3_path = "s3a://xxxx/yyyy/zzzz/"
    
    sparkDF = sql.read.parquet(s3_path) 
    

    【讨论】:

      猜你喜欢
      • 2020-05-13
      • 1970-01-01
      • 2021-12-12
      • 2021-11-15
      • 2018-08-20
      • 2018-03-26
      • 1970-01-01
      • 2021-05-25
      • 2018-02-11
      相关资源
      最近更新 更多