Hi all I met a problem when I try to balance certain hdfs directory among the clusters. For example, I have a directory "/user/xxx/", and there 100 blocks. I want to balance them among my 5 nodes clusters. Each node has 40 blocks (2 replicas). The problem is about transfer block from one datanode to another. Actually, I followed the balancer's method. However, it always waits for the response of destination datanode and halt. I attached the code: .................................................
Socket sock = new Socket(); DataOutputStream out = null; DataInputStream in = null; try{ sock.connect(NetUtils.createSocketAddr( target.getName()), HdfsConstants.READ_TIMEOUT); sock.setKeepAlive(true); System.out.println(sock.isConnected()); out = new DataOutputStream( new BufferedOutputStream( sock.getOutputStream(), FSConstants.BUFFER_SIZE)); out.writeShort(DataTransferProtocol.DATA_TRANSFER_VERSION); out.writeByte(DataTransferProtocol.OP_REPLACE_BLOCK); out.writeLong(block2move.getBlockId()); out.writeLong(block2move.getGenerationStamp()); Text.writeString(out, source.getStorageID()); System.out.println("Ready to move"); source.write(out); System.out.println("Write to output Stream"); out.flush(); System.out.println("out has been flushed!"); in = new DataInputStream( new BufferedInputStream( sock.getInputStream(), FSConstants.BUFFER_SIZE)); It stop here and wait for response. short status = in.readShort(); System.out.println("Got the response from input stream!"+status); if (status != DataTransferProtocol.OP_STATUS_SUCCESS) { throw new IOException("block move is failed\t"+status); } } catch (IOException e) { LOG.warn("Error moving block "+block2move.getBlockId()+ " from " + source.getName() + " to " + target.getName() + " through " + source.getName() + ": "+e.toString()); } finally { IOUtils.closeStream(out); IOUtils.closeStream(in); IOUtils.closeSocket(sock); } .......................................... Any reply will be appreciated. Thank you in advance! Chen