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がまともに動くようになりますよ.