hbase shell实现原理简析

简介: hbase的交互式命令行是通过jruby实现的,当我们输入hbase shell时,实际上最终执行的是org.jruby.Main,并以bin/hirb.rb作为参数,注意是根目录下bin目录中的hirb.

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参数即可;

修改示例

以deleteall命令为例,先查看下它的帮助, 执行help 'deleteall',会打印如下说明信息:

Delete all cells in a given row; pass a table name, row, and optionally
a column and timestamp. Deleteall also support deleting a row range using a
row key prefix. Examples:

  hbase> deleteall 'ns1:t1', 'r1'
  hbase> deleteall 't1', 'r1'
  hbase> deleteall 't1', 'r1', 'c1'
  hbase> deleteall 't1', 'r1', 'c1', ts1
  hbase> deleteall 't1', 'r1', 'c1', ts1, {VISIBILITY=>'PRIVATE|SECRET'}

可以看到,如果想删除某一行中所有小于指定时间戳的数据,是不支持的,这是因为参数是按照位置读取的,如果把时间戳放到行键后面,会被当做列信息从而报错,但通过api是可以的,这里我们通过用空字符串占位的方式去解决,即用如下命令:

deleteall 't1', 'r1', '', ts1

要支持这个命令,只需要在使用列信息的地方加上空字符串判断就行了,根据前述命令执行流程的说明,可以知道deleteall命令的代码是在deleteall.rb中,并且最终是在table.rb的_createdelete_internal方法中使用到列信息进行Delete对象的创建,代码如下:

if column && all_version
  family, qualifier = parse_column_name(column)
  d.addColumns(family, qualifier, timestamp)
elsif column && !all_version
  family, qualifier = parse_column_name(column)
  d.addColumn(family, qualifier, timestamp)
end

因此只需要给这部分外层加上判断即可,修改如下:

if column != ""
  if column && all_version
    family, qualifier = parse_column_name(column)
    d.addColumns(family, qualifier, timestamp)
  elsif column && !all_version
    family, qualifier = parse_column_name(column)
    d.addColumn(family, qualifier, timestamp)
  end
end

有兴趣的话可以本地修改下试试效果,加深对hbase命令行实现原理的理解,另外这个小优化也已经提交给社区:HBASE-24335

相关实践学习
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
Linux Shell 开发工具
Shell的运行原理以及Linux当中的权限问题
Shell的运行原理以及Linux当中的权限问题
55 0
|
2月前
|
Shell Linux 程序员
【Linux】浅谈shell命令以及运行原理
【Linux】浅谈shell命令以及运行原理
120 0
|
7月前
|
Linux Shell 程序员
【Linux】shell运行原理及权限
前几期文章重点讲解了Linux的一些基本指令,让大家能够快速的上手使用Linux,也不知道大家运用的熟练不,今天我们深入学习下Linux的shell命令以及运行原理和Linux下的权限方面的一些知识。
|
2月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
114 0
|
2月前
|
Shell Linux 程序员
【Linux】Shell 命令以及运行原理
【Linux】Shell 命令以及运行原理
|
2月前
|
分布式计算 Hadoop Shell
|
2月前
|
分布式计算 安全 Hadoop
HBase Shell-org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet 已解决
在HBase Shell遇到错误时,检查Hadoop非安全模式:`hdfs dfsadmin -safemode get`。问题解决在于`hbase-site.xml`中添加配置:Zookeeper客户端端口设为2181和预写日志提供者设为filesystem。
|
2月前
|
Linux Shell 程序员
【Linux】权限(shell运行原理、概念,Linux权限)
【Linux】权限(shell运行原理、概念,Linux权限)
30 2
|
2月前
|
Shell Linux 程序员
【Linux】shell命令以及运行原理
【Linux】shell命令以及运行原理
【Linux】shell命令以及运行原理
|
8月前
|
Shell
强大好用的shell:shell的工作原理是什么
Shell的工作原理可以简要概括为以下几个步骤: 1.命令行输入:用户在命令行界面输入命令。 2.命令解析:Shell接收用户的输入,并对命令进行解析。这个过程包括解析命令名、参数、选项等,将其转换成计算机可以理解的形式。 3.命令执行:解析完成后,Shell会执行相应的命令。这通常涉及到调用系统调用或者启动新的进程来执行命令。 4.结果输出:命令执行完成后,Shell将结果输出到命令行界面,供用户查看。