Katta – Lucene & more in the cloud.

About
katta是一个可扩展的,高容错性的,可实时访问的数据存储方案。它将那些海量的重复的索引封装成诺

干个切片,这可以很好的服务于高吞吐量和大数据集的应用。这些索引可以只不同的种类,目前主要是适

用于lucene和hadoop的映射文件。

How katta works

intro
katta是一个运行在许多商业服务器上的分布式应用,类似于Hadoop MapReduce, Hadoop DFS, HBase,

Bigtable 或者 Hypertable.

主服务器管理节点和索引切片任务。其实节点也就是用来索引切片的。一个客户端通过联系所有的节点在

这个索引中进行搜索,然后将来自所有节点的结果合并到一个统一的结果列表中。索引和切片的种类是可

以不同的,这主要取决于这个节点服务的内容。

Content Server
每一个节点主机也就是一个内容服务机。内容服务器决定 katta 簇可以迟滞哪些种类的切片索引。在

katta中可以执行多种不同的内容服务器。目前有lucene的索引文件和hadoop的map文件,当然你也可以执

行你自己的种类。

Data Structure
一个katta的索引就是一个文件夹,这个文件下有很多子文件夹。这些子文件夹被称为索引切片。他们可

以是lucene的索引也可以是hadoop的映射文件(也可以是自己的文件格式)。可以简单地用lucene 的

index writer 创建lucene索引切片。在这种情况下,创建一个katta索引,只不过是将若干个lucene索引

一起放到一个文件夹下,单个服务器或者是其他一些简单操作就可以满足你的需求了。这就允许你用一种

最适合你应用需求的方式去构建你自己的索引,比如说让内容相关的文档在一个切片中。

Master -Node communication
主机与从机节点的通讯在分布式系统中是至关重要的,因为主机需要尽可能快地知道失败节点。一般情况

下,这种通讯是通过节点的“心跳信息.”。Katta用了一种不同的方式。分布式配置和锁系统Zookepper

是yahoo的研究项目,用于主机和节点的通讯。Zoopkeeper允许你去读/写一种分布的虚拟文件系统——虽

然它不是一个真实的文件系统。节点通过在启动的时候将一个短期文件写入 “/nodes/live” 文件夹,

来公布他们自己信息。主机会去订阅这个文件夹,从而得知这个文件夹中的任何变化。在某个节点失败的

情况下,zoopker会移走该短暂文件,然后会去通知主机。一个类似的过程也被用做去处理主机的故障转

移,虽然这儿只有活动主机写一个“/master”文件夹,备份主机去订阅这个文件夹。除了这些操作中安

排的主机和节点的工作,还有一些其他的工作。比如主机操作( MasterOperations ),像是索引部署/

非部署操作就属于这一类;还有节点操作( NodeOperations ),如切片部署/非部署操作。这些操作都

以阻塞队列的形式存储在zoopkeeper中。每一个组件(主机,节点)都有它他自己的队列,顺序的处理过

来的操作。

以下流程描述了一个索引是如何在katta中部署的,同时也可以作为其他流程的一个好例子。

l   一个部署客服端创建一个索引部署操作,然后把这个操作加入到主机的队列。

l 主机拿到这个操作,生成切片任务计划,然后将一系列的切片部署操作发给诺干个节点。

l 节点拿到这个操作,然后试图去发布包含的切片(比如从hdfs中copyf f.e,加到到内容服务的lucene

f.e. 中),然后成功把它们发布到zookeeper的 “/shard-to-nodes”  文件夹下。

l 主机被告知所有节点已经完成操作(或是有若干个失败了)然后将做了相同改动的索引新发布到

zookeeper以及带“/indices/indexX” 目录的f.e。

l 一个搜索客户端可以看见 “/indices 目录,它可以被自动的通知是索引是否有变动,然后客户端会去

探测 “/shard-to-nodes”  目录以便确定哪些节点上有跑着新的索引切片。

Client Node Communication
一个搜索请求的时候客户端会同所有节点通讯。对于客户端和节点的通讯,我们决定采用hadoop的远程过

程调用因为这个是非常快,也是非常容易用java实现的同步通讯机制(mina仅仅是在异步通讯的时候快一

些)。每一个到客户端的搜索请求,我们都会发送一个请求到所有的含对应索引切片的节点上(细节请看

INodeSelectionPolicy )

据我们所知,所有的请求都是多线程的,hadoop的rpc链接也一直是打开的。

Load Shards to Nodes
因为性能在搜索过程中是至关重要的,所以katta会首先将切片copy到节点的本地硬盘上。

Hadoop文件系统中的所有uri都可以作为源。比如从一个共享的本地或者其他网络存储设备上部署一个索

引。当然一个最常见的情况就是, 用“hdfs:”  在hadoop分布式系统上部署一个索引。当然 Amazon’s

S3(Amazon Simple Storage Service ) 也是被支持的,关于这一点可以参考hadoop的文件系统文档。

Katta的切片复制,并不是在Hadoop DFS 中对原有hadoop索引安全机制的一个替代方案。

为了部署索引时不降低搜索的性能,katta特别为切片部署提供了一种调节机制(throttling mechanism

)。

Distributed Scoring For Lucene Implementation

Katta支持lucene的分布得分。这是因为我们并不期望term的分布在所有切片节点上并不是完全平衡分布

的。

Katta中的每个搜索查询最终都必须要分2个步骤:首先我们会从所有节点获得查询文档的总数;第2步将

这个值和查询条件送到所有节点。请注意,我们也有一个简单计数器用于计算匹配这个查询条件的文档数

,这部分是在第一个步骤中进行的。

   Integration
      Katta提供了一个javaAPI去管理系统,这个api可以被整合到你的管理和监控系统中去。

l IDeployClient.java for deploying and un-deploying of indices.:部署个取消部署索引

l ILuceneClient.java for querying lucene indices (uses Client.java).:搜索lucene索引

l IMapFileClient.java.java for querying hadoop mapfiles  (Client.java).:搜索hadoop的映射文

这些I×Client可以用于连接你的web站点或者搜索结果应用。

最后,katta提供了一个命令行工具( Katta.java )去管理系统级别的功能,比如部署和取消部署索引

等等

Advertisements
This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s