我有一个读取hive(parquet-snappy)表并构建2GB数据集的过程。这是一个迭代(〜7K)的过程,并且所有迭代该数据集都是相同的,因此我决定缓存该数据集。
以某种方式仅在一个执行程序上完成高速缓存任务,并且看起来高速缓存仅在该一个执行程序上。导致延迟,OOM等。
是因为镶木地板吗? 如何确保缓存在多个执行器上分配?
这是spark配置:
尝试重新分区并调整配置,但没有运气。
答案 0 :(得分:3)
对于以后遇到此话题的任何人,都有相似的经验可以分享。我在一个25M的镶木地板文件中构建了具有40万行和20K特征的ML模型。我尝试使用分区或执行程序进行的所有优化均无法正常工作。所有.fit
调用仅使用一个执行程序。经过一周的苦苦挣扎,我将数据分成了多个文件块,每个文件块有500行,然后突然开始进行所有优化,并且能够在几分钟内而不是几个小时之前进行训练。
也许一些Spark专家可以帮助解释为什么会出现这种情况,但是,如果您在非操作性优化方面苦苦挣扎,那么这可能对您有用。
答案 1 :(得分:1)
我正在回答自己的问题,但这是一个有趣的发现,值得@thebluephantom建议进行分享。
所以这里的情况是火花代码,我正在从3个蜂巢实木复合地板中读取数据并建立数据集。现在以我为例,我正在读取每个表中的几乎所有列(大约502列),而镶木地板不是这种情况的理想选择。但是有趣的是,火花并没有为我的数据创建块(分区),也没有在一个执行程序中缓存整个数据集(〜2GB)。
此外,在我的迭代过程中,只有一名执行者正在执行所有任务。
此外,spark.default.parallelism
和spark.sql.shuffle.partitions
不在我的控制范围内。将其更改为Avro格式后,我实际上可以根据需要调整分区,随机播放,每个执行程序任务等。
希望这会有所帮助!谢谢。