我的HBASE 叢集的節點上有兩個網卡,一個是叢集內部使用的網卡,一個用來和外網傳輸資料。
但是部署安裝完成後 hbase regionserver 啟動後60020連接埠一直綁定內網網卡,這就導致外網無法訪問hbase 叢集;
DEBUG的出錯資訊:
2014-06-10 16:11:47.230-[main-DEBUG]org.apache.hadoop.ipc.RpcClient:Connecting to xxxxxxxxxxxxxxxx-yarn12/192.169.2.34:60020
2014-06-10 16:11:48.136-[main-DEBUG]org.apache.hadoop.ipc.RpcClient:IPC Client (29569230) connection to xxxxxxxxxxxxxxxx-yarn12/192.169.2.34:60020: Connection refused: no further information
java.net.ConnectException: Connection refused: no further information
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source)
at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:529)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:493)
at org.apache.hadoop.hbase.ipc.RpcClient$Connection.setupConnection(RpcClient.java:576)
at org.apache.hadoop.hbase.ipc.RpcClient$Connection.setupIOstreams(RpcClient.java:861)
at org.apache.hadoop.hbase.ipc.RpcClient.getConnection(RpcClient.java:1540)
at org.apache.hadoop.hbase.ipc.RpcClient.call(RpcClient.java:1429)
at org.apache.hadoop.hbase.ipc.RpcClient.callBlockingMethod(RpcClient.java:1658)
at org.apache.hadoop.hbase.ipc.RpcClient$BlockingRpcChannelImplementation.callBlockingMethod(RpcClient.java:1716)
at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$BlockingStub.get(ClientProtos.java:27308)
at org.apache.hadoop.hbase.protobuf.ProtobufUtil.getRowOrBefore(ProtobufUtil.java:1407)
at org.apache.hadoop.hbase.client.HTable$2.call(HTable.java:701)
at org.apache.hadoop.hbase.client.HTable$2.call(HTable.java:699)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:120)
at org.apache.hadoop.hbase.client.HTable.getRowOrBefore(HTable.java:705)
at org.apache.hadoop.hbase.client.MetaScanner.metaScan(MetaScanner.java:144)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.prefetchRegionCache(HConnectionManager.java:1107)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegionInMeta(HConnectionManager.java:1167)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:1059)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:1016)
at org.apache.hadoop.hbase.client.HTable.finishSetup(HTable.java:326)
at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:310)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getTable(HConnectionManager.java:712)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getTable(HConnectionManager.java:694)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getTable(HConnectionManager.java:684)
2014-06-10 16:11:48.136-[main-DEBUG]org.apache.hadoop.ipc.RpcClient:IPC Client (29569230) connection to xxxxxxxxxxxxxxxx-yarn12/192.169.2.34:60020 from xxxx: closed
。查看netstat -ntpl 後 發現 60020 綁定到hosts裡面配置的內網IP
tcp 0 0 :::60010 :::* LISTEN 12774/java tcp 0 0 ::ffff:192.169.2.34:60020 :::* LISTEN 12138/java </span>tcp 0 0 :::50060 :::* LISTEN 12288/java
查看org.apache.hadoop.hbase.regionserver.HRegionServer 中的建構函式 發現代碼如下:
// Server to handle client requests. String hostname = conf.get("hbase.regionserver.ipc.address", Strings.domainNamePointerToHostName(DNS.getDefaultHost( conf.get("hbase.regionserver.dns.interface", "default"), conf.get("hbase.regionserver.dns.nameserver", "default")))); int port = conf.getInt(HConstants.REGIONSERVER_PORT, HConstants.DEFAULT_REGIONSERVER_PORT); // Creation of a HSA will force a resolve. InetSocketAddress initialIsa = new InetSocketAddress(hostname, port); if (initialIsa.getAddress() == null) { throw new IllegalArgumentException("Failed resolve of " + initialIsa); }
發現 InetSocketAddress這裡面擷取IP的方式是解析hosts檔案裡面第一個和本機hostname對應的IP然後綁定。
所以在hbase-site.xml 裡面配置 hbase.regionserver.ipc.address 為0.0.0.0 。並重啟regionserver, netstat 後:
tcp 0 0 :::60020 :::* LISTEN 11300/java
解決問題。