2014-08-29 18 views
7

Non riesco a connettermi a HBase in esecuzione in Docker su Windows (immagine banno/hbase-standalone). Tuttavia, posso connettermi a HBase installato localmente.Connessione a HBase in esecuzione nella finestra mobile

banno/hbase-standalone immagine viene eseguito utilizzando:

docker run -d -p 2181:2181 -p 60000:60000 -p 60010:60010 -p 60020:60020 -p 60030:60030 banno/hbase-standalone 

Ho anche creato la port forwarding sul boot2docker-vm (che è necessaria quando si esegue su Windows): enter image description here

posso telnet con successo a tutti coloro porte sul mio localhost.

Avanti, ecco un esempio di codice che usiamo nei nostri test:

Configuration config = HBaseConfiguration.create(); 
config.clear(); 
config.setInt("timeout", 12000); 
config.set("zookeeper.znode.parent", "/hbase"); 
config.set("hbase.zookeeper.quorum", "127.0.0.1"); 
config.set("hbase.zookeeper.property.clientPort", "2181"); 
config.set("hbase.master", "127.0.0.1:60000"); 

final Configuration configuration = HBaseConfiguration.create(config); 

JobDefinition.Buildable.dumpProperties(configuration, newArrayList("hbase.*")); 

HBaseAdmin.checkHBaseAvailable(config); 

che fa sì che la seguente eccezione

Exception in thread "main" org.apache.hadoop.hbase.MasterNotRunningException: com.google.protobuf.ServiceException: java.net.UnknownHostException: unknown host: a3e6c240af20 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$StubMaker.makeStub(HConnectionManager.java:1651) 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$MasterServiceStubMaker.makeStub(HConnectionManager.java:1677) 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getKeepAliveMasterService(HConnectionManager.java:1885) 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.isMasterRunning(HConnectionManager.java:900) 
    at org.apache.hadoop.hbase.client.HBaseAdmin.checkHBaseAvailable(HBaseAdmin.java:2366) 
    at com.xxx.compute.hadoop.jobs.transaction.OurTest.main(OurTest.java:24) 
Caused by: com.google.protobuf.ServiceException: java.net.UnknownHostException: unknown host: a3e6c240af20 
    at org.apache.hadoop.hbase.ipc.RpcClient.callBlockingMethod(RpcClient.java:1674) 
    at org.apache.hadoop.hbase.ipc.RpcClient$BlockingRpcChannelImplementation.callBlockingMethod(RpcClient.java:1715) 
    at org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$BlockingStub.isMasterRunning(MasterProtos.java:42561) 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$MasterServiceStubMaker.isMasterRunning(HConnectionManager.java:1688) 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$StubMaker.makeStubNoRetries(HConnectionManager.java:1597) 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$StubMaker.makeStub(HConnectionManager.java:1623) 
    ... 5 more 
Caused by: java.net.UnknownHostException: unknown host: a3e6c240af20 
    at org.apache.hadoop.hbase.ipc.RpcClient$Connection.<init>(RpcClient.java:386) 
    at org.apache.hadoop.hbase.ipc.RpcClient.createConnection(RpcClient.java:352) 
    at org.apache.hadoop.hbase.ipc.RpcClient.getConnection(RpcClient.java:1526) 
    at org.apache.hadoop.hbase.ipc.RpcClient.call(RpcClient.java:1438) 
    at org.apache.hadoop.hbase.ipc.RpcClient.callBlockingMethod(RpcClient.java:1657) 
    ... 10 more 

Questo è spiegabile. Corriamo Windows, che richiede la macchina virtuale boot2docker-vm in esecuzione tramite NAT. Il contenitore Docker dell'immagine è in esecuzione all'interno dello boot2docker-vm anche utilizzando NAT. Tuttavia, le porte sono "visibili" alla macchina host che esegue i test, poiché il contenitore Docker esporta le porte e lo boot2docker-vm inoltra le porte alla macchina host. Il nome deriva a3e6c240af20 in realtà dal contenitore ID Docker, quindi probabilmente a3e6c240af20 è un nome host per il contenitore Docker:

