【问题标题】:Hbase client can't connect to remote Hbase serverHbase 客户端无法连接到远程 Hbase 服务器
【发布时间】:2019-05-04 19:56:47
【问题描述】:

我为远程服务器编写了以下 hbase 客户端类:

System.out.println("Hbase Demo Application ");

            // CONFIGURATION

                // ENSURE RUNNING
            try {
                HBaseConfiguration config = new HBaseConfiguration();
                config.clear();
                config.set("hbase.zookeeper.quorum", "192.168.15.20");
                config.set("hbase.zookeeper.property.clientPort","2181");
                config.set("hbase.master", "192.168.15.20:60000");
                //HBaseConfiguration config = HBaseConfiguration.create();
    //config.set("hbase.zookeeper.quorum", "localhost");  // Here we are running zookeeper locally
                HBaseAdmin.checkHBaseAvailable(config);


                System.out.println("HBase is running!");
            //  createTable(config);    
                //creating a new table
                HTable table = new HTable(config, "mytable");
                System.out.println("Table mytable obtained ");  
                addData(table);
            } catch (MasterNotRunningException e) {
                System.out.println("HBase is not running!");
                System.exit(1);
            }catch (Exception ce){ ce.printStackTrace();

它抛出了一些异常:

Oct 17, 2011 1:43:54 PM org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation getMaster
INFO: getMaster attempt 0 of 1 failed; no more retrying.
java.net.ConnectException: Connection refused
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
    at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
    at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:404)
    at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.setupIOstreams(HBaseClient.java:328)
    at org.apache.hadoop.hbase.ipc.HBaseClient.getConnection(HBaseClient.java:883)
    at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:750)
    at org.apache.hadoop.hbase.ipc.HBaseRPC$Invoker.invoke(HBaseRPC.java:257)
    at $Proxy4.getProtocolVersion(Unknown Source)
    at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:419)
    at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:393)
    at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:444)
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getMaster(HConnectionManager.java:359)
    at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:89)
    at org.apache.hadoop.hbase.client.HBaseAdmin.checkHBaseAvailable(HBaseAdmin.java:1215)
    at com.ifkaar.hbase.HBaseDemo.main(HBaseDemo.java:31)
HBase is not running!

你能告诉我为什么它会抛出异常,代码有什么问题以及如何解决它。

【问题讨论】:

  • 在提出新问题之前,请先接受旧问题的答案。没有人愿意回答您的问题,因为您没有提供任何反馈。
  • 好的。从现在开始我会的。我是这个网站的新用户。通常我会投票给对我有帮助的答案。谢谢
  • config.set("hbase.master", "192.168.15.20:60000"); 你能把这行注释掉再试一次吗?
  • 我又试了一次,结果还是一样。
  • 你能telnet 192.168.15.20:2181(有连接问题吗?)

标签: java hadoop hbase


【解决方案1】:

此问题是由于您的 HBase 服务器的主机文件而发生的。
您只需要编辑 HBase 服务器的 /etc/hosts 文件。
从该文件中删除 localhost 条目,并将 localhost 条目放在 HBase 服务器 IP 的前面。

例如,您的 HBase 服务器的 /etc/hosts 文件如下所示:

127.0.0.1 localhost
192.166.66.66 xyz.hbase.com hbase

你必须通过删除 localhost 来改变它:

# 127.0.0.1 localhost # line commented out
192.166.66.66 xyz.hbase.com hbase localhost # note: localhost added here

这是因为当远程机器询问 HMaster 运行在哪里的 hbase 服务器机器时,它告诉它正在 localhost 上运行。
因此,如果条目是 127.0.0.1,则 HBase 服务器返回此地址,远程机器开始在自己的机器上(本地)查找 HMaster。
当我们使用 HBase 服务器 IP 更改它时,一切正常 :)

【讨论】:

  • 更改后必须重启Hbase。 'netstat -a | grep 6000' 命令在这里很有帮助,因为它表明 master 绑定到本地接口。
  • 有什么优雅的方法可以做到这一点吗?我们可以在某些配置文件中指定 xyz.hbase.com 而不是更改主机文件吗?谢谢。这个解决方案实际上对我有用,但不是那么优雅。
  • 谁明白,他想说什么。请编辑此帖子以使其可读。
  • @seb 他说“删除 127.0.0.1 行并将 localhost 添加到真实 IP 地址行”
  • 但是,在删除 127.0.0.1 并将 localhost 添加到 ip 地址后,ssh 没有建立连接(“ssh username@ip-addr”和“ssh username@localhost”都给出了 'connection closed通过远程主机')重新启动 hbase 实例。有谁知道可能是什么问题?
【解决方案2】:

我同意.. HBase 对 /etc/hosts 配置非常敏感.. 我必须正确设置 hbase-site.xml 中的 zeekeeper 绑定属性才能使上述 Java 代码正常工作...对于示例:我必须将其设置如下:

