hbase搭建和实践部分笔记3Word文件下载.docx
《hbase搭建和实践部分笔记3Word文件下载.docx》由会员分享,可在线阅读,更多相关《hbase搭建和实践部分笔记3Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。
![hbase搭建和实践部分笔记3Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/29/6f57b53f-f22a-4106-a2b5-852a10829ada/6f57b53f-f22a-4106-a2b5-852a10829ada1.gif)
图5:
第二个就是这个master:
9000这个是什么意思?
我们就把hdfs:
//master:
9000这一段访问一下
图6:
(如下图7所示)
hadoopfs-lshdfs:
9000/
图7:
相当于我访问的这个目录其实就是一个根目录对吧?
然后它其实在这个根目录下面帮你创建了一个hbase文件夹,就是说这个目录不需要你自己去创建,你在这个配置文件里面配置好之后,然后你重启下hbase它会自动帮你创建好hbase文件夹,那在这个hbase文件目录里面会存哪些信息呢?
就是存你写入的那些hfile,它里面会存你的hfile以及你的用户表的结构,那我们咋天说过了我们用户表是按照列存储的hbase,那列存储它会分出一个或者多个ColumnFamily对不对?
那到时候我们再实践的过程中你会发现如果我们设置一个表里面包含多个ColumnFamily的话你会发现在这个hbase目录下面在相应的位置你会找到一个ColumnFamily会对应着一个目录,这个到时候我们后面的实践会演示,所以这hbase里面存的就是数据,存的版本以及存WAL预写日志,主要那么多信息,当然还有其他的。
第三个配置是什么意思呢?
这个配置要么是true要么是false,如果把这个配置就是cluster.distributed就是集群分布的模式,这个是否分布式如果是true的话相当于你现在搭建的hbase是一个完全分布式的一个状态,如果你把这个true改成false的话相当于你搭建了一个单机版的hbase,因为现在我们要模拟一个真实的环境,所以我们要把这个配置设置成true是这么一个意思。
(如下图8所示)
图8:
好了接下来看第四个配置就是要写你的zookeeper的一些信息,要配一些你zookeeper集群一些地址列表,那我们之前配了三台机器zookeeper对吧?
然后这三台机器的hostname就是master,slave1,slave2。
(如下图9所示)
图9:
接下来看第五个配置就是我们看这个目录的名字其实就跟你的zookeeper相关,其实这个路径要存储的是一些zookeeper的快照的一些数据信息,会存到这个目录里面来(如下图10所示)
图10:
这是一个文件,那我们继续回到PPt里面(如下图11所示)
图11:
我们已经看了hbase-site.xml这个文件,我们再来看一下当前目录下还有哪些文件?
还有一个就是hbase-env.sh,就是这个环境变量的一些信息,看看需要配置哪些变量(如下图12所示)
vimhbase-env.sh(将下面两句放入里面去)
填充:
exportJAVA_HOME=/usr/local/src/jdk1.6.0_45
exportCLASSPATH=.:
$CLASSPATH:
$JAVA_HOME/lib
图12:
因为我们的javahome是在usr/local/src这个路径,而你们存放在什么路径就写上什么路径,那它用的java版本是1.6.0_45(如下图13所示)
图13:
然后有一个注意的地方就是这个(如下图14所示)它默认是被注释了,找到这行去掉注释即可
图14:
HBASE_MANAGES_ZK从这个配置上看也是一个布尔型,要么就是true要么就是false,那它代表什么含义呢?
如果是true的话它就会使用hbase自带的zookeeper明白了把?
就zookeeper它这个工具包里面它有自己的一个zookeeper,如果是false的话,它会去用你单独要搭建一个zookeeper明白这意思把?
所以我们现在把它写成true。
好了相当于我们已经完成了两个文件的改写,那么第三个文件也是在conf下面有一个叫regionservers文件,这个文件打开(如下图15和图16所示)
vimregionservers
图15:
图16:
里面就配一些你的hostname,那从你的这个文件名顾名思义能够看到里面配的所有的节点都是当作regionserver,那这个时候有人会有疑问,为什么master配置进来了?
你master不是主吗?
你regionserver不也是从吗?
如果把主配到从里面是不是有点不太思议,所以这一块你可以把master带上,你也可以把master删掉都可以,如果你把master带上的话,其实master本身既当主又当从,相当于启动hbase相当于是在三个节点同时启动了一个regionsever,有三台regionserver这么个机器,但是master这台机器除了当regionserver之外,它还承担了一部分的主。
好了最后一个文件bashrc这个大家应该比较熟悉的了,bashrc里面就是配置一些例行的一些环境变量(如下图17所示)
vim~/.bashrc
exportHBASE_HOME=/usr/local/src/hbase-0.98.24-hadoop1
exportHBASE_CLASSPATH=$HBASE_HOME/conf
exportHBASE_LOG_DIR=$HBASE_HOME/logs
图17:
把这三个配置上去就可以了,然后配置完之后,怎么让它生效呢?
,你可以直接输入bash一下就可以
bash(如下图18所示)
图18:
那相当于在这个PPT上所讲解的四个配置我们就已经配置完了,hbase搭建不是那么的困难的,那接下来有一个重要的一个地方,就是说当你把hbase整个的配置全都配置完之后,你需要把这个配置同步到你各个节点上去,相当于是把所有的节点的这个目录里面的配置都保持一致,这个应该没有什么问题,之前我们搭建hdfs这个大家应该也有一些经验了是吧?
相当于做个分发(根据我下面的操作进行分发上去各个节点)
第一步将配置好的hbase整个文件分发到slave1和slave2中(如下图19所示和命令行所示)
前提一定要在su,管理员权限下进行!
!
scp-rphbase-0.98.24-hadoop1slave1:
/usr/local/src/
scp-rphbase-0.98.24-hadoop1slave2:
图19:
然后我们去各个节点上去看看有没有当前这个文件
进入slave1和进入slave2的usr/local/src查看是否有文件
好了,然后接下来就是要启动你的hbase了对吧?
在启动之前希望大家在好好检查一下你们的机器环境,看看有没有一些异常的进程(如下图20所示)
图20:
因为我们刚刚设置了一个zookeeper,这个zookeeper是依赖于hbase默认它自带的工具,所以我们不需要去自己单独的启动一个zookeeper了,那比如说我们上次讲过那个zookeeper,你可能你的机器还保留着这个进程,那你现在就去把它先关闭掉。
然后另外呢,如果要是你这个机器之前已经跑过hbase,但是由于各个原因那有一些进程可能是消失了,有些进程仍然存在,这处于这个完全冗余的一个状态,这个进程本来就应该被删掉,但是它没有被删掉,这个时候你再去启动一个hbase的话,这样的话很容易会启动失败,大家请注意到这一点,那这个时候我们发现了我们的主上其实没有和hbase和zookeeper相关的进程,我们的从也是一样,那通过我们刚才在三台机器分别执行了这个jps,大家有没有发现一个细节?
我之前已经把我的hdfs或者是hadoop集群已经启动起来了。
那么我又想问大家一个问题,我需要把这个hadoop启动吗?
如果不启动的话我hbase会不会启动起来?
为什么需要呢?
因为你的hbase的数据是要存在hdfs上的,你这个hadoop和hbase都没有启动起来,那你让它的数据怎么存对吧?
所以前提大家要注意一下,如果你的hbase没有启动起来,有可能原因就是你的hadoop没有启动。
好了有了这些注意事项,接下来我们就可以放心大胆的去启动hbase了!
(如下图21所示)
图21:
启动很简单,命令行输入statr-hbase.sh在主的这个节点上去启动(在hbase的bin目录下启动)(如下图22所示)
在/usr/local/src/hbase-0.98.24-hadoop1/bin下面有两个(start-hbase.sh和stop-hbase.sh)
只需要在主节点上启动即可
bashstart-hbase.sh//开始启动
bashstop-hbase.sh//停止启动
图22:
启动以后三个节点的进程都正常,这说明已经启动成功了。
那接下来我们开始操作了,接下来通过shell的命令通过终端的命令来怎么对hbase进行一个操作,这个操作里面包含了很多个命令(如下图23所示)然后每种命令它的功能是不一样的,我们一个个去挑重点来进行介绍。
图23:
那么怎么进入这个终端呢?
其实很简单(如下图24所示)
hbaseshell或者是./hbaseshell//启动是比较慢的,请耐心等待。
图24:
那么说明Hbase已经完全启动起来了,那么我来看一下,hbase支持哪些命令!
(如下图25所示)
那执行一个help,它这个终端可能大家用起来有点不太适应,那执行help我们就可以看到有很多我们可以去执行的命令(如下图26所示)
图26:
如alter可以看你的表的结构的一个命令,这个我们等下会用到,还有一个就是enable,这个就是来怎么让你的表同位激活状态变成一个激活状态,exists是检查一个表是否存在,drop是删除,list相当于是你这个hbase里面有哪些用户表。
那我们就挑几个重点然后练习一下,那首先我们创建一张表
终端输入:
create‘badou_music_table’,‘meta_data’,‘action’
前面是表名,后面跟着多个字符串,你也可以跟一个也可以跟很多个字符串,那么后面这些字符串是什么呢?
是代表着你要创建的一个ColumnFamily,那我这里面ColumnFamily我暂时先设两个,一个叫做meta_data,就是因为我这个表格里面要存一些音乐,那我这个meta_data上就是代表我这里面要存一些关于你这个音乐的一些描述信息,比如你这个音乐的名字,音乐的标签等等,这些的原始维护你的数据的一些描述信息,然后另外一个再设一个ColumnFamily叫做一个action,这个action是什么意思呢?
就是看一下当前这个音乐是不是一个激活的状态,是不是可以被播放的状态,因为大家以后在去做大数据的时候你会发现公司里面所有数据并不是说所有都能够对外提供服务提供访问,那这个数据库里面肯定会包含大量的已经失效的信息,那这些失效信息都是通常通过一些方法来进行控制,那比如说我们在这里面可以加一些action标记,来标记当前这个音乐是不是处于一个可以被大众能够检索到这么一个状态。
(如下图27和图28所示)
图27:
图28:
然后我们再describe‘badou_music_table’,看一下badou_music_table这个表的信息
命令行输入;
describe‘badou_music_table’(如下图29所示)
图29:
刚才我们设置了两个列族对不对?
两个列族都用一个大括号来维护,那么第一个列族的名字叫actions,第二个列族叫meta_data,然后那括号里面都是些关于这个列族里面数据的一些信息,这里面有一些字段比较重要,比如VERSIONS的一个数字,这个数字代表什么意思呢?
就是说你可以对一个shell或者是对一个单元,比如你这里面有值了,那你可以进行对数值进行一些个改写,比如从1改到2,从2改到3,比如说你改了两次,比如说你这个VERSIONS等于3的话,相当于这3个值都可以帮你保存住,相当于是一个版本号,有这么一个备份的功能,它可以帮你保留几个版本。
然后还有IN_MEMORY=>
false,这里面默认是false,因为一开始建表的时候什么属性都没有加,所以它默认是false,IN_MEMORY是什么意思呢?
就是说当你创建完一个表,这个表这里面有一个ColumnFamily,如果这个ColumnFamily你这个IN_MEMORY等于true的话,就说明这个ColumnFamily里面的所有信息都是要存在内存里面的,如果是false的话,相当于ColumnFamily里面的数据都是存在了你的hdfs上了。
好了那我们看一下,假设说我们这个结构已经是这个样子了那你会发现我这个第一个ColumnFamily我想改一下,这个名字取的不太好或者是这个ColumnFamily我想把它删了怎么弄呢?
(如下图30所示)
alter‘describe‘badou_music_table’,{NAME=>
’flags’}
括号里面这个时候我想要加一个新的列族,这个列族叫做一个flags,叫做一堆的标记位,然后再后面你可以不用接,但是后面你也可以接一些版本号等属性(如alter‘badou_table’,{NAME=>
’flags’,VERSIONS=>
3,IN_MEMORY=>
true}),(如下图31所示)像这个hbase终端操作不是很方便,大家如果之后有操作一下你就感受到这个终端很难用,因为它退格的时候根本没有办法退。
图31:
其实如果发现一旦有一个错别字的话你按退回键是退不回去的,怎办呢?
就是按ctrl+退格的方式才能去删,所以如果大家觉得你敲命令的时候比较麻烦的话你可以把这个命令提前在文本上提前写好然后直接复制过来,而且在真正工作中生产环境里面都是通过一些脚本的方式让这些个命令去执行的,但是如果要让在线的debug一个数据,那就是直接登入这个终端上面然后直接去查询相应的数据。
alter‘describe‘badou_music_table’,{NAME=>
3,IN_MEMORY=>
true}
好了这个时候我们来执行一下(如下图32和图33所示)
图32:
然后再看一下我们这个badou_table的这个表结构
describe‘badou_music_table’(如下图33所示)
图33:
看到了把?
刚刚我们新添加了一个列族,叫’flags’对吧?
,它原来的列族叫一个meta_data,然后并且我们刚才创建这个flags这个列族后面加了两个属性,一个是VERSIONS=>
3,一个是IN_MEMORY=>
true,这在上图33都能找到,也就是说这个版本号默认情况下只保留一个版本,那现在都改成3了,那相当于可以把你保留3个版本,相当于是给你做一个备份。
如果你有一个单元被重复的修改,它可以保留最近的三次的一个记录,还有一个IN_MEMORY=这时候已经变成true了,这说明这个ColumnFamily就会把这个数据存在内存里面。
好了这个时候比如说我这个‘badou_music_table’表已经是不需要用了,然后想把这个表删了怎么删?
(如下图34所示)
首先要把你要删除的表从一个激活状态变成一个末激活状态,所以先把这个表disable一下
如下图34:
disable‘badou_music_table’
然后才能对这个表进行删除的操作
drop‘badou_music_table’
图35:
然后list就没有这个表了对吧?
(如下图36所示)
图36:
好了那这个时候我们一方面通过终端的方式,另外一方面配合着我们hadoop根目录下面有一个hbase这个目录,我们配合这两个部分看一下我们在终端上的操作是不是可以直接影响到这里面的一个数据变化(如下图37和38和39所示)
hadoopfs-ls/hbase
hadoopfs-ls/hbase/data
图37:
我们来看一下data这个文件数据,因为我们现在要往里写的数据都是存在这个目录下面去的。
图38:
因为我现在在hbase终端list的时候,我现在hbase的状态就有存在两张表了对不对?
你看上图38的每一张表都会做一个目录的形式存在。
如果你想看某一个表格的数据的话你就可以看这些目录下的表数据。
那我们重新把这个命令重新在主机器上运行一下,我们把刚才删的那个表再重新建起来(如下图39所示)
图39:
List一下你会发现多出来一个表对吧?
那我们再反过来看看主机上是不是又多出来一个目录
(如下图40所示)
图40:
确实多出来一个表。
那么接下来我们就开始看怎么往这个表里面去写一些数据,在写数据之前,我想再去跟大家说几个命令,一个命令就是:
exists‘’这个命令是查看一个表是否存在,那么如果它返回一句话Tablebadou_music_tabledoesexist那么这个表就已经存在了,如果是我们对一个不存在的表就会返回Tablebadou_music_table1doesnotexis,说明不存在了(如下图41所示)
图41:
通过这样的命令可以判断你这个表是否真的存在,另外一个我们可以通过另外一个命令看一下这个表不仅是存在而且是否是一个激活状态:
is_enabled‘badou_music_table’,返回的是true那么就是一个激活状态(如下图42所示)
图42:
那么我们从一个激活状态设置它为不激活状态:
disable‘badou_music_table’(如下图43所示)
图43:
好了我们已经设置为不激活状态了,那么我们再来输入:
is_enabled‘badou_music_table’看看返回出来的是什么(如下图44所示)
图44:
返回了false了对不对?
不激活状态表你是没有办法去操作的,这个大家记住,那么我们再把这个表激活一下,激活命令是enable‘badou_music_table’(如下图45所示)
图45:
好了,我们把这个表重新激活了,那么我们开始把这个表写入一些数据,写数据的命令是:
put‘badou_music_table’,‘1001’,’meta_data:
name’,’wangqingshui’
Put‘badou_music_table’是说要写入什么表,’1001’这个就是代表rowkey,然后后面是代表你的列’meta_data:
name’,假如说1001是代表一个音乐的一个id号,然后这个音乐的名字叫什么呢?
我们取一个名字叫’wangqingshui’然后回车即可(如下图46所示)
图46:
好了这个时候我们看一下这个表,看看这个’wangqingshui’存在还是不存在(如下图47所示)
get‘badou_music_table’,’1001’
我们通过表名加rowkey去查询是否存在’wangqingshui’
图47:
这个时候已经存在了,并且有一个时间戳(timestamp=150********90)
那这个时候我想对这个歌曲进行改名,改名怎么改呢?
直接还是这个
name’命令,然后你就直接无视这个数据是否存在,你就直接写数据就可以了,那这个如果数据里面之间已经存在过的话那相当于是直接把数据进行覆盖。
原先的歌曲名字:
更改歌曲名字:
name’,’elangchuanshuo’
(如下图48所示)
图48:
变成饿狼传说了对不对?
然后这个列的名字叫meta_data:
name是吧?
前面的meta_data代表你的ColumnFamily,后面name代表你的Columnqualifiar,这个name就是它的列,这个列Columnqualifiar是你随便可以指定的,ColumnFamily是不可以变的,但是你这个列名是可以随便写的。
那么我们再写一个关于这个音乐的标签tag,那这个音乐是什么风格呢?
就代表一个pop就是流行音乐,1001这个是pop的一个tag是吧?
put‘badou_music_table’,‘1001’,’meta_data:
tag’,’pop’
如下图49所示:
然后重新get一下
get‘badou_music_table’,‘1001’
如下图50所示:
看到了没?
它多了一个列是吧?
然后这个value叫pop,而且同一个列族上次的我们已经说过了同一个列族它会想象一个文件然后进行一个统一处理对吧?
然后列族里面可以细分出很多的一个子列,这个子列你可以随便定义。
刚才我们不是有一个wangqingshui这个歌名对吧?
我们现在来看看能不能把这个wangqingshui再拽出来。
后面的括号是一个判断,然后后面跟着你的时间戳
timestamp