【问题标题】:Spark RDD.saveAsTextFile writing empty files to S3Spark RDD.saveAsTextFile 将空文件写入 S3
【发布时间】:2017-01-08 18:53:13
【问题描述】:

我正在尝试使用 Spark 1.6 (spark-1.6.0-bin-hadoop2.4.tgz) 执行 map-reduce 作业,该作业从 S3 读取输入并将输出写入 S3。

读取工作正常:sc.textFile(s3n://bucket/path/to/file/file.gz)

但是,我在写入工作时遇到了很多麻烦。我正在使用同一个桶来输出文件:outputRDD.saveAsTextFile(s3n://bucket/path/to/output/)

当我的输入非常小(part-NNNNN 文件,其中一些文件的字节数为0,其余的小于1 KB。抽查非空文件显示格式正确的 map-reduce 输出。当我移动到稍大的输入(约 500 条记录)时,我看到相同数量的 part-NNNNN 文件(我的分区数对于这些实验是恒定的),但每个都是空的。

当我尝试使用更大的数据集(数百万条记录)时,我的想法是我超出了导致此问题的一些 S3 限制。但是,500 条记录(压缩后约为 65 KB)仍然是很小的数据量,我认为 Spark 和 S3 应该可以轻松处理。

我已尝试使用 S3 块文件系统,而不是 here 概述的 S3 本机文件系统。但得到相同的结果。我已经为我的 S3 存储桶开启了日志记录,但我似乎无法在那里找到确凿证据。

有其他人经历过吗?或者可以以其他方式告诉我可能出了什么问题?

【问题讨论】:

  • 典型的空输出意味着分区是空的。在saveAsTextFile 之前使用repartition(n) 时问题是否仍然存在?如果没有,你有你的答案。如果不是,请发布可用于重现问题的代码。见on-topicHow to create a Minimal, Complete, and Verifiable example
  • 是的。原来这就是答案。我正在过滤掉业务逻辑中的所有记录。现在想想,这似乎很明显。感谢您的回复。

标签: amazon-s3 apache-spark


【解决方案1】:

原来我在深夜处理这个问题。今天早上,我退后一步,发现我的 map-reduce 中有一个错误,它有效地过滤了所有结果。

【讨论】:

    【解决方案2】:

    你应该在 saveAsTextFile 之前使用coalesce

    来自spark programming guide

    Decrease the number of partitions in the RDD to numPartitions. Useful
    for running operations more efficiently after filtering down a large
    dataset.
    

    例如:

    outputRDD.coalesce(100).saveAsTextFile(s3n://bucket/path/to/output/)
    

    【讨论】:

    • 感谢@Urban48,实际上我最初是在合并但已将其删除以尝试消除变量。答案是我什至在运行 saveAsTextFile 之前就过滤掉了所有结果。现在我已经解决了这个问题,我重新添加了coalesce,一切似乎都运行顺利。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2017-01-09
    • 1970-01-01
    • 2016-08-23
    • 2017-03-16
    相关资源
    最近更新 更多