SMa*_*MaZ 4 hadoop-yarn apache-spark parquet
我有一个读取 hive(parquet-snappy) 表并构建 2GB 数据集的进程。这是迭代(~ 7K)过程,并且该数据集对于所有迭代都是相同的,因此我决定缓存该数据集。
不知何故,缓存任务仅在一个执行器上完成,并且看起来缓存仅在该一个执行器上。这会导致延迟、OOM 等。
是因为镶木地板吗?如何确保缓存分布在多个执行器上?
这是火花配置:
尝试重新分区和调整配置但没有运气。
我正在回答我自己的问题,但这是一个有趣的发现,值得按照 @thebluephantom 的建议进行分享。
所以这里的情况是在 Spark 代码中,我正在从 3 个 hive parquet 表读取数据并构建数据集。现在,就我而言,我正在读取每个表中的几乎所有列(大约 502 列),而 parquet 并不适合这种情况。但有趣的是 Spark 并没有为我的数据创建块(分区)并在一个执行器中缓存整个数据集(~2GB)。
此外,在我的迭代过程中,只有一名执行者正在执行所有任务。
而且,spark.default.parallelism也不spark.sql.shuffle.partitions在我的控制范围内。将其更改为 Avro 格式后,我实际上可以根据我的需要调整分区、随机播放、每个执行程序任务等。
希望这可以帮助!谢谢。
对于将来遇到此线程的任何人,都有类似的经历可以分享。我正在一个 25M parquet 文件中构建一个具有 400K 行和 20K 特征的 ML 模型。我尝试过的所有关于分区或执行器的优化都失败了。所有.fit调用仅使用一个执行程序。经过一周的努力,我将数据分成多个文件块,每个文件块有 500 行,突然间所有优化都启动了,并且能够在几分钟内而不是提前几个小时进行训练。
也许一些 Spark 专家可以帮助解释为什么会出现这种情况,但如果您正在努力进行非操作性优化,这可能对您有用。
| 归档时间: |
|
| 查看次数: |
1443 次 |
| 最近记录: |