Spark partitioning/cluster 执行

Spark partitioning/cluster enforcing

我将使用大量结构如下的文件:

/day/hour-min.txt.gz

一共 14 天。我将使用 90 个 nodes/workers.

的集群

我正在使用 wholeTextFiles() 阅读所有内容,因为这是允许我适当拆分数据的唯一方法。所有的计算都将在每分钟的基础上完成(所以基本上是每个文件),最后有几个减少步骤。大约有 20.000 个文件;如何有效地划分它们?我让火花来决定吗?

理想情况下,我认为每个节点都应该接收整个文件;默认情况下,spark 会这样做吗?我可以强制执行吗?怎么样?

I think each node should receive entire files; does spark do that by default?

是的,考虑到 WholeTextFileRDD(您在 sc.wholeTextFiles 之后得到的内容)有自己的 WholeTextFileInputFormat 可以将整个文件作为一条记录读取,您就可以了。如果您的 Spark 执行器和数据节点位于同一位置,您还可以期望节点本地数据局部性。 (你可以在 Spark UI 中检查这个,一旦你的应用程序是 运行。)

sc.wholeTextFiles 的 Spark 文档中的注意事项:

Small files are preferred, large file is also allowable, but may cause bad performance.

您可以使用分区的经验法则:

data = data.coalesce(total_cores * 3) 

Ideally, I think each node should receive entire files; does spark do that by default? Can I enforce it? How?

这完全取决于您的 RDD,而不是您的文件。例如,如果您构建一个包含文件所有内容的 RDD,那么 Spark 将分发该 RDD,并且整个文件是否位于节点中受许多参数(#partitions、每个文件的大小等)的影响。

我不认为你可以强制执行类似的东西,所以关注分区的数量;这很关键。


关于文件的数量,我在我的 pseudosite 中写过,文件太少,会导致文件很大,而且可能太大,文件太多,你会让 HDFS 维护一个元数据量大,压力大