4

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

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

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

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

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

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

1 回答 1

7

让它运行

您不必在本地计算机上运行 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 的网络连接以执行请求的操作。

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

* 存在HBASE-4460问题,它实际上在 Regionserver 中嵌入了 Thrift 服务器。

于 2012-06-06T19:11:15.307 回答