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



我有一个读取hive(镶木地板(表并构建2GB数据集的过程。这是一个迭代(~7K(过程,这个数据集在所有迭代中都是一样的,所以我决定缓存数据集。

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

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

这是火花配置:

  1. 执行程序:3
  2. 核心:4
  3. 内存:4GB
  4. 分区:200

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

对于将来遇到此线程的任何人,都可以分享类似的经验。我在一个25M的镶木地板文件中构建了一个具有400K行和20K功能的ML模型。我尝试的所有优化w.r.t分区或执行器都失败了。所有的.fit调用都只使用一个执行器。经过一周的努力,我将数据分解为多个文件块,每个文件块500行,突然所有的优化都开始了,并且能够在几分钟内而不是几个小时前进行训练。

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

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

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

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

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

希望这能有所帮助!非常感谢。

最新更新