【问题标题】:Not able to connect to remote Hbase无法连接到远程 Hbase
【发布时间】:2011-08-24 13:30:44
【问题描述】:

我在分布式模式下安装了 Hbase。数据库工作正常,如果我的 webapp(spring + datanucleus JDO) 部署在与 Hbase master 相同的机器上,我可以连接到数据库。

但如果我在另一台机器上运行相同的 webapp,我将无法连接到 HBase 服务器。根本没有例外,webapp 只是停止并在几分钟后超时。我的配置文件如下:

hbase-site.xml ->

<configuration>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value><IP>:2181</value>
    <description>The host and port that the HBase master runs at.
    </description>
  </property>
</configuration>

datanucleus.properties ->

javax.jdo.PersistenceManagerFactoryClass=org.datanucleus.api.jdo.JDOPersistenceManagerFactory
javax.jdo.option.ConnectionURL=hbase:
datanucleus.autoCreateSchema=true
datanucleus.autoCreateTables=true
datanucleus.autoCreateColumns=true
datanucleus.cache.level2.type=none

我在这里做错了什么。以及客户端机器应该可以访问的所有端口(因为在生产中我们只打开需要的端口)。

谢谢

【问题讨论】:

  • DataNucleus 只是获得“new HTable(config, tblName)”所以看不出它是如何具体的。低级 HBase 直接调用将是相同的

标签: jdo hbase datanucleus


【解决方案1】:

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 配置:-)

【讨论】:

    【解决方案2】:

    人们有时不会想到的一件令人惊讶的事情:通常大部分集群都隐藏在交换机后面。如果您的所有机器 IP 地址都是 198...*,则通常会出现这种情况。如果您尝试访问集群的机器不在同一个网络中,您将无法使用 hbase。这是因为您的 hbase 连接直接从客户端到托管数据的节点。它们不会通过您习惯登录的双宿主节点。

    我不知道有什么好的解决方法,除了将您的应用程序放在可以看到世界其他地方的双宿主节点上。或者在该节点上设置某种网关。这对于像 JDO 这样的库来说可能是个问题

    【讨论】:

    • 我觉得你说的很有道理。让我更详细地介绍一下我的部署(这是我第一次使用 Hbase,与其他数据库不同的是,一个人必须在同一个网络上才能访问它似乎很奇怪 :))我已经将 hadoop 部署在两台机器上(以分布式模式)两个不同的地理位置,因此不同的网络。让我们称它们为机器 A 和机器 B(hadoop 似乎工作正常)。现在我在机器 A 上运行 Hbase master。如果我的 webapp 在机器 A 上但不是从机器 B 上,我显然能够连接到它你是在说这种情况吗???
    • 不,如果您已经知道可以在机器之间进行通信,那么这不是问题。
    【解决方案3】:

    注意,我没有使用 DataNucleus。但是,当我们将 Master 与客户端分开时,我们不得不调整配置​​。

    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.zookeeper.quorum", SERVER);
    conf.set("hbase.zookeeper.property.clientPort", PORT);
    

    您可以查看您的 HBase web shell(通常是:主机箱上的 localhost:60010)并获取 ZK 转储。检查您是否正在与 ZK 建立连接。

    【讨论】:

    • 我认为注意端口与服务器的分离总是明智的。您的设置可能正在尝试转到 :2181:2181。但我只是推测。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2016-06-29
    相关资源
    最近更新 更多