CONTAINER ID  IMAGE       COMMAND    CREATED    STATUS    PORTS                               NAMES 
a3e6c240af20  banno/hbase-standalone:latest "/bin/sh -c '/opt/hb 24 minutes ago  Up 24 minutes  0.0.0.0:2181->2181/tcp, 0.0.0.0:60000->60000/tcp, 0.0.0.0:60010->60010/tcp, 0.0.0.0:60020->60020/tcp, 0.0.0.0:60030->60030/tcp agitated_wozniak 

io non sono sicuro di come esattamente funziona la comunicazione HBase, ma a quanto pare fa chiamate RPC all'istanza. HBase Docker restituisce il suo nome host sperando che il client lo chiamerà lì. Ma poiché sia ​​il contenitore boot2docker-vm che il contenitore Docker in esecuzione tramite NAT, il computer host non vede il contenitore Docker.

Ho provato ad aggiungere a3e6c240af20 al mio file hosts:

127.0.0.1 a3e6c240af20 

tanto sono un errore diverso, anche durante la chiamata RPC, che in realtà non mi aiuta molto:

Exception in thread "main" org.apache.hadoop.hbase.MasterNotRunningException: com.google.protobuf.ServiceException: java.lang.NullPointerException 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$StubMaker.makeStub(HConnectionManager.java:1651) 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$MasterServiceStubMaker.makeStub(HConnectionManager.java:1677) 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getKeepAliveMasterService(HConnectionManager.java:1885) 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.isMasterRunning(HConnectionManager.java:900) 
    at org.apache.hadoop.hbase.client.HBaseAdmin.checkHBaseAvailable(HBaseAdmin.java:2366) 
    at com.xxx.compute.hadoop.jobs.transaction.OurTest.main(OurTest.java:24) 
Caused by: com.google.protobuf.ServiceException: java.lang.NullPointerException 
    at org.apache.hadoop.hbase.ipc.RpcClient.callBlockingMethod(RpcClient.java:1674) 
    at org.apache.hadoop.hbase.ipc.RpcClient$BlockingRpcChannelImplementation.callBlockingMethod(RpcClient.java:1715) 
    at org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$BlockingStub.isMasterRunning(MasterProtos.java:42561) 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$MasterServiceStubMaker.isMasterRunning(HConnectionManager.java:1688) 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$StubMaker.makeStubNoRetries(HConnectionManager.java:1597) 
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$StubMaker.makeStub(HConnectionManager.java:1623) 
    ... 5 more 
Caused by: java.lang.NullPointerException 
    at org.apache.hadoop.hbase.ipc.RpcClient$Connection.writeRequest(RpcClient.java:1051) 
    at org.apache.hadoop.hbase.ipc.RpcClient.call(RpcClient.java:1440) 
    at org.apache.hadoop.hbase.ipc.RpcClient.callBlockingMethod(RpcClient.java:1657) 
    ... 10 more 

fa qualcuno ha un suggerimento su come questo può essere risolto?

+0

Forse HBase apre le porte casuali per le richieste RPC, ma contenitore finestra mobile non esporli. Sto avendo lo stesso problema ora. – tobe

risposta

1

Prova aggiungere [boot2docker IP] a3e6c240af20 invece di 127.0.0.1 perché cliente HBase Java ha bisogno per raggiungere il tuo docker's host non esattamente localhost raggiungere Zookeeper (CMIIW). Non sono sicuro se funzionerà, ma funzionerà sul mio Windows.

0

Ho utilizzato la finestra mobile oddpoet/hbase-cdh5 per evitare questo problema.

docker run -d -p 2181:2181 -p 60000:60000 -p 60010:60010 -p 60020:60020 -p 60030:60030 -h hbase oddpoet/hbase-cdh5 

fig.yml

hbase: 
    image: oddpoet/hbase-cdh5 
    hostname: hbase 
    ports: 
    - "3181:2181" 
    - "60000:60000" 
    - "60010:60010" 
    - "60020:60020" 
    - "60030:60030" 

il mio file di configurazione

conf.set("hbase.zookeeper.quorum", zkPath); 
    conf.set("hbase.zookeeper.property.clientPort","2181"); 
    conf.set("zookeeper.znode.parent", "/hbase"); 

    conf.set("hbase.client.retries.number", "3"); // default 35 
    conf.set("hbase.rpc.timeout", "10000"); // default 60 secs 
    conf.set("hbase.rpc.shortoperation.timeout", "5000"); // default 10 secs