Chinaunix首页 | 论坛 | 博客
  • 博客访问: 128199
  • 博文数量: 69
  • 博客积分: 2895
  • 博客等级: 少校
  • 技术积分: 710
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-03 18:05
文章分类

全部博文(69)

文章存档

2010年(69)

我的朋友

分类:

2010-09-09 13:31:28

hadoop集群使用的时间长了,或者datnaode, dfs一次运行的时间长了,会发现有很多的的, 在under 的 情况下,很长时间内仍然无法得到复制,始终处于under replication的状态,导致如果时间一长,磁盘损坏多的情况下,dfs中的就有丢失的风险,严重的时候就会丢失数据。
      从apache的hadoop JIRA上搜索类似的情形,发现了两个issue在这个问题,分别是:

 

仔 细看了下这两个patch:

  • 端 启DataTransfer Daemon线程的时候是根据transferBlocks()里blocks数组的数量来启的,导致当某些block的replication为1,需 要transfer为2的时候,就会启两个DataTransfer进程,而这个进程里会对全局的xmitsInProgress进行++和--,一旦两 个线程都进行++,就会让xmitsInProgress变成2,这个信息会随着datanode的heartbeat传送到namenode端,而同时 由于namenode端同样也存在bug,在handleHeartbeat()的时候,是根据maxReplicationStreams - xmitsInProgress来进行getReplicationCommand,maxReplicationStreams为2个,也就是如果此时 datnaode传过来的xmitsInProgress是2,那么namenode就会传会一个空的replication命令,导致datanode 端无法进行replication操作。
  • namenode端的getReplicationCommand调用了BlockQueue 的poll()方法,在这个方法里patch- 5479将namenode发送空replication指令的bug去除了。

当然,这个问题也可以通过重启datanode,让 datanode里的很多线程重新启动来解决,但是不断的重启datanode始终不是好的办法,加上代码的bug fix,才能根本上解决问题。

阅读(684) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~