我現在擁有12個節點的集羣。它們中的一些,特別是8個節點具有足夠的磁盤空間。但其他4只有很少的空間可供使用。帶有一些節點磁盤空間不足的Hadoop集羣〜
但是,其他4個節點仍然具有較高的RAM和CPU配置。所以我的意圖是利用這些資源。但是現在,當我運行算法SlopeOne時,地圖將輸出如此多的中間數據並將它們存儲在磁盤上。因此,我在這個描述下貼了一些錯誤。
我在想:
- 如果某個節點發現它不能在本地存儲數據,它會嘗試將數據存儲到具有足夠磁盤空間的其他節點?
- 如果單個節點無法在本地存儲數據,它是否會再次開始工作?
- 如果某些具有足夠磁盤空間的節點先完成一個映射作業,它是否會繼續運行分配給低磁盤空間的作業?
- 我知道我可以設置一個參數,它可以限制本地空間的使用,如果一個節點超過了這個限制,jobtracker將不會給該節點提供更多的作業。但是這種方法是否會讓節點停留在那裏而不工作?
- 任何建議,我可以利用資源,並保持錯誤?
欣賞任何想法。
java.io.IOException: Spill failed
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:860)
at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:466)
at slopeone.SlopeOneTrainer$SlopeOneTrainMapper.map(SlopeOneTrainer.java:71)
at slopeone.SlopeOneTrainer$SlopeOneTrainMapper.map(SlopeOneTrainer.java:1)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:358)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307)
at org.apache.hadoop.mapred.Child.main(Child.java:170)
Caused by: org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory for taskTracker/jobcache/job_201104070658_0006/attempt_201104070658_0006_m_000000_0/output/spill897.out
at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:343)
at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:124)
at org.apache.hadoop.mapred.MapOutputFile.getSpillFileForWrite(MapOutputFile.java:107)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1221)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.access$1800(MapTask.java:686)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer$SpillThread.run(MapTask.java:1173)
我有一個類似的問題(我認爲) - 我們發現,當我們擁有異構磁盤配置的機器,HDFS似乎以與其他磁盤相同的速度填充存儲空間較少的機器。看來HDFS應該有一些能力來反映磁盤使用情況並進行調整。再平衡的作品,但它只是暫時的。 – 2016-01-24 18:49:07