【问题标题】:Trouble using hbase from java on Amazon EMR在 Amazon EMR 上使用来自 java 的 hbase 时遇到问题
【发布时间】:2014-04-02 00:59:01
【问题描述】:

所以我尝试使用作为 MapReduce 步骤启动的自定义 jar 来查询我在 Amazon ec2 上的 hbase 集群。我是我的 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 bootstrap 自动正确连接。

我正在使用 hbase 0.94.17 jar 并且亚马逊正在运行 hbase 0.94.7 我很确定这不是问题,我猜测更多的是我没有正确设置 Java 代码。如果有人可以提供帮助,将不胜感激。谢谢

【问题讨论】:

  • 所以通过在代码中设置 zookeeper 仲裁 (conf.set("hbase.zookeeper.quorum",""); ) 我能够让它工作,但我每次都无法将我的主节点 ip 硬编码到我的 java 中。似乎如果我不这样做,仲裁是从某个配置中提取的,作为“本地主机”而不是主节点仲裁,这是我的 hadoop 配置(hdfs-site、mapred-site 等)中设置的主节点仲裁从哪里提取本地主机?

标签: hadoop amazon-web-services hbase apache-zookeeper elastic-map-reduce


【解决方案1】:

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

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

因此,第一件事是默认的 hbase 配置将无法工作,因为 EC2 面临的外部/内部 IP 异同。所以你不能使用 HConfiguration (因为它默认为 localhost quorum) 您需要做的是使用亚马逊为您设置的配置(位于 /home/hadoop/hbase/conf/hbase-site.xml),然后手动将其添加到空白配置对象中。

连接代码如下所示:

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

其次,您必须使用正确的 hbase jar PACKAGED 到您的自定义 jar 中。原因是因为hbase 94.x默认是为hadoop1编译的,所以你必须获取已经针对hadoop2编译的名为hbase-0.94.6-cdh4.3.0.jar的cloudera hbase jar(你可以在网上找到这个)。如果您不执行此部分,您将收到许多令人讨厌的、无法通过 Google 搜索的错误,包括 org.apache.hadoop.net.NetUtils 异常。

【讨论】:

  • 我觉得我很接近了!我得到一个java.net.UnknownHostException: unknown host: ip-my-internal-id-addres.ec2.internal,然后是一个MasterNotRunningException。对此有什么想法吗?
  • 似乎 hbase 没有正确启动。我注意到某些实例类型不会根据亚马逊 EMR 的故障正确启动 hbase。首先尝试让所有东西都在 m1.xlarges 上运行,然后尝试实例配置。
猜你喜欢
  • 2021-10-29
  • 1970-01-01
  • 2022-06-12
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 2016-10-18
相关资源
最近更新 更多