【发布时间】:2014-12-07 13:52:52
【问题描述】:
我在尝试在 S3 上以 Parquet 格式保存非常大的 SchemaRDD 时遇到了许多问题。我已经针对这些问题发布了具体问题,但这是我真正需要做的。代码应该是这样的
import org.apache.spark._
val sqlContext = sql.SQLContext(sc)
val data = sqlContext.jsonFile("s3n://...", 10e-6)
data.saveAsParquetFile("s3n://...")
如果我有超过 2000 个分区或分区大于 5G,我会遇到问题。 这为我可以通过这种方式处理的最大 SchemaRDD 设置了一个上限。 实际限制接近 1T,因为分区大小差异很大,您只需要 1 个 5G 分区即可让进程失败。
处理我遇到的具体问题的问题是
- Multipart uploads to Amazon S3 from Apache Spark
- Error when writing a repartitioned SchemaRDD to Parquet with Spark SQL
- Spark SQL unable to complete writing Parquet data with a large number of shards
这个问题是看看是否有任何解决主要目标的方法,不一定涉及直接解决上述问题之一。
要提炼事情有两个问题
将大于 5G 的单个分片写入 S3 失败。 AFAIK 这是
s3n://存储桶的内置限制。s3://存储桶应该可以,但似乎在 Spark 中不起作用,而本地 HDFS 中的hadoop distcp也无法做到。一旦有 1000 个分片,写入摘要文件往往会失败。这似乎有多个问题。直接写入 S3 会产生上述链接问题中的错误。直接写入本地 HDFS 会产生 OOM 错误,即使在 r3.8xlarge(244G 内存)上,当大约有 5000 个分片时也是如此。这似乎与实际数据量无关。摘要文件似乎对于高效查询至关重要。
综合这些问题,将 S3 上的 Parquet 表限制为 25T。在实践中,它实际上要小得多,因为一个 RDD 内的分片大小可能会有很大差异,并且 5G 限制适用于最大的分片。
如何将 >>25T RDD 作为 Parquet 写入 S3?
我正在使用 Spark-1.1.0。
【问题讨论】:
标签: amazon-s3 apache-spark parquet apache-spark-sql