Apache spark spark.sql.shuffle.partitions的最佳值应该是什么,或者在使用spark-sql时如何增加分区?

Apache spark spark.sql.shuffle.partitions的最佳值应该是什么,或者在使用spark-sql时如何增加分区?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我使用的Spark SQL实际上是hiveContext.SQL(),它使用group by查询,我遇到了OOM问题。所以考虑将spark.sql.shuffle.partitions的值从默认值的200增加到1000,但这并没有帮助 我相信这个分区将共享数据洗牌负载,所以分区越多,保存的数据就越少。我是新手。我使用的是Spark 1.4.0,我有大约1TB的未压缩数据要使用hiveContext.sql()groupby querys进行处理。好的,所以我认为您的问题更一般。这不是Spark

我使用的Spark SQL实际上是
hiveContext.SQL()
,它使用group by查询,我遇到了OOM问题。所以考虑将
spark.sql.shuffle.partitions
的值从默认值的200增加到1000,但这并没有帮助


我相信这个分区将共享数据洗牌负载,所以分区越多,保存的数据就越少。我是新手。我使用的是Spark 1.4.0,我有大约1TB的未压缩数据要使用
hiveContext.sql()
groupby querys进行处理。

好的,所以我认为您的问题更一般。这不是Spark SQL特有的,这是Spark的一个普遍问题,它忽略了当文件很少时您告诉它的分区数。Spark的分区数似乎与HDFS上的文件数相同,除非调用
repartition
。因此,调用
重新分区
应该是可行的,但要注意的是会导致不必要的混乱

我刚才提出这个问题,至今仍未得到一个好的答案:(


如果洗牌的内存不足,请尝试将
spark.sql.shuffle.partitions
设置为2001

我真希望他们能让你独立配置


顺便说一句,我发现。

这实际上取决于您的数据和查询,如果Spark必须加载1Tb,那么您的设计有问题

使用superbe web UI查看DAG,即Spark如何将SQL查询转换为作业/阶段和任务

有用的指标是“输入”和“洗牌”

  • 对数据进行分区(配置单元/目录布局,如/year=X/month=X)
  • 使用spark
    CLUSTER BY
    功能对每个数据分区进行工作
  • 使用ORC/拼花文件格式,因为它们提供“下推过滤器”,无用数据不会加载到Spark
  • 分析Spark历史,查看Spark如何读取数据
还有,OOM可能发生在你的司机身上


->这是另一个问题,驱动程序将在最后收集您想要的数据。如果您要求的数据太多,驱动程序将发出OOM,尝试限制您的查询,或编写另一个表(Spark syntax
CREATE table…AS
)。

我在Cloudera遇到过关于配置单元分区的问题。请查看“指针”部分讨论分区数量和每个分区中的文件数量导致名称节点过载,这可能会导致OOM。

是否有参考资料支持“Spark的分区数量似乎与HDFS上的文件数量相同”的说法?@morpheus在HDFS上运行Spark jobs大约3年了:P但是,是的,我也希望看到一个参考,这只是我在没有看到任何明确文档的情况下将其视为事实的事情之一。据介绍,有一个属性
Spark.sql.files.maxPartitionBytes
,它将在从中加载数据时指定分区的大小HDFS@morpheus,靠近文章底部的部分讨论了在读取文件时分区是如何工作的。(做此注释是为了帮助其他遇到此问题的人):从HDFS加载数据时,分区的大小不受
spark.sql.files.maxPartitionBytes
的控制。相反,它由HDFS块大小决定,可以通过增加
mapreduce.job.maps
来增加该信息在spark 2.4.x之前是准确的。请看一看spark.shuffle.minNumPartitionsToHighlyCompress的要点,您可以使用任意数量的分区来使用HighlyCompressedMapStatus,这让您可以毫不妥协地选择最佳的并行级别
private[spark] object MapStatus {

  def apply(loc: BlockManagerId, uncompressedSizes: Array[Long]): MapStatus = {
    if (uncompressedSizes.length > 2000) {
      HighlyCompressedMapStatus(loc, uncompressedSizes)
    } else {
      new CompressedMapStatus(loc, uncompressedSizes)
    }
  }
...