2012-04-27 28 views
2

所以這是我的情況:使用Hadoop,我可以在沒有運行數據節點的機器上創建任務跟蹤器嗎?

我有一個使用HBase的mapreduce作業。我的映射器需要一行文本輸入並更新HBase。我沒有減速器,也沒有寫入任何輸出到光盤。我希望能夠在我預計會出現一次利用率時向羣集添加更多處理能力,然後在利用率降低時縮小範圍。假設我暫時無法使用Amazon或任何其他雲提供商;我在一個私人集羣中運行。

當我需要更多容量時,一種解決方案是將新機器添加到羣集中。但是,我希望能夠無需等待或麻煩地添加和刪除這些機器。我不想在每次需要添加或刪除節點時重新平衡HDFS。所以看起來好的策略是擁有一個「核心」集羣,每個機器運行一個任務跟蹤器和一個數據節點,當我需要增加容量時,我可以啓動一些「一次性」機器,正在運行tasktrackers,但不是datanode。這可能嗎?如果是這樣,有什麼影響?

我意識到在沒有datanode的機器上運行的tasktracker不會有數據局部性的好處。但在實踐中,這是什麼意思?我在想,當在一個「一次性」機器上安排工作時,jobtracker將通過網絡發送一行輸入到tasktracker,然後該tasktracker將該行輸入並直接送到Mapper,而無需寫任何東西到光盤。這是怎麼回事?

哦,我正在使用Cloudera cdh3u3。不知道這是否重要。

回答

1

我在想,當在一個「一次性」機器上安排工作時,jobtracker將通過網絡發送一行輸入到tasktracker,然後輸入該行並輸入它直接寫入映射器,而不寫任何東西到光盤。這是怎麼回事?

不完全是,作業跟蹤器任務任務跟蹤器運行地圖任務來處理輸入拆分。 JobTracker不會將數據傳遞給任務跟蹤器,更多的是傳遞序列化的分割信息(文件名,起始偏移量和長度)。 TaskTracker運行MapTask,它是MapTask實例化InputFormat和關聯的RecordReader以獲取拆分信息 - 將輸入鍵/值傳遞給Mapper。

如果您沒有本地數據節點,或者您確實有本地數據節點,但是數據不會在本地數據節點上覆制,則將通過網絡從另一個數據讀取數據節點(希望能在本地安裝,但仍可能來自其他地方)。

您可以在Hadoop計數器輸出中查看數據塊在任務本地或機架本地的頻率統計信息。

+0

謝謝。這正是我需要的。 – sangfroid 2012-04-27 16:59:21

+0

@Chris:上述案例中的拆分信息從哪裏來?它是否來自用戶提供的輸入格式(顯式地說InputSplit []返回的位置)? – 2013-06-07 09:17:58

+0

是的,輸入格式的getSplits方法被調用並返回一個InputSplit對象數組。 getSplits方法使用配置的作業信息(大多數基於文件的輸入格式爲'mapred.input.dir')來計算分割 – 2013-06-07 12:01:42

相關問題