如果这个问题是基本的,我很抱歉(我是nosql的新手)。基本上我有一个很大的数学过程,我正在拆分并有不同的服务器进程并将结果发送到hbase数据库。计算数据的每个服务器都是一个hbase区域服务器,并且有节俭。
我在考虑每个服务器处理数据,然后在本地更新hbase(通过thrift)。我不确定这是否是最佳方法,因为我不完全了解主(命名)节点将如何处理上传/拆分。
我想知道在上传大量数据时最佳做法是什么(总的来说我怀疑它会是几百万行)?可以将它发送到区域服务器,还是应该通过主服务器?
答案 0 :(得分:2)
来自this博文,
一般流程是新客户端联系Zookeeper仲裁(a 单独的Zookeeper节点集群)首先找到一个特定的行 键。它通过检索服务器名称(即主机名)来实现 从Zookeeper托管-ROOT-区域。有了这些信息,它可以 查询该服务器以获取承载.META的服务器。表。都 这两个细节都被缓存,只查找一次。最后它可以 查询.META。服务器并检索具有该行的服务器 客户正在寻找。
一旦被告知行所在的位置,即在哪个区域,它 缓存此信息并与HRegionServer主机联系 该地区直接。所以随着时间的推移客户端非常完整 从哪里获取行而不需要查询.META的图片。 再次服务器。
我假设您直接使用thrift接口。在这种情况下,即使您从特定区域服务器调用任何变异,该区域服务器也仅充当客户端。它将联系Zookeeper仲裁,然后联系Master以获取写入数据的区域,并以与从其他regionserver写入的方式相同的方式继续。
可以将它发送到区域服务器,还是应该通过主服务器?
两者都是一样的。没有直接写入regionserver的事情。必须联系Master才能确定将输出写入哪个区域。
如果您正在使用hadoop map-reduce作业,并使用Java API进行mapreduce作业,那么您可以使用TableOutputFormat
直接写入HFile而无需通过HBase API。它比使用API快约10倍。