【问题标题】:EMR to S3 file writing gives me error java.net.URISyntaxException: Relative path in absolute URIEMR 到 S3 文件写入给我错误 java.net.URISyntaxException:绝对 URI 中的相对路径
【发布时间】:2020-12-01 21:30:31
【问题描述】:

我正在从 EMR 集群运行 pyspark 应用程序。我有两个桶 - 一个输入数据桶 user-data-input 和一个 o/p 数据桶来存储脚本结果 movie-stats。我的写入输出桶的代码

final_df = ratings.join(movie_title, 'movieId', 'left') \
    .select('movieId', 'title', 'release_year', 'avg_rating', 'ratings_count', 'distinct_viewers') \
    .coalesce(1)
final_df.write.csv('s3://movie-stats', header=True, mode='overwrite')

我的 movie-stats 存储桶政策如下。

{
    "Version": "2012-10-17",
    "Id": "Policy1606478144619",
    "Statement": [
        {
            "Sid": "Stmt1606478053538",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::movie-stats/*",
                "arn:aws:s3:::movie-stats"
            ]
        }
    ]
}

我的脚本可以从 S3 存储桶读取数据并运行分析,但在尝试写入 S3 时抛出错误

java.net.URISyntaxException: Relative path in absolute URI: s3://movie-stats.spark-staging-f2e2ecd7-5c42-483a-888c-6a6295b76c0d

我不理解这个错误,也没有从 google 中找到太多信息来了解应该如何为输出提及 S3 路径。

【问题讨论】:

    标签: amazon-s3 amazon-emr


    【解决方案1】:

    我发现了这段代码的问题。 spark 应用程序需要不存在的输出文件夹。所以输出桶 s3://movie-stats 已经存在。所以解决方法是添加一个bucket路径s3://movie-stats/output。

    其次,使用文件覆盖写入 S3 存在问题。所以最终的代码修复是

    final_df.write.csv('s3://movie-stats/output', header=True)
    

    如果再次运行脚本,则需要删除文件夹才能再次加载数据。删除文件的python代码参考AWS EMR Spark: Error writing to S3 - IllegalArgumentException - Cannot create a path from an empty string

    【讨论】:

      【解决方案2】:

      你已经解决了,但是根目录很特别,它们永远不会消失。

      为文件系统编写的应用程序从不期望使用 / 作为它们的输出,因此不要将它用作对象存储输出的根。

      【讨论】:

        猜你喜欢
        • 2022-01-17
        • 2018-07-27
        • 1970-01-01
        • 1970-01-01
        • 2017-10-04
        • 1970-01-01
        • 2020-10-19
        • 2010-12-17
        • 1970-01-01
        相关资源
        最近更新 更多