欢迎投稿

今日深度:

hbase shell实现原理简析,

hbase shell实现原理简析,


hbase的交互式命令行是通过jruby实现的,当我们输入hbase shell时,实际上最终执行的是org.jruby.Main,并以bin/hirb.rb作为参数,注意是根目录下bin目录中的hirb.rb,而不是hbase-shell中的irb/hirb.rb;
这个类来自jruby的包,作用是把ruby编写的代码转换成java字节码,进而能够运行在JVM中;

实现逻辑大体可分为2个阶段:初始化阶段和命令执行阶段,前者是启动shell时的执行逻辑,后者是输入命令后的执行逻辑,以下分别简述其流程;

初始化阶段

1、创建HBaseConfiguration实例,并将启动时带的键值对参数设置进去;
2、创建Hbase实例,初始化connection,代码在hbase.rb中;
3、创建Shell实例,此时会执行一些load_command_group方法,这些方法实际上是初始化了commands和command_groups这2个map变量,commands中存放了各个命令的name与class的映射关系,代码在shell.rb中;
4、接下来执行Shell实例的export_commands方法,通过instance_eval为commands中的所有命令动态添加一个方法到Shell实例中;

命令执行阶段(以list命令为例)

1、执行前述动态生成的list方法;
2、执行Shell实例的command方法,参数为list;
3、执行internal_command,该方法内部先调用command_instance按一定规则创建该命令对应class的实例:List,所有命令的class都会继承Command类;
4、执行List的command_safe方法,这个方法在Command类中,该方法内部通过调用send(cmd, *args)来执行List的command方法,List类定义在list.rb中,Command类定义在commands.rb中;
5、List的command方法先后调用了Command、Shell、Hbase等类中的admin方法,最后得到一个Admin实例,该类定义在admin.rb中;
6、执行Admin实例的list方法,该方法内部实际上执行了HBaseAdmin的listTableNames来得到结果;

调试

如果希望在本地环节启动hbase shell,可参考如下配置;

//Main class    
org.jruby.Main
//VM Options    
-Dhbase.ruby.sources=E:\github\hbase\hbase-shell\src\main\ruby
//Program argument    
E:\github\hbase\bin\hirb.rb
//Use classpath of module    
hbase-shell

默认情况下连的是localhost的hbase,如果希望连远程集群,可以修改hbase-shell模块中hbase.rb的configuration,指定hbase.zookeeper.quorum参数即可;

www.htsjk.Com true http://www.htsjk.com/hbase/42992.html NewsArticle hbase shell实现原理简析, hbase的交互式命令行是通过jruby实现的,当我们输入hbase shell时,实际上最终执行的是org.jruby.Main,并以bin/hirb.rb作为参数,注意是根目录下bin目录中的hirb.rb,而...
评论暂时关闭