【兔年创意投稿】兔兔的奇妙旅程(十)好奇兔兔&&对HBase的探索

2,409 阅读7分钟

我正在参加「兔了个兔」创意投稿大赛,详情请看:「兔了个兔」创意投稿大赛

笔者注:大年初一和初二,没什么事干,就点开Hbase文档抱着玩一玩的心态学习一下,这也是我首次接触HBase,有写得不对的地方大家多担待哈~恳请指正,后续勘误。

书接上回。

对突突和达达来说,它们一入门就从Go语言及相关项目学起。但实际上,要想做好项目,需要多方面的综合知识。

这天,它们在查看hertz和kitex的示例代码时发现了HBase这个数据库。它们找来湘湘,但湘湘对HBase的了解也不多,仅停留在概念层面。知道这是个非关系型数据库,数据的组织形式是key-value,在大数据应用场景中比较常用。于是它们找来了官方文档,开始了学习之路。

官方文档说明链接:hbase.apache.org/book.html#q…

HBase安装

下载源

有了上次的经验,它们知道最好能找到国内的镜像源来下载。

于是它们选择了阿里云的镜像并输入以下下载命令:

wget https://mirrors.aliyun.com/apache/hbase/3.0.0-alpha-3/hbase-3.0.0-alpha-3-bin.tar.gz

解压安装

  • tar -zxvf hbase-3.0.0-alpha-3-bin.tar.gz 解压到当前目录
  • cd hbase-3.0.0-alpha-3-bin以便完成后续操作

Java语言环境(可跳过)

(以下部分属于Java入门,与主题关系不大,可跳过)

湘湘告诉达达和突突,HBase是基于Java虚拟机运行的,支持的也是java语言。接着,它为两只兔子简单演示了一下如何在命令行下编写、编译java文件。

编译Java代码,需要提前安装Java的JDK,要是想在各处都能编译Java文件,更是要配置环境变量。

  • 编译: javac Main.java
  • 运行: java Main.class

设置JAVA_HOME

这里有个小插曲。

这台主机上的jdk并不是湘湘安装的,而是在交付时已自动配好的(阿里云轻量云服务器yyds),所以当湘湘浅试了一下java -version,发现能提示版本信息后,知道已经配了环境变量了,并没有留意JAVA_HOME是否设置好。

笔者注:事实证明,不配置JAVA_HOME并不会影响简单java程序的运行。

但是,参考手册中提到了要配置JAVA_HOME,还提出可以用whereis java来找到java的路径。

突突和达达按照要求,将输入命令打印出的结果添加到HBase所在目录下的 conf/hbase-env.sh 中的export JAVA_HOME =一行中,但是发现并不起作用,运行bin/start-hbase.sh时显示没有这个文件或目录。

  • 湘湘提出echo $JAVA_HOME看看结果,但发现没能打印出之前输入的路径,于是它觉得应该是漏了使脚本生效的步骤: source conf/hbase-env.sh
  • 之后echo确实能显示路径了,但是想启动hbase还是不行。
  • 湘湘想到应该是填入的路径本身错了。果然,它查看了官方文档上的示例格式:
export JAVA_HOME=/usr/jdk64/jdk1.8.0_112

再对比小分队之前输进去的/usr/bin/java,很明显两者指的不是一个东西。JAVA_HOME要的是jdk 源文件 的所在位置,最后一定是以jdk的版本名称结尾的(如无重命名的话)。

于是它进入/usr目录,并且逐级寻找,终于顺藤摸瓜找到了jdk的真正位置。

启动HBase

bin/start-hbase.sh

再输入jps查看java虚拟机中运行的进程,可以看到

image.png

已有HMaster了。

对HBase的探索

几只兔子通过cd bin &&ls看到了有很多脚本,包括启动集群、关闭集群等,有一些暂时看不懂有什么用处,这些之后用到再议。

image.png

关于脚本(可跳过)

好奇的突突还用vim直接打开了其中的一些文件来看,这使它初步解锁了写脚本的技能。

它目前对脚本(script)的理解是:它并不神秘,只是在执行事先设定好的一些规则。

  • 比如之前是由人一行一行地在终端敲命令,而写脚本就是将要敲的命令全写在一个文件中,执行这个文件就相当于之后按顺序执行文件中的命令,而不用自己手动再敲。
  • 又由于命令的执行也需要区分情况,所以会有一些条件判断等等的语句。
  • 之前的命令是在shell中写的,因此可以认为这些命令是一种语言(shell语言),而Python也可以用来写脚本,只需要在文件开头注明解释器路径,让系统能识别就好了。

连接到HBase

  • 他们试着运行./hbase。但弹出了操作提示: image.png 后接详细的options和command介绍。
  • 它们照着提示输入了./hbase shell,成功进入了hbase的shell。

交互式?

在连续敲下几个回车之后,它们发现两个冒号之间的序号在递增,这让它们觉得hbase是交互式的,并且可以记住之前的每一步操作。但是这个0是什么意思呢?为什么没有变呢?它们相信后续的实践经验会告诉它们答案。 image.png

help

熟悉一个新工具时,最必不可少的就是借助帮助说明了。 从输入help后获取的结果中,它们获知了如下信息:

  • 所有命令被分为多个类别,每个类别有不同用途,之后找的时候很方便。
  • 示例用法

关于表的结构

在初步掌握了文档中提到的create list describe put scan enable disable drop 这几条命名后,突突和达达又开始了新的探索。

突突通过实战检验证明,hbase是按列存储的,且存储的是key-value对。

因为当它在如下示例数据的基础上 image.png

put 'test','row2','cf:d','value4'时,并没有导致原有的row1被覆盖,而是新起了一行,这说明存储的关键不在行。

而当它尝试 put 'test','row1','cf:a','value4',键a对应的值就被替换成了value4。

向密林深处前进

随着更深入的探索,一行几兔发现了更多情况。

  • shell以外的使用场景

首先,这个hbase shell容错度很低,稍微输错了命令,就会被强制退出来,回到本来的文件目录,这让它们觉得直接在上面输命令并不是稳妥的方法,看来通过其他方式连接上去,将想要存储的内容预先在文件中写好再让它识别,是一种更为稳妥的方式。(类比使用MySQL时,交互式地敲命令容易出错,可以导入确认无误的SQL文件,或者通过别的手段将代码的对象转为表结构;增删查改时一般也不直接在MYSQL的命令行中改)。HBase提供了丰富的api接口。

  • 多种集群模式

此外,虽然文档中的quickstart让它们接触了单节点模式(表现为jps只看到一个HMaster结点),但从文档后面的描述中可以看到还有伪分布式和分布式模式,看来HBase的威力在后面两种。 伪分布式适用于资源不够的情况,节点(主机)确实只有一台,就只能模拟出多台来用(或者说本地拿来测试);而分布式下,多台主机强强联手,符合大数据的应用场景和需求。

  • 背后的生态

HBase依托Hadoop。quickstart中提到,如果不进行配置,数据会默认存在/tmp/下,如果配置了HDFS,文件就会存在其中。

  • 看到这个/tmp/后,几只兔子出于好奇,点进去看了看。当它们tree出/tmp/hbase的目录时,不禁惊呆了。虽然它们暂时还看不懂,但是大受震撼,纷纷感叹这真是一个精巧的设计。上一次这么震撼还是tree .git的时候。 (图是局部结构) image.png

文档的后续讲了很多关于配置和api接口的详情,几只兔子感觉暂时还用不上,就没再看。