我想了解hadoop中的文件系统计数器。
下面是我运行的作业的计数器。
在我运行的每个作业中,我观察到读取的Map文件字节几乎等于读取的HDFS字节。我观察到map写入的文件字节是mapper读取的文件字节和hdfs字节的总和。请帮助!本地文件和hdfs是否都读取相同的数据,并且都通过Map阶段写入本地文件系统?
Map
FILE_BYTES_READ 5,062,341,139
HDFS_BYTES_READ 4,405,881,342
FILE_BYTES_WRITTEN 9,309,466,964
HDFS_BYTES_WRITTEN 0
谢谢!
所以答案是,你所注意的是具体的工作。根据作业的不同,与hdfs相比,映射器/reducer会向本地文件写入更多或更少的字节。
在您的mapper案例中,您从本地和HDFS位置读取的数据量相似,因此没有问题。您的Mapper代码恰好需要在本地读取与从HDFS读取相同数量的数据。大多数情况下,映射器被用于分析大于RAM的数据量,因此看到它可能将从HDFS获得的数据写入本地驱动器并不奇怪。从HDFS和本地读取的字节数并不总是看起来像它们之和等于本地写大小(在您的情况下甚至不是这样)。
下面是一个使用TeraSort的例子,100G数据,10亿个键/值对。
File System Counters
FILE: Number of bytes read=219712810984
FILE: Number of bytes written=312072614456
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=100000061008
HDFS: Number of bytes written=100000000000
HDFS: Number of read operations=2976
HDFS: Number of large read operations=0
注意事项。从HDFS读取和写入的字节数几乎正好是100G。这是因为100G需要排序,最终排序后的文件需要写入。还需要注意的是,它需要做大量的本地读/写来保存和排序数据,是它读取的数据量的两倍和三倍!
作为最后的注意事项,除非您只想运行作业而不关心结果。写入的HDFS字节数不应该是0,您的是HDFS_BYTES_WRITTEN 0
这是作业的HDFS分发、Map阶段和Reduce阶段的总计数器。
这些计数器,就像你观察到的,是文件字节和hdfs字节的总和。Hadoop使用你的逻辑文件系统HDFS在集群上共享资源。