{property}
  {name}hbase.zookeeper.quorum{/name}
  {value}www.remoterg12.net{/value}      {!-- this is the externally accessible domain --}
{/property}
{property}
  {name}hbase.zookeeper.property.clientPort{/name}
  {value}2181{/value}              {!-- everything needs to be externally accessible --}
{/property}
{property}
  {name}hbase.master.info.port{/name}    {!--   http://www.remoterg12.net:60010/ --}
  {value}60010{/value}
{/property}
{property}
  {name}hbase.master.info.bindAddress{/name}
  {value}www.remoterg12.net{/value}      {!-- Use this to access the GUI console, --}
{/property}

远程 GUI 将为您提供绑定域的清晰图片。例如,“GUI Web 控制台”中的 [HBase Master] 属性应该是这样的:www.remoterg12.net:60010(它应该不是 localhost:60010 )... 是的!!,我确实不得不玩弄 /etc/hosts 因为我不想弄乱现有的 Apache 配置:-)

【讨论】:

    【解决方案3】:

    同样的问题可以通过编辑hbase目录下的conf/regionservers文件在里面添加Hbase服务器(Remote)来解决。那么就不需要修改etc/hosts文件了

    编辑后conf/regionservers 将如下所示:

    localhost  
    ip address of the remote hbase server
    

    例如

    localhost              
    10.132.258.366
    

    【讨论】:

    • 您能否更详细地解释这种方法?我不明白你的意思。
    • 这似乎不起作用编辑 /etc/host 文件只会使 hbase 远程客户端工作
    【解决方案4】:

    与 HBase 1.1.3 完全相同的问题。 同一网络上的 2 台虚拟机 (Ubuntu)。日志显示客户端可以访问 Zookeeper,但不能访问 HBase 服务器。

    TL;DR:删除服务器上/etc/hosts 中的以下行(server_hostame):

    127.0.1.1 server_hostname server_hostname
    

    然后用127.x.y.z在(本地)网络上添加您的服务器的IP:

    192.x.y.z server_hostname
    

    我在客户端和服务器端尝试了很多组合。在独立模式下,我认为没有更好的方法。 并不是真的为此感到自豪。不得不弄乱网络配置,甚至没有提供能够远程连接到服务器的 HBase shell 客户端,这是一种耻辱(欢迎来到 Java 的幻想世界......)

    在服务器端,将文件 conf/hbase-site.xml 留空。您不需要在此处放置 Zookeeper 配置,默认值就可以了。 etc/regionservers 也一样。将其保留为默认条目 (localhost),因为我认为在独立模式下它并不在乎(我尝试将 server_hostname 放入其中,当然这不起作用)。

    在客户端,如果你想用它解析,它必须通过主机名知道服务器,所以再次在你的/etc/hosts 客户端文件中为服务器添加一个条目。

    作为奖励,我给你我的 sbt 配置和一些完整客户端的工作代码,因为 HBase 团队似乎在过去 4 年中花费了在拉斯维加斯的文档预算(再次,欢迎 Java/Scala 的“业务就绪”世界)。

    build.sbt

    libraryDependencies ++= Seq(
      ...
      "org.apache.hadoop" % "hadoop-core" % "1.2.1",
      "org.apache.hbase" % "hbase" % "1.1.2",
      "org.apache.hbase" % "hbase-client" % "1.1.2",
    )
    

    some_client_code.scala

    import org.apache.hadoop.hbase.HBaseConfiguration
    import org.apache.hadoop.hbase.client.{HTable, Put, HBaseAdmin}
    import org.apache.hadoop.hbase.util.Bytes
    
    val hbaseConf = HBaseConfiguration.create()
    hbaseConf.set("hbase.zookeeper.quorum", "server_hostname")
    HBaseAdmin.checkHBaseAvailable(hbaseConf)
    
    val table = new HTable(hbaseConf, "my_hbase_table")
    val put = new Put(Bytes.toBytes("row_key"))
    put.add(Bytes.toBytes("cf"), Bytes.toBytes("colId1"), Bytes.toBytes("foo"))
    

    【讨论】:

      【解决方案5】:

      我知道现在回答这个问题为时已晚,但我想分享我解决类似问题的方法。

      我遇到了同样的问题,我尝试通过 java 程序设置 zookeeper quorum,也尝试通过 CLI,但它们都不起作用。

      我正在使用 CDH 5.7.7 和 HBase 版本 1.1.0 最后我不得不将一些配置导出到 Hadoop 类路径来解决这个问题。这是我导出的配置。

      export HADOOP_CLASSPATH=/etc/hadoop/conf:/usr/share/cmf/lib/cdh5/hbase-protocol-0.98.1-cdh5.5.0.jar:/etc/hbase/conf:/driven/conf
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多