您好我正在使用Spark SQL hiveContext.sql()
,它使用group by queries并且我遇到了OOM
个问题。因此,考虑将spark.sql.shuffle.partitions
的值从200默认增加到1000,但它没有帮助。请纠正我,如果我错了,这个分区将共享数据随机加载,因此分区更少数据保持。请指导我是Spark新手。我正在使用Spark 1.4.0,我有大约1TB的未压缩数据,可以通过查询使用hiveContext.sql()
组进行处理。
答案 0 :(得分:46)
如果随机播放内存不足,请尝试将spark.sql.shuffle.partitions
设置为2001。
private[spark] object MapStatus {
def apply(loc: BlockManagerId, uncompressedSizes: Array[Long]): MapStatus = {
if (uncompressedSizes.length > 2000) {
HighlyCompressedMapStatus(loc, uncompressedSizes)
} else {
new CompressedMapStatus(loc, uncompressedSizes)
}
}
...
我真的希望他们能让你独立配置它。
顺便说一下,我找到了this information in a Cloudera slide deck。
答案 1 :(得分:9)
好的,所以我认为你的问题更为笼统。它不是特定于Spark SQL,它是Spark的一个普遍问题,它忽略了文件很少时你告诉它的分区数量。除非您致电repartition
,否则Spark似乎与HDFS上的文件数具有相同数量的分区。因此,调用repartition
应该可行,但需要注意不必要地进行随机播放。
我刚才提出这个问题,还没有得到一个好的答案:(
Spark: increase number of partitions without causing a shuffle?
答案 2 :(得分:4)
它实际上取决于您的数据和查询,如果Spark必须加载1Tb,那么您的设计就会出现问题。
使用superbe Web UI查看DAG,表示Spark如何将SQL查询转换为作业/阶段和任务。
有用的指标是"输入"和" Shuffle"。
CLUSTER BY
功能来处理每个数据分区另外,OOM可能发生在您的驱动程序上?
- >这是另一个问题,驱动程序将在最后收集您想要的数据。如果你要求太多数据,驱动程序将会OOM,尝试限制你的查询,或写另一个表(Spark语法CREATE TABLE ...AS
)。
答案 3 :(得分:0)
我从Cloudera遇到了关于Hive Partitioning的this post。查看“指针”部分,了解每个分区中的分区数和文件数导致名称节点过载,这可能会导致OOM。