Apache spark Spark数据集缓存仅使用一个执行器

Apache spark Spark数据集缓存仅使用一个执行器,apache-spark,yarn,parquet,Apache Spark,Yarn,Parquet,我有一个读取hive(拼花地板snappy)表并构建2GB数据集的过程。这是一个迭代的(~7K)过程,并且该数据集对于所有迭代都是相同的,所以我决定缓存该数据集 不知何故,缓存任务只在一个执行器上完成,并且似乎缓存只在该执行器上。这会导致延迟、OOM等 是因为拼花地板吗? 如何确保缓存分布在多个执行器上 以下是spark配置: 遗嘱执行人:3名 核心:4 内存:4GB 分区:200 尝试重新分区并调整配置,但没有成功 我在回答我自己的问题,但这是一个有趣的发现,值得分享@thebluephant

我有一个读取hive(拼花地板snappy)表并构建2GB数据集的过程。这是一个迭代的(~7K)过程,并且该数据集对于所有迭代都是相同的,所以我决定缓存该数据集

不知何故,缓存任务只在一个执行器上完成,并且似乎缓存只在该执行器上。这会导致延迟、OOM等

是因为拼花地板吗? 如何确保缓存分布在多个执行器上

以下是spark配置:

  • 遗嘱执行人:3名
  • 核心:4
  • 内存:4GB
  • 分区:200

  • 尝试重新分区并调整配置,但没有成功

    我在回答我自己的问题,但这是一个有趣的发现,值得分享@thebluephantom的建议

    所以这里的情况是在spark代码中,我从3个蜂巢拼花表中读取数据并构建数据集。现在在我的例子中,我正在阅读每个表中的几乎所有列(大约502列),而拼花地板并不适合这种情况。但有趣的是spark并没有为我的数据创建块(分区)并在一个执行器中缓存整个数据集(~2GB)

    此外,在我的迭代过程中,只有一个执行者在执行所有任务

    另外,
    spark.default.parallelism
    spark.sql.shuffle.partitions
    不在我的控制范围内。在将其更改为Avro格式后,我实际上可以根据需要调整分区、洗牌、每个执行器任务等


    希望这有帮助!谢谢。

    对于将来遇到此问题的任何人,请分享类似的经历。我在一个25M的拼花文件中构建了一个具有400K行和20K特征的ML模型。我尝试的所有优化w.r.t分区或执行器都失败了。所有
    .fit
    调用仅使用一个执行器。经过一周的努力,我将数据分成多个文件块,每个文件块有500行,突然所有的优化都开始了,并且能够在几分钟内而不是几小时前进行训练


    也许一些Spark专家可以帮助解释为什么会出现这种情况,但如果您正在努力进行非操作优化,这可能对您有用。

    最好的办法是展示一些code@thebluephantom:谢谢你的回复。拼花地板是这里的问题。我将表类型更改为Avro,然后spark能够划分为多个块并缓存为多个执行器。回答您自己的问题并分享。有趣的观点。拼花地板总是有点不同。通常更快。很高兴与大家分享,这里和那里肯定有一些奇怪之处。