所以答案是真的,你注意到的是工作的具體情況。取決於作業,與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讀取是本地讀取。 –