Spark 处理非结构化文件
Posted
技术标签:
【中文标题】Spark 处理非结构化文件【英文标题】:Spark process unstructured files 【发布时间】:2017-02-27 09:34:01 【问题描述】:我有一个关于使用 Spark 处理位于 HDFS 中的非结构化文件的问题。
假设在这种情况下,我们有很多文件位于一个 HDFS 文件夹中。因此,Spark 应用程序将读取该特定 HDFS 文件夹中的所有文件并进行处理。我的问题是,如果我们要使用以下代码来读取文件并将其放入 DataFrame 中,如果 HDFS 文件夹包含大量文件并且每个文件都很大,则可能会出现内存不足的问题:
df = spark.read.text('/user/tester/datafiles')
对于我们来说,像上述场景那样处理 HDFS 文件的最佳实践或方法是什么?我们是否需要逐个文件循环并处理它而不是一次读取所有文件?
谢谢。
【问题讨论】:
我认为你不需要做任何事情,因为文件在 hdfs 中存储为 128 mb 的块,其次是 spark 只会获取它可以在给定内存中处理的内存量,否则你有赔偿的选择 【参考方案1】:需要理解的几点
1) spark.read.text 是一种转换。它不会触发数据读取。
2) 将数据转换为DataFrame的操作也可以是transformation。这样可以避免数据加载。
3) 最后,如果你执行一些操作,让我们说 count()。
将创建一个作业。 此作业将根据 shuffle 边界分为多个阶段。 每个阶段将根据分区进一步分为多个任务。 现在将根据可用的执行器核心/节点执行任务!!!现在,正如#Akash 所说,对于 HDFS,文件已经存储在块中。 spark 的默认分区在每个块的 rdd 中创建一个分区。所以任何时候,只会加载几个块进行处理。
【讨论】:
感谢 Akash Sethi 和 Rakesh。意思是说 Spark 将使用处理部分本身处理内存,并且不太可能遇到“内存不足”问题?如果为特定的 spark 作业分配了核心和内存,那么完成而不是遇到异常将需要更长的时间,对吧?以上是关于Spark 处理非结构化文件的主要内容,如果未能解决你的问题,请参考以下文章