繁体   English   中英

使用Spark API如何处理大型目录树?

[英]How are large directory trees processed in using the Spark API?

我是Spark的新用户,我正在尝试处理位于HDFS文件系统上的XML文件的大文件集。 1台计算机(实际上是VM)的“开发”群集上大约有15万个文件,总计约28GB。

这些文件在HDFS中组织成目录结构,因此在单个父目录下大约有一百个子目录。 每个“子”目录都包含数百至数千个XML文件之间的任何内容。

我的任务是解析每个XML文件,使用XPath表达式提取一些值,然后将结果保存到HBase。 我正在尝试使用Apache Spark进行此操作,但运气不佳。 我的问题似乎是Spark API和RDD的工作方式的结合。 在这一点上,最好共享一些伪代码来表达我要执行的操作:

RDD[String] filePaths = getAllFilePaths()
RDD[Map<String,String>] parsedFiles = filePaths.map((filePath) => {
    // Load the file denoted by filePath
    // Parse the file and apply XPath expressions
})
// After calling map() above, I should have an RDD[Map<String,String>] where
// the map is keyed by a "label" for an xpath expression, and the
// corresponding value is the result of the expression applied to the file 

因此,折腾一下我写给HBase的部分,让我们专注于上述内容。 我无法从RDD map()调用中加载文件。

我尝试了多种不同的方法,但都失败了:

  1. 使用调用 SparkContext.textFile("/my/path")加载文件失败,因为SparkContext无法序列化
  2. 使用无法从RDD实例化FileSystem的Hadoop API 调用 FileSystem.open(path)失败,因为FileSystem无法序列化
  3. 使用从Hadoop API调用FileSystem.open(path)在RDD 内部实例化FileSystem )失败,因为程序用完了文件句柄。

替代方法包括尝试使用SparkContext.wholeTextFiles("/my/path/*")因此我不必从map()调用中加载文件,因为程序内存不足,因此失败。 据推测这是因为它渴望加载文件。

是否有人在自己的工作中尝试过类似的尝试?如果是,您使用了哪种方法?

尝试使用通配符读取整个目录。 val errorCount = sc.textFile("hdfs://some-directory/*")

实际上,spark可以读取整个hfs目录,引自spark 文档

Spark的所有基于文件的输入方法(包括textFile)都支持在目录,压缩文件和通配符上运行。 例如,可以使用textFile("/my/directory")textFile("/my/directory/*.txt")textFile("/my/directory/*.gz")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM