kudu的读取数据流程

当客户端从Kudu的表中读取数据时,必须首先建立需要连接的系列tablet服务器。

通过执行tablet发现过程(如上所述)来确定包含要读取的主关键字范围的tablet的位置(读取不必在领导者tablet上发生,除非用户明确选择该选项)。tablet随后使用扫描程序基于行集合(RowSets)和相关撤销(UNDO)或重做(REDO)增量记录生成最终行。首先,tablet必须确定包含基本记录的行集合(RowSet)。然后扫描MemRowSet以及一个或多个DiskRowSets。最后,tablet将遍历所选的行集合(RowSet),匹配该扫描的谓词并生成最终记录。

在MemRowSet中,扫描程序将实现每一行的完整投影并应用任何增量记录。由于所有操作都发生在内存中因此可以非常快速地完成。对于每一个DiskRowSet而言,扫描程序将每次实现一列,并且在转到下一列前应用对当前列任何增量记录和谓词。 只有与扫描的谓词匹配的列才可以从磁盘读取,这使得磁盘I / O非常高效,也赋予了Kudu快速的分析性能。Kudu将优先扫描已定义谓词的列。如果谓词不满足的话,Kudu可以完全避免扫描其他列,从而避免不必要的I / O。

综上所述:

kudu在读取数据的时候

1、客户端连接TMaster获取表的相关信息,包括分区信息,表中所有tablet的信息

2、客户端找到需要读取的数据的tablet所在的TServer,Kudu接受读请求,并记录timestamp信息,如果没有显式指定,那么表示使用当前时间

3、从内存中读取数据,也就是MemRowSet和DeltaRowSet中读取数据,根据timestamp来找到对应的mutation链表

4、从磁盘中读取数据,从metadata文件中使用boom filter快速模糊的判断所有候选RowSet是否含有此key。然后从DiskRowSet中读取数据,实际是根据B+树,判断key在那些DiskRowSet的range范围内,然后从metadata文件中,获取index来判断rowId在Data中的偏移,或者是利用validex来判断数据的偏移(只有一个key),根据读操作中包含的timestamp信息判断是否需要将base data进行回滚操作从而获取数据

 

 

posted @ 2018-01-05 22:26  niutao  阅读(1555)  评论(0编辑  收藏  举报