如何使用Java API远程连接到EC2上的HBASE

时间:2014-03-19 18:04:22

标签: java amazon-ec2 hbase

我已经使用AWS控制台设置了一个Amazon EC2集群,其中包含所有默认设置,遵循亚马逊自己的教程(http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-hbase-launch.html)。我已经部署了运行Hadoop 2.2.0和HBASE 0.94.7的AMI 3.0.4。我希望能够在我自己的计算机上运行一个java程序,它将使用JAVA API连接到HBASE。以前,我已经能够使用我自己设置但使用更新版本的HBASE(0.96.1.1-hadoop2)的Amazon EC2实例成功完成此操作但是我在这个新的集群设置下遇到以下错误:< / p>

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 / hosts文件中的公共IP地址,就像我自己设置的Amazon实例一样。我也有正确的端口(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客户端,这就是我使用稍新版本的原因。

1 个答案:

答案 0 :(得分:1)

不要使用从maven资源库下载的jar 。而是,从AWS EMR集群的lib文件夹中复制hbase jar并将其放在本地计算机的lib文件夹中。
现在使用类路径中的复制hbase jar文件编译代码,即javac -cp "hbase-jar-copied-location" filename.java,然后运行。
亚马逊在hbase jar中使用一些自定义来满足他们的需求,这就是&#39; s为什么针对从外部maven存储库下载的hbase jar编译的程序不起作用。