2017-02-27 147 views
1

我对使用Spark处理位于HDFS中的非结构化文件有疑问。Spark处理非结构化文件

假设在这种情况下,我们有很多文件位于一个HDFS文件夹中。因此,Spark应用程序将读取该特定HDFS文件夹中的所有文件并对其进行处理。我在这里的问题是,如果我们使用下面的代码在数据帧读取这些文件,并把它,它会打内存问题的出来,如果HDFS文件夹中包含大量的文件,每个文件都有规模庞大:

df = spark.read.text('/user/tester/datafiles') 

处理HDFS文件的最佳做法或方法是什么?我们是否需要循环逐个文件并对其进行处理,而不是一次读取所有文件?

感谢。

+0

我不认为你需要做任何事情,因为文件被存储为hdfs 128 MB的块,第二个是火花将只提取它可以在给定的内存中处理的内存量,否则你可以选择重新分区 –

回答

0

很少理解点

1)spark.read.text是一种转换。它不会触发数据读取。

2)将数据转换为DataFrame的操作也可以是转换。因此可以避免数据加载。 3)最后如果你执行一些操作,让我们说count()。

  • 作业将被创建。
  • 这项工作将根据洗牌边界分成多个阶段。
  • 每个阶段将进一步划分为基于分区的多个任务。
  • 现在的任务将基于可用的执行者核心/节点执行!

现在,正如#Akash已经告诉的,对于HDFS,文件已经存储在块中。 Spark的默认分区以rdd/block的形式创建分区。因此,任何一点,只有几块将被加载进行处理。

+0

感谢Akash Sethi和Rakesh。这意味着Spark将处理与处理部分本身的内存,并且不太可能出现“内存不足”问题?如果为特定的Spark工作分配了内核和内存,那么需要更长的时间才能完成而不是异常,对吧? – kcyea