1

我现在拥有一个有 12 个节点的集群。其中一些,特别是 8 个节点,有足够的磁盘空间。但其他 4 个只有很少的空间可以使用。

但是,其他 4 个节点的 RAM 和 CPU 配置仍然很高。所以我的目的是利用这些资源。但是现在,当我运行一个算法 SlopeOne 时,地图会输出这么多中间数据并将它们存储在磁盘上。因此存在一些错误,我将其粘贴在此描述下。

我想知道:

  1. 如果某个节点发现本地无法存储数据,是否会尝试将数据存储到其他有足够磁盘空间的节点?
  2. 如果单个节点无法在本地存储数据,它会重新开始工作吗?
  3. 如果一些有足够磁盘空间的节点先完成一个映射作业,它会继续运行分配给低磁盘空间的作业吗?
  4. 我知道我可以设置一个参数,它可以限制本地空间的使用,如果一个节点超过这个限制,jobtracker 不会给那个节点更多的作业。但是这种方法会不会让节点停留在那里而不工作?
  5. 有什么建议可以让我利用这些资源并避免错误吗?

欣赏任何想法。

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)
4

1 回答 1

0

您可以尝试减少复制的数量,如这个问题HDFS Reduced Replication Factor The default replication factor is 3

于 2014-05-08T05:52:55.553 回答