Hbase集群搭建

简单说一下hbase

1、HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
2、HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。hbase的名称也是hadoop database的缩写,即hadoop数据库。


主要说的是hbase集群的搭建

hbase集群的搭建

准备条件
已经有了六台主机,分别如下:
集群规划:
主机名 IP                    安装的软件        运行的进程
itcast01 192.168.1.201 jdk、hadoop NameNode、DFSZKFailoverController
itcast02 192.168.1.202 jdk、hadoop NameNode、DFSZKFailoverController
itcast03 192.168.1.203 jdk、hadoop ResourceManager
itcast04 192.168.1.204 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
itcast05 192.168.1.205 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
itcast06 192.168.1.206 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain

第一步:启动zookeeper
首先将hdfs启动起来,因为hbase是依赖hdfs的,hbase数据库存放在hdfs上。
因为hdfs是也是一个集群,有两个namenode,最开始启动zookeeper,04,05,06三台分别启动。
在zk的bin目录下,执行

./zkServer.sh start

分别jps,多了QuorumPeerMain进程,表名启动成功。


第二步:启动hdfs
在itcast01上启动hdfs.(已经配置好了到其他舞台机器的ssh免登陆,只需要将01上的公钥拷贝给其他主机即可)
在hadoop的bin目录下执行

./start-dfs.sh

观察启动的顺序:先启动的是01和02上的namenode,再启动04,05,06上的datanode,再启动journalnode,最后启动的是zkfs(DFSZKFailoverController)。


第三步:Hbase集群安装
1、首先修改hbase的配置文件conf下的hbase.site.xml

vim hbase-site.xml

<configuration>
        <!-- 指定hbase在HDFS上存储的路径 -->
        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://ns1/hbase</value>
        </property>
        <!-- 指定hbase是分布式的 -->
        <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
        </property>
        <!-- 指定zk的地址,多个用“,”分割 -->
        <property>
                <name>hbase.zookeeper.quorum</name>
                <value>itcast04:2181,itcast05:2181,itcast06:2181</value>
        </property>
    </configuration>

2、修改hbase-env.sh文件

    export JAVA_HOME=/usr/java/jdk1.7.0_55
    //告诉hbase使用外部的zk 
    export HBASE_MANAGES_ZK=false      (大概在文件96%的位置)

3、指定hbase的小弟在哪里(类似于hdfs的小弟datanode的slaves的配置)
在hbase的conf目录下

执行:vim regionservers 将默认的localhost修改为
    itcast03
    itcast04
    itcast05
    itcast06

4、最后将hbase分别拷贝到02,03,04,05,06五台主机上。(先删除hbase下的docs文件,这样拷贝速度快)

先删除docs文件
rm -rf /itcast/hbase-0.96.2-hadoop2/docs

scp -r /itcast/hbase0.96.2-hadoop2/   (用户,不写默认是当前用户root/)itcast02:/itcast
scp -r /itcast/hbase0.96.2-hadoop2/   itcast03:/itcast
scp -r /itcast/hbase0.96.2-hadoop2/   itcast04:/itcast
scp -r /itcast/hbase0.96.2-hadoop2/   itcast05:/itcast
scp -r /itcast/hbase0.96.2-hadoop2/   itcast06:/itcast

5、启动hbase。
在hbase的bin目录下,执行
./start-hbase.sh
主机01上jps: 发现多了一个HMaster进程 (这是Hbase的老大)
还有DFSZKFailovercontroller,namenode,jps进程。

注意:此时在主机05上jps并未发现hbase的小弟HRegionservers启动起来
因为小弟HRegionservers并不知道它该连接哪台namenode,有两个namenode,只知道那个抽象出来的ns1(nameserver),hbase并不知道它是什么

简单的一个解决方法就是直接将hadoop中的core-site.xml和hdfs-site.xml拷贝到hbase中的conf目录下。
在hadoop的配置目录下执行
scp core-site.xml hdfs-site.xml itcast01:/itcast/hbase-0.96.2-hadoop2/conf (也需要拷贝到本机)
scp core-site.xml hdfs-site.xml itcast02:/itcast/hbase-0.96.2-hadoop2/conf
scp core-site.xml hdfs-site.xml itcast03:/itcast/hbase-0.96.2-hadoop2/conf
scp core-site.xml hdfs-site.xml itcast04:/itcast/hbase-0.96.2-hadoop2/conf
scp core-site.xml hdfs-site.xml itcast05:/itcast/hbase-0.96.2-hadoop2/conf
scp core-site.xml hdfs-site.xml itcast06:/itcast/hbase-0.96.2-hadoop2/conf

此时在主机05上hbase的bin目录下执行

./start-hbase.sh

jps 一下,进程如下

HRegionServer
QuorumPeerMain
JournalNode
Jps
DataNode

Hbase的管理界面端口为60010 现在的默认端口是16010。直接访问192.168.1.32:16010可进入hbase的管理界面

到目前为止:集群启动了一个HMaster(主机01),四个HRegionServer(03,04,05,06),但是这样并不安全,当主机01挂掉时,hbase就挂掉了,此时,我们需要将主机02的HMaster启动起来

