Hbase集群搭建

来源:互联网 发布:马自达cx4 知乎 编辑:程序博客网 时间:2024/06/03 17:03

简单说一下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:/itcastscp -r /itcast/hbase0.96.2-hadoop2/   itcast03:/itcastscp -r /itcast/hbase0.96.2-hadoop2/   itcast04:/itcastscp -r /itcast/hbase0.96.2-hadoop2/   itcast05:/itcastscp -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列标示符,值为zhangsanput 'user', 'rk0001', 'info:name', 'zhangsan'user表中插入信息,row key为rk0001,列族info中添加gender列标示符,值为femaleput 'user', 'rk0001', 'info:gender', 'female'user表中插入信息,row key为rk0001,列族info中添加age列标示符,值为20put 'user', 'rk0001', 'info:age', 20user表中插入信息,row key为rk0001,列族data中添加pic列标示符,值为pictureput '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和f2alter 'people', NAME => 'f1'alter 'user', NAME => 'f2'启用表enable 'user'###disable 'user'(新版本不用)删除一个列族:alter 'user', NAME => 'f1', METHOD => 'delete'alter 'user', 'delete' => 'f1'添加列族f1同时删除列族f2alter 'user', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}将user表的f1列族版本号改为5alter '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 => 10get 'user', 'rk0002', {COLUMN => ['info:name', 'data:pic']}scan 'people', {COLUMNS => 'info',RAW => true, VERSIONS => 3}
原创粉丝点击