2

我将使用大量的结构化文件的如下:火花划分/集群执行

/day/hour-min.txt.gz 

以总共14天。我将使用一个由90个节点/工人组成的群集。

我正在阅读与wholeTextFiles()的所有内容,因为它是允许我正确分割数据的唯一方法。所有的计算都将在每分钟的基础上完成(所以基本上每个文件),并在最后减少一些步骤。大约有20,000个文件;如何有效地对其进行分区?我是否让火花决定?

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

+0

你的输入文件在哪里? HDFS/S3/..? –

+0

HDFS <加长评论> – Dimebag

回答

2

我觉得每个节点应该接收整个文件;默认情况下,火花会这样做吗?

是的,因为WholeTextFileRDD(你sc.wholeTextFiles后会得到什么)有自己的WholeTextFileInputFormat读取整个文件作为一个单独的记录,你覆盖。如果您的Spark执行程序和数据节点位于同一位置,则还可以期望节点本地数据位置。对于sc.wholeTextFiles(您可以在星火UI一旦你的应用程序运行检查这一点。)

从注withing星火文档注意的一点是:

小文件是首选,大文件也是允许的,但可能会导致 性能不佳。

+0

只是要清楚,你的意思是我应该实现我自己的'wholeTextFileInputFormat'?或者是默认实施好? – Dimebag

+1

不,您不需要为此实现自己的输入格式。它已经提供。请记住,如果你的文件很大,那么它可能会被分割到许多hdfs块中,你的RDD将不得不读取这些块(可能来自非本地数据节点)来为文件构造单个记录。对于大文件,处理单个文件所需的内存也很大。这是谨慎对待使用wholeTextFiles进行大型RDD的基本思想。除此之外,你几乎被覆盖。 –

1

你可以用拇指规则你的分区:

data = data.coalesce(total_cores * 3) 

理想情况下,我认为每个节点应该得到整个文件;默认情况下,火花会这样做吗?我可以执行它吗?怎么样?

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

我不认为你可以强制这样的事情,所以专注于分区的数量;这是至关重要的。


至于文件的数目,我已经写在我的pseudosite,太少的文件,会造成巨大的文件,可能只是太大,太多的文件,你将有HDFS维护量巨大的元数据,因此给它施加了很大的压力。

相关问题