4

因此,我试图使用自定义jar查询我的Amazon EC2上的hbase集群,我作为MapReduce步骤启动。 IM我的罐子(map函数里面)我叫HBase的像这样:从亚马逊EMR上的java使用hbase

public void map(Text key, BytesWritable value, Context contex) throws IOException, InterruptedException { 
    Configuration conf = HBaseConfiguration.create(); 
    HTable table = new HTable(conf, "tablename"); 
     ... 

的问题是,当它到达该HTable线,并尝试连接到HBase的,步骤失败,我收到以下错误:

2014-02-28 18:00:49,936 INFO [main] org.apache.zookeeper.ZooKeeper: Initiating client connection, connectString=localhost:2181 sessionTimeout=180000 watcher=hconnection 
2014-02-28 18:00:49,974 INFO [main] org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper: The identifier of this process is [email protected] 
2014-02-28 18:00:49,998 INFO [main-SendThread(localhost:2181)] org.apache.zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error) 
2014-02-28 18:00:50,005 WARN [main-SendThread(localhost:2181)] org.apache.zookeeper.ClientCnxn: Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect 
java.net.ConnectException: Connection refused 

     ... 

2014-02-28 18:01:05,542 WARN [main] org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper: Possibly transient ZooKeeper exception: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/hbaseid 
2014-02-28 18:01:05,542 ERROR [main] org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper: ZooKeeper exists failed after 3 retries 
2014-02-28 18:01:05,542 WARN [main] org.apache.hadoop.hbase.zookeeper.ZKUtil: hconnection Unable to set watcher on znode (/hbase/hbaseid) 
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/hbaseid 

     ... and on and on 

我可以使用hbase shell就好了,并且可以从shell中查询数据和一切。我不知道从哪里开始,我一直在搜索几个小时没有运气。大多数像这样在互联网上的问题不谈论亚马逊的具体修复。我认为zookeeper和hbase应该自动通过亚马逊bootstrap正确连接。

即时通讯使用hbase 0.94.17 jar和amazon正在运行hbase 0.94.7 im很确定这不是问题,我猜测它更多的是我没有正确设置Java代码。如果有人可以帮助这个itd将不胜感激。谢谢

+0

所以通过在代码中设置zookeeper仲裁(conf.set(“hbase.zookeeper.quorum”,“”);) 我能够得到它的工作,但我不能硬编码我的主节点ip每次进入我的java。看来,如果我不这样做,法定人数从一些配置作为'本地主机'而不是主节点仲裁,这是在我的hadoop配置(hdfs网站,mapred站点等)设置 本地主机被拉从? –

回答

6

好吧,经过近30小时的尝试,我找到了解决方案。 对此有许多警告,版本很重要。

在这种情况下,我使用amazon emr hadoop2(ami 3.0.4)与Hbase 0.94.7和Im试图在同一群集上运行自定义jar以通过java在本地访问hbase。

因此,第一件事情是,由于EC2面临的外部/内部IP idiosynchronicies,默认的hbase配置将不起作用。所以你不能使用HConfiguration(因为它默认为本地主机法定人数) 你需要做的是使用amazon为你设置的配置(位于/home/hadoop/hbase/conf/hbase-site.xml)只需手动将其添加到空白配置对象。

连接代码如下所示:

Configuration conf = new Configuration(); 
conf.addResource("/home/hadoop/hbase/conf/hbase-site.xml"); 
HBaseAdmin.checkHBaseAvailable(conf); 

其次,你必须使用打包成自定义罐子正确的HBase的罐子。原因是因为hbase 94.x是为hadoop1默认编译的,所以你必须抓取名为hbase-0.94.6-cdh4.3.0.jar的cloudera hbase jar(你可以在网上找到),它已经针对hadoop2编译过了。如果你不这样做,你会得到许多令人讨厌的,不可搜索的错误,包括org.apache.hadoop.net.NetUtils异常。

+0

我觉得我很接近!我得到一个'java.net.UnknownHostException:未知的主机:ip-my-internal-id-addres.ec2.internal',后面跟着一个'MasterNotRunningException'。对此有何想法? – Gevorg

+0

好像hbase没有正确启动。我注意到,某些实例类型不会在亚马逊EMR的每个错误中正确旋转hbase。尝试首先在m1.xlarges上运行一切,然后尝试实例配置。 –