6、启动02上的HMaster
单独启动一个HMaster进程

  ./hbase-daemon.sh   start   master

此时,主机01和主机02上的两个HMaster能够相互切换,当01上的HMaster挂掉之后,02上的backup状态的HMaster就会成为活跃状态,就是这样的,没毛病。可以尝试手动挂掉主机01上的HMaster:kill -9 6182(HMaster的端口号)

到这里Hbase集群就搭建成功!


下面说一下hbase shell

./hbase shell

进入hbase命令行
./hbase shell

显示hbase中的表
list

创建user表,包含info、data两个列族
create 'user', 'info1', 'data1'
create 'user', {NAME => 'info', VERSIONS => '3'}

向user表中插入信息,row key为rk0001,列族info中添加name列标示符,值为zhangsan
put 'user', 'rk0001', 'info:name', 'zhangsan'user表中插入信息,row key为rk0001,列族info中添加gender列标示符,值为female
put 'user', 'rk0001', 'info:gender', 'female'user表中插入信息,row key为rk0001,列族info中添加age列标示符,值为20
put 'user', 'rk0001', 'info:age', 20user表中插入信息,row key为rk0001,列族data中添加pic列标示符,值为picture
put 'user', 'rk0001', 'data:pic', 'picture'

获取user表中row key为rk0001的所有信息
get 'user', 'rk0001'

获取user表中row key为rk0001,info列族的所有信息
get 'user', 'rk0001', 'info'

获取user表中row key为rk0001,info列族的name、age列标示符的信息
get 'user', 'rk0001', 'info:name', 'info:age'

获取user表中row key为rk0001,info、data列族的信息
get 'user', 'rk0001', 'info', 'data'
get 'user', 'rk0001', {COLUMN => ['info', 'data']}

get 'user', 'rk0001', {COLUMN => ['info:name', 'data:pic']}

获取user表中row key为rk0001,列族为info,版本号最新5个的信息
get 'people', 'rk0002', {COLUMN => 'info', VERSIONS => 2}
get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5}
get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5, TIMERANGE => [1392368783980, 1392380169184]}

获取user表中row key为rk0001,cell的值为zhangsan的信息
get 'people', 'rk0001', {FILTER => "ValueFilter(=, 'binary:图片')"}

获取user表中row key为rk0001,列标示符中含有a的信息
get 'people', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}

put 'user', 'rk0002', 'info:name', 'fanbingbing'
put 'user', 'rk0002', 'info:gender', 'female'
put 'user', 'rk0002', 'info:nationality', '中国'
get 'user', 'rk0002', {FILTER => "ValueFilter(=, 'binary:中国')"}


查询user表中的所有信息
scan 'user'

查询user表中列族为info的信息
scan 'people', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}
scan 'persion', {COLUMNS => 'info', RAW => true, VERSIONS => 3}
查询user表中列族为info和data的信息
scan 'user', {COLUMNS => ['info', 'data']}
scan 'user', {COLUMNS => ['info:name', 'data:pic']}


查询user表中列族为info、列标示符为name的信息
scan 'user', {COLUMNS => 'info:name'}

查询user表中列族为info、列标示符为name的信息,并且版本最新的5个
scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}

查询user表中列族为info和data且列标示符中含有a字符的信息
scan 'people', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}

查询user表中列族为info,rk范围是[rk0001, rk0003)的数据
scan 'people', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}

查询user表中row key以rk字符开头的
scan 'user',{FILTER=>"PrefixFilter('rk')"}

查询user表中指定范围的数据
scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}

删除数据
删除userrow key为rk0001,列标示符为info:name的数据
delete 'people', 'rk0001', 'info:name'
删除userrow key为rk0001,列标示符为info:name,timestamp1392383705316的数据
delete 'user', 'rk0001', 'info:name', 1392383705316


清空user表中的数据
truncate 'people'


修改表结构
首先停用user表(新版本不用)
disable 'user'

添加两个列族f1和f2
alter 'people', NAME => 'f1'
alter 'user', NAME => 'f2'
启用表
enable 'user'


###disable 'user'(新版本不用)
删除一个列族:
alter 'user', NAME => 'f1', METHOD => 'delete'alter 'user', 'delete' => 'f1'

添加列族f1同时删除列族f2
alter 'user', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}

将user表的f1列族版本号改为5
alter 'people', NAME => 'info', VERSIONS => 5
启用表
enable 'user'


删除表
disable 'user'
drop 'user'


get 'person', 'rk0001', {FILTER => "ValueFilter(=, 'binary:中国')"}
get 'person', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}
scan 'person', {COLUMNS => 'info:name'}
scan 'person', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}
scan 'person', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}

scan 'person', {COLUMNS => 'info', STARTROW => '20140201', ENDROW => '20140301'}
scan 'person', {COLUMNS => 'info:name', TIMERANGE => [1395978233636, 1395987769587]}
delete 'person', 'rk0001', 'info:name'

alter 'person', NAME => 'ffff'
alter 'person', NAME => 'info', VERSIONS => 10


get 'user', 'rk0002', {COLUMN => ['info:name', 'data:pic']}


scan 'people', {COLUMNS => 'info',RAW => true, VERSIONS => 3}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值