基于spark

时间:2017-09-30 18:31:02

标签: hadoop apache-spark spark-dataframe

以下是我的工作阶段:

  1. 阶段1 - 进行一些计算并将临时数据保存到文件中。将会有多个临时数据帧保持并在流中读取。
  2. 阶段2 - 读取临时数据并进行其他计算并将其存储到最终数据文件中。
  3. 注意:我持续存在多个临时文件,因为我无法将它们保存在内存中,因为数据很大。(8400万行,200万个不同的主键类型值)

    我使用coleasce(n)或repartition(n),其中n是一个很大的数字,例如:200。现在,这导致在输出中为我持久存在的每个临时数据创建了200个文件。我知道coleasce / repartition对于写入性能来说是一项代价高昂的工作。但是当我使用n = 200而不是n = 50时,我确实获得了更好的并行性。这就是写作的全部内容。

    现在,这个临时数据将被下一个进程读取,那么n = 200会更好还是n = 50?

    另外,我知道父分区号(n)将成为下一次写操作的基础,依此类推。

    Qs的:

    1. 什么时候使用coleasce(没有shuffle)以及何时使用重新分区(shuffle)?
    2. 要使用的分区值以及原因?
    3. 我应该采取什么策略来获得更好的表现?

1 个答案:

答案 0 :(得分:0)

1)当输出文件的大小不太可能倾斜时使用合并(1个文件2GB,休息0GB)。当您想要在执行程序之间平衡工作时,重新分区是最有用的,因此每个分区的大小相似。

2)根据指定的值设置输出分区以写入和读取时间。例如,有大量分区(较小的文件)用于写入和读取一次(重新中间输出),但在写入多次读取时将分区设置得较低(较大的文件)(WORM用于使用镶木地板作为分析)。分区越多,一次可以完成的并发任务就越多。

3)如果能够并且测量写作和阅读时间,尝试不同的方法;确定最适合您用例的权衡。

这很像压缩算法,其中一些可以快速压缩(例如LZO),另一些以最小的占用空间存储(例如BZip2),而另一些则快速解压缩(例如Snappy)。