分享

利用hbase的coprocessor机制来在hbase上增加sql解析引擎–(二)具体实现

 CevenCheng 2013-06-08

January 13, 2013

利用hbase的coprocessor机制来在hbase上增加sql解析引擎–(二)具体实现

Filed under: 存储 — admin @ 4:23 pm

实现上,需要实现的几个大的功能有:1.提供基于hbase的jdbc接口;2.sql解析引擎(使用druid);3.schema转换,sql感知的schema转换成底层hbase中世纪表的schema

1.基于hbase的jdbc实现,这个不用多说,把jdk里的jdbc相关接口按照hbase方式进行实现即可,由于这里面的接口方法奇多,所以只实现自己能用到的方法,用不到的写个空实现即可。
2.sql解析引擎,从druid中抽取出来的代码封装而成(之所以要抽取出来,是因为这部分代码需要部署在hbase的region server上,因此要尽量精简,不要有过多无用的依赖)
3.schema转换,schema中会存放该表的各个字段的名称和类型,我们会利用类型信息,来将hbase里的byte数组转换成对应的java类型。

在程序组织上,实际上分成了4个模块:

interface模块包含一些公共的基础bean,主要是用来表征一行记录的类(Record),sql-client和sql-server都会依赖它。sql-client和sql-server是2个不同的模块,前者部署在客户端,其封装了对jdbc的实现,同时将用户的sql进行必要的检查,并且转换成对hbase友好的sql。sql-server部署在hbase 的region server上,其主要职责是从传递过来的sql中取出rowkey的区间,根据这个区间来生成scan,通过scan获得返回的result,将这些result转换成record,然后再根据sql语句中的过滤条件,对这些record进行过滤,符合条件的record,会转换成MapWritable,后者能够进行序列化,返回给客户端,客户端再进行反序列化,就能够拿到结果。同时,在sql-client和sql-server之间,传递的String类型的sql语句,也就是客户端和服务端会对sql进行2次parse,这样做的原因是因为使用string进行传递的话,不需要考虑序列化,反序列化的事情,方便一些,缺点就是解析2次,耗cpu,但是这个目前来说问题不大。

流程图:


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多