Spark 数据集缓存仅使用一个执行程序
Spark Dataset cache is using only one executor
我有一个读取 hive(parquet-snappy) table 并构建 2GB 数据集的进程。这是一个迭代(~ 7K)过程,并且这个数据集对于所有迭代都是相同的,所以我决定缓存数据集。
缓存任务只在一个执行器上完成,看起来缓存只在那个执行器上。这会导致延迟、OOM 等
是镶木地板的缘故吗?
如何确保缓存分布在多个执行器上?
这是 spark 配置:
- 执行者:3
- 核心数:4
- 内存:4GB
- 分区:200
尝试过重新分区和调整配置,但没有成功。
我正在回答我自己的问题,但这是一个有趣的发现,值得分享,正如@thebluephantom 所建议的。
所以这里的情况是在 spark 代码中,我正在从 3 个蜂巢镶木地板 table 中读取数据并构建数据集。现在就我而言,我正在阅读每个 table 中的几乎所有列(大约 502 列),而镶木地板对于这种情况并不理想。但有趣的是,spark 并没有为我的数据创建块(分区),也没有在一个执行程序中缓存整个数据集(~2GB)。
此外,在我的迭代过程中,只有一个执行者在执行所有任务。
此外,spark.default.parallelism
和 spark.sql.shuffle.partitions
不在我的控制范围内。将其更改为 Avro 格式后,我实际上可以根据需要调整分区、洗牌、每个执行程序任务等。
希望对您有所帮助!谢谢。
对于以后遇到这个话题的人,有类似的经历可以分享一下。我在一个 25M 的镶木地板文件中构建了一个具有 40 万行和 2 万个特征的 ML 模型。我尝试 w.r.t 分区或执行程序的所有优化都失败了。所有 .fit
调用仅使用一个执行程序。经过一周的努力,我将数据分成多个文件块,每个文件块 500 行,突然间所有的优化都开始了,并且能够在几分钟内而不是几个小时内进行训练。
也许某些 Spark 专家可以帮助解释为什么会这样,但如果您正在努力解决非操作优化问题,这可能对您有用。
我有一个读取 hive(parquet-snappy) table 并构建 2GB 数据集的进程。这是一个迭代(~ 7K)过程,并且这个数据集对于所有迭代都是相同的,所以我决定缓存数据集。
缓存任务只在一个执行器上完成,看起来缓存只在那个执行器上。这会导致延迟、OOM 等
是镶木地板的缘故吗? 如何确保缓存分布在多个执行器上?
这是 spark 配置:
- 执行者:3
- 核心数:4
- 内存:4GB
- 分区:200
尝试过重新分区和调整配置,但没有成功。
我正在回答我自己的问题,但这是一个有趣的发现,值得分享,正如@thebluephantom 所建议的。
所以这里的情况是在 spark 代码中,我正在从 3 个蜂巢镶木地板 table 中读取数据并构建数据集。现在就我而言,我正在阅读每个 table 中的几乎所有列(大约 502 列),而镶木地板对于这种情况并不理想。但有趣的是,spark 并没有为我的数据创建块(分区),也没有在一个执行程序中缓存整个数据集(~2GB)。
此外,在我的迭代过程中,只有一个执行者在执行所有任务。
此外,spark.default.parallelism
和 spark.sql.shuffle.partitions
不在我的控制范围内。将其更改为 Avro 格式后,我实际上可以根据需要调整分区、洗牌、每个执行程序任务等。
希望对您有所帮助!谢谢。
对于以后遇到这个话题的人,有类似的经历可以分享一下。我在一个 25M 的镶木地板文件中构建了一个具有 40 万行和 2 万个特征的 ML 模型。我尝试 w.r.t 分区或执行程序的所有优化都失败了。所有 .fit
调用仅使用一个执行程序。经过一周的努力,我将数据分成多个文件块,每个文件块 500 行,突然间所有的优化都开始了,并且能够在几分钟内而不是几个小时内进行训练。
也许某些 Spark 专家可以帮助解释为什么会这样,但如果您正在努力解决非操作优化问题,这可能对您有用。