2014-03-19 56 views
1

我已經通過遵循Amazon自己的教程(http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-hbase-launch.html),使用具有所有默認設置的AWS控制檯設置了Amazon EC2集羣。我部署了一個運行Hadoop 2.2.0和HBASE 0.94.7的AMI 3.0.4。我希望能夠在我自己的計算機上運行一個Java程序,該程序將使用JAVA API連接到HBASE。以前,我已經能夠成功地使用我自己設置的Amazon EC2實例,但使用更新版本的HBASE(0.96.1.1-hadoop2),但是我在此新羣集設置下收到以下錯誤:如何通過Java API遠程連接到EC2上的HBASE

Exception in thread "main" org.apache.hadoop.hbase.MasterNotRunningException: com.google.protobuf.ServiceException: java.io.IOException: Call to <MY_EC2_MASTER_INTERNAL_HOST_NAME>/<THE_EC2_MASTER_EXTERNAL_IP>:60000 failed on local exception: java.io.IOException: Connection reset by peer 

我已經檢查了服務器運行的是,我已經正確映射的EC2內部主機名在我的本地/ etc公共IP地址/ hosts文件正是因爲我曾與我建立了亞馬遜的實例來完成我。我也在亞馬遜上打開了正確的端口(2181,60000,60010,60020,60030-可能甚至不需要所有這些端口),並且目前接受來自所有IP源的流量(暫時直到我完成正確的設置並且我解決了這個問題問題)。

我的Java API使用下面的配置(和最後一行導致錯誤):

Configuration config = HBaseConfiguration.create(); 
config.set("hbase.zookeeper.quorum", "<EC2_MASTER_PUBLIC_IP_ADDRESS>"); 
config.set("hbase.zookeeper.property.clientPort","2181"); 
this.conf = config; 
this.tokenizer = ObjectFactory.createOpenNLPTokenizer(); 
HBaseAdmin.checkHBaseAvailable(this.conf); 

任何想法可能會造成什麼問題呢?這可能是我的hbase客戶端版本(0.96.1.1-hadoop2)與Amazon HBase爲0.94.7的事實不符?我在這個版本的maven倉庫找不到HBase客戶端,這就是爲什麼我使用稍微更新的版本。

+0

請您詳細說明如何映射/ etc/hosts文件中的IP地址嗎? – Gevorg

回答

1

不要使用從maven存儲庫下載的jar文件。而是從AWS EMR集羣的lib文件夾中複製hbase jar,並將其放入本地計算機的lib文件夾中。
現在使用複製的hbase jar文件在classpath中編譯代碼,即javac -cp "hbase-jar-copied-location" filename.java,然後運行。
亞馬遜在hbase jar中使用了一些自定義來滿足他們的需求,這就是爲什麼從外部maven倉庫下載的針對hbase jar編譯的程序不工作的原因。

+0

謝謝你的回答。我嘗試了你的建議,但是hbase jar必須在Amazon創建的類中包含其他依賴項,因爲即使我的項目在Eclipse中編譯,但在運行它時我也會得到以下錯誤: 'main「java.lang.NoClassDefFoundError:亞馬遜/ emr/metrics/MetricsSaver $ StopWatch' – xavierdimaggio

+0

是的,可能會發生。嘗試將整個lib文件夾從EMR複製到本地計算機,並刪除本地羣集中已有的庫。 –

+0

爲您做了這項工作?有很多罐子,需要哪些罐子? – Gevorg