使用 Spark 列出 Hadoop HDFS 目录中的所有文件?

Posted

技术标签:

【中文标题】使用 Spark 列出 Hadoop HDFS 目录中的所有文件?【英文标题】:Use Spark to list all files in a Hadoop HDFS directory? 【发布时间】:2014-04-28 22:31:18 【问题描述】:

我想遍历 Hadoop 目录中的所有文本文件并计算所有出现的单词“错误”。有没有办法使用 Apache Spark Scala API 使用hadoop fs -ls /users/ubuntu/ 列出目录中的所有文件?

从给定的first example 来看,spark 上下文似乎只能通过以下方式单独访问文件:

val file = spark.textFile("hdfs://target_load_file.txt")

在我的问题中,我事先不知道 HDFS 文件夹中有多少文件,也不知道文件的名称。看了spark context docs,没找到这种功能。

【问题讨论】:

【参考方案1】:

您可以使用通配符:

val errorCount = sc.textFile("hdfs://some-directory/*")
                   .flatMap(_.split(" ")).filter(_ == "error").count

【讨论】:

如果我想报告发生错误的文件名怎么办? 使用sc.wholeTextFiles。关于这个问题,请参阅***.com/questions/29521665/…。【参考方案2】:
import org.apache.hadoop.fs.FileSystem, FileUtil, Path
import scala.collection.mutable.Stack


val fs = FileSystem.get( sc.hadoopConfiguration )
var dirs = Stack[String]()
val files = scala.collection.mutable.ListBuffer.empty[String]
val fs = FileSystem.get(sc.hadoopConfiguration)

dirs.push("/user/username/")

while(!dirs.isEmpty)
    val status = fs.listStatus(new Path(dirs.pop()))
    status.foreach(x=> if(x.isDirectory) dirs.push(x.getPath.toString) else 
    files+= x.getPath.toString)

files.foreach(println)

【讨论】:

这是对标题中所述问题的最严格正确答案。接受的答案为 OP 提供了对问题本身要求的更具体的答案,但来自谷歌的任何人都可能会寻找这个。【参考方案3】:

对于本地安装,(通过阅读/etc/hadoop/core.xml可以找到hdfs默认路径fs.defaultFS):

例如,

import org.apache.hadoop.fs.FileSystem, Path

val conf = sc.hadoopConfiguration
conf.set("fs.defaultFS", "hdfs://localhost:9000")
val hdfs: org.apache.hadoop.fs.FileSystem = org.apache.hadoop.fs.FileSystem.get(conf)
 
val fileStatus = hdfs.listStatus(new Path("hdfs://localhost:9000/foldername/"))
val fileList = fileStatus.map(x => x.getPath.toString)
fileList.foreach(println)

【讨论】:

以上是关于使用 Spark 列出 Hadoop HDFS 目录中的所有文件?的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop初步学习

搭建spark伪分散式需要先搭建hadoop吗

spark 可以直接向hdfs 输入数据吗

Spark -14:spark Hadoop 高可用模式下读写hdfs

hadoop分布式文件系统管理命令速查

通过 zeppelin 从 docker-hadoop-spark--workbench 访问 hdfs