2013-06-27 110 views
4

这里超新的HBase/Hadoop。我有一个双节点HBase测试集群正在运行,现在我正尝试从远程Java客户端连接到该集群。这里是我卡住的地方:客户端成功连接到单服务器Zookeeper仲裁(与HBase主服务器运行在同一台服务器上),但Zookeeper传回客户端的地址是localhost,(显然)客户端失败连接到任何东西,因为HBase不在本地运行。考虑到我无法编辑客户端主机文件出于管理的原因(在任何情况下,我不倾向于,因为这似乎是一个可怕的黑客),有没有办法让Zookeeper返回一个适当的IP为HBase主服务器?HBase:Zookeeper告诉远程客户端连接到本地主机

Java代码:

public static final String MASTER_IP = "10.3.248.105"; 
public static final String ZOOKEEPER_PORT = "2181"; 

Configuration config = HBaseConfiguration.create(); 
config.set("hbase.zookeeper.quorum", MASTER_IP); 
config.set("hbase.zookeeper.property.clientPort", ZOOKEEPER_PORT); 

System.out.println("Running connecting test..."); 

try { 
    HBaseAdmin.checkHBaseAvailable(config); 
    System.out.println("HBase found!"); 
    HTable table = new HTable(config, "testTable"); 
    System.out.println("Table testTable obtained!"); 
} catch (MasterNotRunningException e) { 
    System.out.println("HBase connection failed!"); 
    e.printStackTrace(); 
} catch (ZooKeeperConnectionException e) { 
    System.out.println("Zookeeper connection failed!"); 
    e.printStackTrace(); 
} catch (Exception e) { e.printStackTrace(); } 

错误转储:

13/06/27 11:20:25 INFO zookeeper.ZooKeeper: Initiating client connection, connectString=10.3.248.105:2181 sessionTimeout=180000 watcher=hconnection 
13/06/27 11:20:25 INFO zookeeper.RecoverableZooKeeper: The identifier of this process is [email protected] 
13/06/27 11:20:29 INFO zookeeper.ClientCnxn: Opening socket connection to server 10.3.248.105/10.3.248.105:2181. Will not attempt to authenticate using SASL (unknown error) 
13/06/27 11:20:29 INFO zookeeper.ClientCnxn: Socket connection established to 10.3.248.105/10.3.248.105:2181, initiating session 
13/06/27 11:20:29 INFO zookeeper.ClientCnxn: Session establishment complete on server 10.3.248.105/10.3.248.105:2181, sessionid = 0x13f8638485c0003, negotiated timeout = 180000 
13/06/27 11:20:30 INFO client.HConnectionManager$HConnectionImplementation: getMaster attempt 0 of 1 failed; no more retrying. 
java.net.UnknownHostException: unknown host: localhost.localdomain 
HBase connection failed! 
at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.<init>(HBaseClient.java:276) 
at org.apache.hadoop.hbase.ipc.HBaseClient.createConnection(HBaseClient.java:255) 
at org.apache.hadoop.hbase.ipc.HBaseClient.getConnection(HBaseClient.java:1111) 
at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:974) 
at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:86) 
at com.sun.proxy.$Proxy5.getProtocolVersion(Unknown Source) 
at org.apache.hadoop.hbase.ipc.WritableRpcEngine.getProxy(WritableRpcEngine.java:138) 
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getMaster(HConnectionManager.java:712) 
at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:126) 
at org.apache.hadoop.hbase.client.HBaseAdmin.checkHBaseAvailable(HBaseAdmin.java:1781) 
at hbaseimagestore.HBaseImageStore.main(HBaseImageStore.java:44) 
13/06/27 11:20:30 INFO client.HConnectionManager$HConnectionImplementation: Closed zookeeper sessionid=0x13f8638485c0003 
13/06/27 11:20:30 INFO zookeeper.ZooKeeper: Session: 0x13f8638485c0003 closed 
org.apache.hadoop.hbase.MasterNotRunningException: Retried 1 times 
at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:138) 
at org.apache.hadoop.hbase.client.HBaseAdmin.checkHBaseAvailable(HBaseAdmin.java:1781) 
at hbaseimagestore.HBaseImageStore.main(HBaseImageStore.java:44) 
13/06/27 11:20:30 INFO zookeeper.ClientCnxn: EventThread shut down 

编辑:此外,/ etc/hosts中的主/动物园管理员服务器上的文件:

10.3.248.105 master 
10.3.248.106 slave 
127.0.0.1 localhost 

回答

1

我不不知道这是否是最好的方法,但它应该做到这一点。将主人的主机文件更改为:

10.3.248.105 master  localhost 
10.3.248.106 slave 
#127.0.0.1 localhost 

在此更改后重新启动hbase。

+0

成功地让客户端查询'master'而不是'localhost',但由于'master'没有定义客户端,所以它也无法连接。有没有办法只获取本地IP地址而不是主机名,或者我将不得不建立一个本地DNS或某些东西来处理主机名解析? –

+0

在ZK的主机文件中做同样的改变,看看它是否有帮助。 – Tariq

+0

Zookeeper和master在同一台服务器上运行,不应该使用相同的hostfile吗? –

相关问题