以下是我的工作阶段:
注意:我持续存在多个临时文件,因为我无法将它们保存在内存中,因为数据很大。(8400万行,200万个不同的主键类型值)
我使用coleasce(n)或repartition(n),其中n是一个很大的数字,例如:200。现在,这导致在输出中为我持久存在的每个临时数据创建了200个文件。我知道coleasce / repartition对于写入性能来说是一项代价高昂的工作。但是当我使用n = 200而不是n = 50时,我确实获得了更好的并行性。这就是写作的全部内容。
现在,这个临时数据将被下一个进程读取,那么n = 200会更好还是n = 50?
另外,我知道父分区号(n)将成为下一次写操作的基础,依此类推。
Qs的:
答案 0 :(得分:0)
1)当输出文件的大小不太可能倾斜时使用合并(1个文件2GB,休息0GB)。当您想要在执行程序之间平衡工作时,重新分区是最有用的,因此每个分区的大小相似。
2)根据指定的值设置输出分区以写入和读取时间。例如,有大量分区(较小的文件)用于写入和读取一次(重新中间输出),但在写入多次读取时将分区设置得较低(较大的文件)(WORM用于使用镶木地板作为分析)。分区越多,一次可以完成的并发任务就越多。
3)如果能够并且测量写作和阅读时间,尝试不同的方法;确定最适合您用例的权衡。
这很像压缩算法,其中一些可以快速压缩(例如LZO),另一些以最小的占用空间存储(例如BZip2),而另一些则快速解压缩(例如Snappy)。