【问题标题】:HBase Thrift: how to connect to remote HBase master/cluster?HBase Thrift:如何连接到远程 HBase 主/集群?
【发布时间】:2012-06-10 18:54:20
【问题描述】:

感谢 Cloudera 发行版,我有一个 HBase master/datanode + Thrift 服务器在本地机器上运行,并且可以编写和测试 HBase 客户端程序并使用它,没问题。

但是,我现在需要在生产中使用 Thrift,并且我无法找到有关如何让 Thrift 与生产 HBase 集群一起运行的文档。

据我了解,我需要在 客户端节点 上运行 hbase-thrift 程序,因为 Thrift 程序只是 HBase 的另一个中间客户端。

所以我猜我必须能够以某种方式将主节点主机名/IP 指定给 HBase-Thrift?我该怎么做?

另外,关于如何在生产中扩大规模有什么建议吗?我只需要这样的设置吗:

Client <-> Thrift client <-> HBase Master <-> Multiple HBase workers

【问题讨论】:

    标签: hbase thrift cloudera


    【解决方案1】:

    让它运行

    您不必在本地计算机上运行 Thrift 服务器,它可以在任何地方运行,但 RegionServers 通常是一个好地方*。然后在代码中连接到该服务器。

    一个 Python 示例:

    transport = TSocket.TSocket("random-regionserver", 9090)
    

    您显然会将random-regionserver 替换为您正在运行 Thrift 服务器的服务器之一。

    该服务器从通常的位置获取其配置。如果您使用 CDH,那么您会在 /etc/hbase/conf/hbase-site.xml 中找到配置,并且您需要添加属性 hbase.zookeeper.quorum

    <property>
      <name>hbase.zookeeper.quorum</name>
      <value>list of your zookeeper servers</value>
    </property>
    

    当您从下载的 Apache 发行版启动 Thrift 服务器时,这与此类似,只是 hbase-site.xml 可能位于不同的目录中。

    扩大规模

    现在扩展的一种简单方法是在 Thrift 客户端中保留所有 Regionserver 的列表,并在连接时随机选择一个。或者您创建多个连接并每次使用一个随机连接。某些语言绑定(即 PHP)有一个 TSocketPool,您可以在其中传递所有服务器。否则,您需要做一些手动工作。

    使用这种技术,所有读取和写入都应该或多或少地分布在集群中的 Thrift 服务器上。到达 Thrift 服务器的每个读取或写入操作会被转换为来自 Thrift 服务器的基于 Java 的 API 调用,然后打开与适当 Regionserver(s) 的网络连接以执行请求的操作。

    这意味着您不会获得与使用 Java API 时一样好的性能。如果您自己缓存区域位置并点击适当的 Thrift 服务器,它可能会有所帮助,但即便如此,即使它最终在本地服务器上,也会进行额外的 Java API 调用。 HBASE-4460 将有助于解决这种情况,但这包含在 CDH3u4 或 CDH4 中。

    * 有一个问题 HBASE-4460 实际上在 Regionserver 中嵌入了 Thrift 服务器。

    【讨论】:

    • 谢谢!我会试试这个。关于扩展部分:所以如果我直接随机连接到不同的区域服务器并将我的写入分散到不同的区域服务器,当我从它们读取时,我能保证得到一致的结果吗? (我的 HBase 应用程序是写密集型的,尽管我也经常需要读取。)
    • 这是一个很好的问题。不,您不会使用随机分配获得最佳性能。我敦促您阅读有关某些问题的HBASE-4460 问题。对于读取(和写入),如果您缓存区域位置并直接连接到该区域服务器,它可能会有所帮助。也就是说:目前,即使您写入 Regionserver 上的 Thrift 服务器,您的数据最终会在其中结束,Thrift 服务器仍然会发出网络请求,即使它以 localhost 结束。恐怕这就是当前的情况(再次参见 HBASE-4460)。
    • 我已经编辑了答案以合并我之前的评论。我希望这能让它更清楚并有所帮助。
    • 只是跟进:我得到了这个工作!并且能够扩展 HBase 中的写入。 :) 让集群运行、区域服务器上的 Thrift、安全规则等并不是直接的 - 但是让它以这种方式运行就可以了! :) 谢谢!
    • 抱歉,一个小的后续问题:如果我在区域服务器之间随机分配写入,区域服务器如何相互同步 - 他们甚至需要吗?完成随机传播写作后如何进行查询?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多