计算 HDFS 目录中单个文件的行数

Taking line count of individual files in an HDFS directory

我想获取 HDFS 中目录的单个文件(以及文件名)的行数,输出应该与此类似:

4 filename_1.txt
20 filename_2.txt
8 filename_3.txt

目前我正在使用

hadoop fs -cat /user/TMM/ | wc -l

给出了目录的总数。 (在这种情况下,例如:32)

有什么办法吗?

您可以使用 shell 脚本执行此操作,请参考以下可能对您有所帮助的代码段。

for i in $( hadoop fs -ls <hdfs-path> | tr -s ' ' | grep '/' | awk '{print}');
   do
      echo $i `hadoop fs -cat $i | wc -l`;
   done;

这将打印 hdfs-path 下的每个文件以及行数。

[注意:文件名打印在我的 hadoop 版本的 hadoop fs -ls 输出中的 8 索引处,相应地在您的环境中检查它]

如果您的数据量足够小,您可以这样做,但该方法意味着将所有数据从您的 HDFS 集群传输到客户端机器。不好。

另一种方法是创建 MapReduce 作业。从上下文中获取文件名 (getInputSplit) 并为每个输入行发出一个事件,其中键可以是文件名,值可以是 1。最好在地图中创建一个本地聚合以避免将大量对象传输到减速器。在 reducer 中完成聚合并将输出写入 HDFS 中的文件。