由于Cloudera发行版,我在本地计算机上运行了HBase master / datanode + Thrift服务器,可以编写和测试HBase客户端程序并使用它,没问题。
但是,我现在需要在生产中使用Thrift,而且我无法找到有关如何使用生产HBase集群运行Thrift的文档。
根据我的理解,我需要在客户端节点上运行hbase-thrift程序,因为Thrift程序只是HBase的另一个中间客户端。
所以我猜我必须能够以某种方式将主节点主机名/ IP指定为HBase-Thrift?我该怎么做?
此外,有关如何在生产中扩大规模的任何建议?我只需要这样的设置:
Client <-> Thrift client <-> HBase Master <-> Multiple HBase workers
答案 0 :(得分:7)
您不必在本地计算机上运行Thrift服务器,它可以在任何地方运行,但RegionServers通常是一个好地方*。然后在代码中连接到该服务器。
Python示例:
transport = TSocket.TSocket("random-regionserver", 9090)
你明显用你正在运行Thrift服务器的服务器替换random-regionserver
。
该服务器从通常的位置获取其配置。如果您正在使用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客户端中所有Regionservers的列表,并在connect上随机选择一个。或者您创建多个连接并每次使用随机连接。某些语言绑定(即PHP)具有TSocketPool
,您可以在其中传入所有服务器。否则,您需要做一些手动工作。
使用此技术,所有读取和写入都应该或多或少地分布在群集中的Thrift服务器上。到达Thrift服务器的每个读取或写入操作将仍然转换为来自Thrift服务器的基于Java的API调用,然后该服务器打开到正确的Regionserver的网络连接以执行所请求的操作。
这意味着您将无法获得与使用Java API时相同的性能。如果您自己缓存区域位置并访问相应的Thrift服务器,可能有帮助,但即使这样,即使它最终在本地服务器上,也会进行额外的Java API调用。 HBASE-4460会对此方案有所帮助,但不包含在CDH3u4或CDH4中。
*有一个问题HBASE-4460实际上是在Regionserver中嵌入Thrift服务器。