在amazon emr上使用java中的hbase时出现问题

ux6nzvsh  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(360)

因此,我尝试在amazonec2上使用作为mapreduce步骤启动的自定义jar查询hbase集群。im my jar(在map函数中)我这样调用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 5119@ip-10-0-35-130.ec2.internal
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应该通过amazon引导自动正确连接。
我使用的是hbase 0.94.17jar,amazon运行的是hbase 0.94.7,我很确定这不是问题所在,我猜更多的是我没有正确设置java代码。如果有人能帮上忙,我们将不胜感激。谢谢

uwopmtnx

uwopmtnx1#

好吧,经过近30个小时的努力,我找到了解决办法。对此有许多警告,版本也很重要。
在本例中,im使用amazonemrhadoop2(ami3.0.4)和hbase 0.94.7,并尝试在同一集群上运行自定义jar,以便通过java本地访问hbase。
因此,第一件事是默认的hbase配置将无法工作,因为ec2面临外部/内部ip独特同步。因此,您不能使用hconfiguration(因为它默认为localhost quorum),您需要做的是使用amazon为您设置的配置(位于/home/hadoop/hbase/conf/hbase site.xml)并手动将其添加到一个空白的配置对象中。
连接代码如下所示:

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

其次,您必须使用打包到自定义jar中的正确hbase jar。原因是hbase 94.x默认是为hadoop1编译的,因此您必须获取名为hbase-0.94.6-cdh4.3.0.jar的cloudera hbase jar(您可以在网上找到这个),它是针对hadoop2编译的。如果你不做这一部分,你会得到许多讨厌的,不可搜索的错误,包括org.apache.hadoop.net.netutils异常。

相关问题