0、安装Hadoop
在集群的每台机器上安装Hadoop,保证目录结构和配置文件一致(可以在一台服务器上安装好复制到另外的服务器上),参考:怎么在CentOS Linux 8 上安装Hadoop?
1、下载HBase
以下内容全部用hadoop用户执行。
官网地址:https://hbase.apache.org/downloads.html,我们要下载bin版本的。
执行如下命令:
cd /home/hadoop/server
wget http://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.2.2/hbase-2.2.2-bin.tar.gz
tar -zxvf hbase-2.2.2-bin.tar.gz
ln -sf /home/hadoop/server/hbase-2.2.2/ /home/hadoop/hbase
清华大学的镜像速度还不错,从这里下载比官网要快的多。
2、配置HBase
root用户执行如下命令:
配置环境变量
vi /etc/profile #文件底部添加以下内容
内容如下:
export HBASE_HOME=/home/hadoop/hbase
export PATH=$PATH:$HBASE_HOME/bin:/$HBASE_HOME/sbin
加载全局环境变量,并切换到hadoop用户执行后面的命令
source /etc/profile
su hadoop
以下内容用hadoop用户执行命令:
配置hbase-env.sh
cd /home/hadoop/hbase
vi /home/hadoop/hbase/conf/hbase-env.sh
文件尾部添加以下内容
export TZ="Asia/Shanghai"
export JAVA_HOME="/usr/local/jdk"
export HBASE_CLASSPATH=/home/hadoop/hadoop/etc/hadoop
export HBASE_MANAGES_ZK=false
#已经有zookeeper集群设为false,单机运行hbase则设为true
#然后维护启动hbase自带的zookeeper
配置regionservers
vi /home/hadoop/hbase/conf/regionservers
#类似hadoop的datanode,存储内容的服务器
内容如下
hadoop223
hadoop224
hadoop225
hadoop226
hadoop227
hadoop228
配置hbase-site.xml
vi /home/hadoop/hbase/conf/hbase-site.xml #hbase的核心配置文件
内容如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<!--RegionServer 的共享目录,用来持久化 Hbase-->
<!--这里myha01来自于hdfs-site.xml的配置dfs.nameservices也就是hdfs的namenode服务器-->
<name>hbase.rootdir</name>
<value>hdfs://myha01/hbase</value>
</property>
<property>
<!--启用分布式集群,false就是单机模式,true就是分布式集群模式-->
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<!--HMaster的IP或Hostname-->
<name>hbase.master</name>
<value>hadoop221:60000</value>
</property>
<property>
<!--HMaster时间同步允许的时间差-->
<name>hbase.master.maxclockskew</name>
<value>180000</value>
</property>
<property>
<!--HMaster的RPC端口-->
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<!--HMaster HTTP访问端口-->
<name>hbase.master.info.port</name>
<value>16010</value>
</property>
<property>
<!--HRegionServer的RPC端口-->
<name>hbase.regionserver.port</name>
<value>16020</value>
</property>
<property>
<!--HRegionServer HTTP访问端口-->
<name>hbase.regionserver.info.port</name>
<value>16030</value>
</property>
<property>
<!-- 指定ZooKeeper的所有服务器地址 -->
<name>hbase.zookeeper.quorum</name>
<value>hadoop226:2181,hadoop227:2181,hadoop228:2181</value>
</property>
<property>
<!--这个属性主要作用是禁止检查流功能(stream capabilities)[hflush/hsync] -->
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>
配置备用HMaster
添加备用的HMaster,以便主Hmaster不可用时自动切换, 每台机器一条记录
vi /home/hadoop/hbase/conf/backup-masters
内容如下:
hadoop222
把Hbase复制到其他服务器上去
部署到其它的服务器上去
scp -r /home/hadoop/server/hbase-2.2.2 hadoop@hadoop222:/home/hadoop/server/
scp -r /home/hadoop/server/hbase-2.2.2 hadoop@hadoop223:/home/hadoop/server/
scp -r /home/hadoop/server/hbase-2.2.2 hadoop@hadoop224:/home/hadoop/server/
scp -r /home/hadoop/server/hbase-2.2.2 hadoop@hadoop225:/home/hadoop/server/
scp -r /home/hadoop/server/hbase-2.2.2 hadoop@hadoop226:/home/hadoop/server/
scp -r /home/hadoop/server/hbase-2.2.2 hadoop@hadoop227:/home/hadoop/server/
scp -r /home/hadoop/server/hbase-2.2.2 hadoop@hadoop228:/home/hadoop/server/
在所有的服务器上执行以下命令
ln -sf /home/hadoop/server/hbase-2.2.2/ /home/hadoop/hbase
启动HBase
在其中一台服务器上(比如:hadoop221)启动HBase
stop-hbase.sh
start-hbase.sh
如果出现以下错误提示,不理它,不要删除文件,如果删除文件会导致其它问题:
/home/hadoop/server/hbase-2.2.2/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar
jps #主要有两个进程HRegionServer(存储进程)和HMaster(管理进程)
HMaster数据查看:http://hadoop221:16010/
RegionServer数据查看:http://hadoop228:16030/
数据测试
hbase shell
hbase(main):001:0> create 'test', 'cf'
hbase(main):002:0> put 'test', 'debugo','cf:name','debugo' # debugo是主键,后面的才是数据
hbase(main):003:0> put 'test', 'debugo','cf:age','12'
hbase(main):004:0> put 'test', 'debugo','cf:contry','Shandong'
hbase(main):005:0> put 'test', 'debugo','cf:birthday','1987-04-01'
hbase(main):006:0> get 'test', 'debugo'
对于MySQL来说这是4条数据,但是对于HBase来说,这就是一条数据(需要理解一下)
HBase使用举例
hbase shell #启动hbase shell命令行
namespace操作
hbase(main):001:0> list_namespace #列出当前数据库中的所有namespace(库)
hbase(main):001:0> create_namespace 'crm' #创建名称为“crm”的namespace
hbase(main):001:0> list_namespace_tables 'crm' #获取指定namespace下的所有表
hbase(main):001:0> describe_namespace 'crm' #查看指定namespace的描述
hbase(main):001:0> create 'crm:testtable', 'fm1' #在指定namespace'crm'下创建表'testtable'
删除namespace ----必须空的namespace才能删除 要删除掉里面的表
hbase(main):001:0> disable 'crm:testtable'
hbase(main):001:0> drop 'crm:testtable'
hbase(main):001:0> drop_namespace 'crm'
table DML操作
hbase(main):002:0> list #列出hbase中的表:
hbase(main):003:0> status
hbase(main):004:0> version
hbase(main):005:0> create ‘test’, ‘cf’ #创建一个名为 test 的表,此表只有一个列簇为 cf
hbase(main):006:0> create ‘member’,‘mem_id’,‘address’,‘info’ # 3个列簇的表(最好不这么做)
hbase(main):007:0> describe ‘member’ #获得表的描述
hbase(main):008:0> alter ‘member’, ‘id’ #给member添加一个列族(最好不这么做)
删除一个列族
hbase(main):009:0> alter ‘member’, {NAME => ‘member_id’, METHOD => ‘delete’}
hbase(main):010:0> delete ‘member’,‘debugo’,‘info:age’ #删除列
hbase(main):011:0> get ‘member’,‘debugo’,‘info:age’
hbase(main):012:0> deleteall ‘member’,‘debugo’ #删除整行的值:deleteall
hbase(main):013:0> get ‘member’,’debugo’
通过enable和disable来启用/禁用这个表,相应的可以通过is_enabled和is_disabled来检查表是否被禁用。
hbase(main):014:0> is_enabled ‘member’
hbase(main):015:0> is_disabled ‘member’
hbase(main):016:0> exists ‘member’ #使用exists来检查表是否存在
hbase(main):017:0> disable ‘member’ #删除表需要先将表disable。
hbase(main):018:0> drop ‘member’ #删除表需要先将表disable。
hbase(main):018:0> truncate ‘member’ #清空表
数据插入操作
插入数据测试开始
hbase(main):019:0> create ‘member’,‘id’,‘address’,‘info’
hbase(main):020:0> put ‘member’, ‘debugo’,‘id’,‘11’ #debugo为数据的主键
hbase(main):021:0> put ‘member’, ‘debugo’,‘info:age’,‘27’
hbase(main):022:0> put ‘member’, ‘debugo’,‘info:birthday’,‘1987-04-04’
插入数据测试结束
数据查询操作
查询数据测试开始
hbase(main):023:0> count ‘member’ #查询表中有多少行:count
hbase(main):024:0> get ‘member’, ‘Sariel’ #获取一个id的所有数据
hbase(main):025:0> get ‘member’, ‘Sariel’, ‘info’ #获得一个id,一个列簇中的所有数据:
hbase(main):026:0> scan ‘member’ #查询整表数据
hbase(main):027:0> scan ‘member’, {COLUMN=>‘info’} #扫描整个列簇
hbase(main):028:0> scan ‘member’, {COLUMNS=> ‘info:birthday’} #指定扫描其中的某个列
hbase(main):029:0>
官方建议一张表不要超过3个列簇,实际应用中最好只设置1个列簇,否则会出现性能问题