Hadoop datanodeの複製はvirt-cloneしただけじゃ動かなかった

ちょっと前にkvmclone.plのエントリを書きました.
そこでも触れたのですが,HadoopのdatanodeにはstorageIDというものがあり,ノード固有の値が割り当てられています.
このstorageIDが重複すると,重複した片方が停止するようになっており,単に複製してもまともに動きません.
あらかじめ重複しないようにhadoop.tmp.dirを消さないとダメだよ,というお話です.

まずはそのままkvmcloneしてみる

ここでは,ホスト名をhadoop5として複製します.

kvmclone.pl -o Hadoop -n HadoopClone -t path/to/HadoopClone.img -s hadoop5 -i 192.168.0.x -m 255.255.255.0 -g 192.168.0.y


複製した仮想マシンを起動してみると,以下のようなdatanodeのログが出力されているはずです.

cat /usr/lib/hadoop-0.20/logs/hadoop-hadoop-datanode-hadoop5.log 

# DNA_REGISTERが延々出力された後,shutdownしている
INFO org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeCommand action: DNA_REGISTER
...
INFO org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeCommand action: DNA_REGISTER
WARN org.apache.hadoop.hdfs.server.datanode.DataNode: DataNode is shutting down: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.protocol.UnregisteredDatanodeException: Data node 192.168.0.x:50010 is attempting to report storage ID DS-1165321350-192.168.0.z-50010-1291546957260. Node 192.168.0.z:50010 is expected to serve this storage.

確かに落ちてますね...

VERSIONファイルが重要

ググってみたところ,どうやらHDFSにはノードごとにVERSIONファイルというものが存在し,その中に
storageIDが設定されているようです.実際見てみると,

cat /var/lib/hadoop-0.20/cache/hdfs/dfs/data/current/VERSION

# こんなのが表示されるはず
namespaceID=1402131522
storageID=DS-1165321350-192.168.0.z-50010-1291546957260
cTime=0
storageType=DATA_NODE
layoutVersion=-19

hadoop.tmp.dirを再作成

storageIDが重複しなければよいので,適当な値に書きかえればいいのですが,今回はキャッシュごと消しちゃいます.

# あらかじめdatanodeを停止します
service hadoop-0.20-datanode stop

# 古いキャッシュよ,さようなら...
rm -rf /var/lib/hadoop-0.20/cache

mkdir -p /var/lib/hadoop-0.20/cache
chmod 1777 /var/lib/hadoop-0.20/cache
	
# 再起動
service hadoop-0.20-datanode start

これで,複製した仮想マシンでも,datanodeがまともに動くようになりますよ.