在尝试在 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 分区即可让进程失败。
处理我遇到的具体问题的问题是
- 从 Apache Spark 分段上传到 Amazon S3
- 使用 Spark SQL 将重新分区的 SchemaRDD 写入 Parquet 时出错
- Spark SQL 无法完成写入具有大量分片的 Parquet 数据
这个问题是看是否有任何解决主要目标的方法,不一定涉及直接解决上述问题之一。
提炼事情有两个问题
将大于 5G 的单个分片写入 S3 失败。AFAIK 这是一个内置的
s3n://
桶限制。存储桶应该是可能的,s3://
但似乎在 Spark 中不起作用,并且hadoop distcp
本地 HDFS 也无法做到。一旦有 1000 个分片,写入摘要文件往往会失败。这似乎有多个问题。直接写入 S3 会产生上述链接问题中的错误。直接写入本地 HDFS 会产生 OOM 错误,即使在 r3.8xlarge(244G 内存)上,当大约有 5000 个分片时也是如此。这似乎与实际数据量无关。摘要文件似乎对于高效查询至关重要。
这些问题加在一起将 S3 上的 Parquet 表限制为 25T。在实践中,它实际上要小得多,因为分片大小在一个 RDD 内变化很大,并且 5G 限制适用于最大的分片。
如何将 >>25T RDD 作为 Parquet 写入 S3?
我正在使用 Spark-1.1.0。