使用 Scala 计算 HDFS 目录中的文件

Count files in HDFS directory with Scala

在 Scala 中,我试图对 Hdfs 目录中的文件进行计数。 我尝试使用 val files = fs.listFiles(path, false) 获取文件列表并对其进行计数或获取其大小,但它不起作用,因为 files 类型为 RemoteIterator[LocatedFileStatus]

知道我应该如何处理吗?

感谢您的帮助

以前有人这样做过,但人们通常使用 FSImage。 (名称节点文件的副本。)

然后他们会将其放入配置单元 table,然后您可以查询它以获取有关您的 hdfs 文件系统的信息。

这里有一个 really good tutorial 解释了如何导出 fsimage 并将其放入配置单元 table。

这是另一个that I think I prefer:

Fetch and copy the fsimage file into HDFS #connect to any hadoop cluster node as hdfs user

#downloads the fsimage file from namenode
hdfs dfsadmin -fetchImage /tmp

#converts the fsimage file into tab delimited file
hdfs oiv -i /tmp/fsimage_0000000000450297390 -o /tmp/fsimage.csv -p Delimited

#remove the header and copy to HDFS
sed -i -e "1d" fsimage.csv
hdfs dfs -mkdir /tmp/fsimage
hdfs dfs -copyFromLocal /tmp/fsimage.csv /tmp/fsimage

#create the intermediate external table in impala
CREATE EXTERNAL TABLE HDFS_META_D ( 
 PATH STRING , 
 REPL INT , 
 MODIFICATION_TIME STRING , 
 ACCESSTIME STRING , 
 PREFERREDBLOCKSIZE INT , 
 BLOCKCOUNT DOUBLE, 
 FILESIZE DOUBLE , 
 NSQUOTA INT , 
 DSQUOTA INT , 
 PERMISSION STRING , 
 USERNAME STRING , 
 GROUPNAME STRING) 
row format delimited
fields terminated by '\t'
LOCATION '/tmp/fsimage';

一旦进入 table,您就可以在 scala/spark 中完成剩下的工作。

我最终使用:

var count: Int = 0
while (files.hasNext) {
  files.next
  count += 1
}

作为 Scala 初学者,我不知道如何制作 count++(答案是 count += 1)。这实际上很有效