所以答案是真的,你注意到的是工作的具体情况。取决于作业,与hdfs相比,映射器/缩减器会将更多或更少的字节写入本地文件。
在你的映射器的情况下,你有一个从本地和HDFS位置读取数据的一个类似的量,有就是有没有问题。您的Mapper代码恰好需要在读取HDFS时从本地读取相同数量的数据。大多数时间Mappers被用来分析大于RAM的数据量,所以看到它可能将从HDFS获得的数据写入本地驱动器并不奇怪。从HDFS和本地读取的字节数并不总是看起来像他们总结到本地写入大小(他们甚至没有在你的情况下)。
下面是使用TeraSort示例,具有数据的100G,1个十亿键/值对。
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进行排序,并且需要编写最终的排序文件。还要注意,它需要做大量的本地读/写操作来保存和排序数据,数据量是读取的数据量的2倍和3倍!
作为最后一点,除非你只想运行一项工作而不关心结果。 HDFS的量字节写入应该永远不会为0,而你的是HDFS_BYTES_WRITTEN 0
我已经justed粘贴在地图相的计数器。我知道关于文件字节的读取是相交的。我认为这是本地文件系统读取的字节数。但为什么它与我在每次运行的工作中读取的hdfs字节几乎相同? –
因为Hadoop会尝试优化本地读取,所以它会将您的代码分发到数据所在的位置。这就是为什么你的HDFS读取是本地读取。 –