Hbase 安装| shell操作
GFS -->hdfs
mapreduce --->hadoop mr
bigtable-->hbase
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统
海量存储;列式存储;极易扩展;高并发;稀疏(针对HBase列的灵活性,在列族中,你可以指定任意多的列;稀疏性体现了它的非结构化特点)
hbase是一个基于hdfs的列式存储系统,可以用廉价pc组建集群,对10亿行百万列的数据量级提供随机实时读写。
标示 列族
rowkey column family
列族中有若干列,列并不是它的结构;
HBase安装
1 Zookeeper正常部署
首先保证Zookeeper集群的正常部署,并启动之
[kris@hadoop101 zookeeper-3.4.10]$ bin/zkServer.sh start [kris@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh start [kris@hadoop103 zookeeper-3.4.10]$ bin/zkServer.sh start
2 Hadoop正常部署
Hadoop集群的正常部署并启动
[kris@hadoop101 hadoop-2.7.2]$ sbin/start-dfs.sh [kris@hadoop102 hadoop-2.7.2]$ sbin/start-yarn.sh
3 HBase解压
解压HBase到指定目录
[kris@hadoop101 software]$ tar -zxvf hbase-1.3.1-bin.tar.gz -C /opt/module
4 HBase配置
修改HBase对应的配置文件
1)hbase-env.sh修改内容
export JAVA_HOME=/opt/module/jdk1.8.0_144 export HBASE_MANAGES_ZK=false
2)hbase-site.xml修改内容
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://hadoop101:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 0.98后的新变动,之前版本没有.port,默认端口为60000(可省略) --> <property> <name>hbase.master.port</name> <value>16000</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop101,hadoop102,hadoop103</value> </property> <!-- 参照zk的zoo.cfg文件中的dataDir值 --> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/opt/module/zookeeper-3.4.10/zkData</value> </property> </configuration>
说明:hbase.rootdir:这个目录是region server的共享目录,用来持久化Hbase 。
hbase.cluster.distributed :Hbase的运行模式。false是单机模式,true是分布式模式。若为false,Hbase和Zookeeper会运行在同一个JVM里面。
3)hbase/conf/regionservers
hadoop101
hadoop102
hadoop103
4)软连接hadoop配置文件到HBase
[kris@hadoop101 module]$ ln -s /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml /opt/module/hbase/conf/core-site.xml [kris@hadoop101 module]$ ln -s /opt/module/hadoop-2.7.2/etc/hadoop/hdfs-site.xml /opt/module/hbase/conf/hdfs-site.xml
5 HBase发送到其他集群
[kris@hadoop101 module]$ xsync hbase/
6 HBase服务启动
1)启动方式1
启动前确保时间是同步的;因为要hbase有version,所以要保证时间的一致性
[kris@hadoop101 ~]$ date 2019年 03月 05日 星期二 09:24:52 CST [kris@hadoop102 module]$ date 2019年 03月 05日 星期二 09:24:52 CST [kris@hadoop103 ~]$ date 2019年 03月 05日 星期二 09:24:52 CST
[kris@hadoop101 hbase]$ bin/hbase-daemon.sh start master
[kris@hadoop101 hbase]$ bin/hbase-daemon.sh start regionserver
提示:如果集群之间的节点时间不同步,会导致regionserver无法启动,抛出ClockOutOfSyncException异常。
修复提示:
a、同步时间服务 b、属性:hbase.master.maxclockskew设置更大的值 <property> <name>hbase.master.maxclockskew</name> <value>180000</value> <description>Time difference of regionserver from master</description> </property>
2)启动方式2
[kris@hadoop101 hbase]$ bin/start-hbase.sh
对应的停止服务:
[kris@hadoop101 hbase]$ bin/stop-hbase.sh
7 查看HBase页面
启动成功后,可以通过“host:port”的方式来访问HBase管理页面,例如:
http://hadoop101:16010
jar包冲突//启动时若出现hadoop和hbase下的jar包冲突,可删掉一个;不删也不影响运行 [kris@hadoop101 lib]$ rm -rf slf4j-log4j12-1.7.5.jar
HBase Shell操作
1)进入HBase客户端命令行 [kris@hadoop101 hbase]$ bin/hbase shell 2)查看帮助命令 hbase(main):001:0> help hbase(main):001:0> help ‘create’ 3)查看当前数据库中有哪些表 查看所有的数据库:list_namespace 查看某个数据库下的所有表:list_namespace_tables ‘库名’ hbase(main):002:0> list
namespace相关的操作
create_namespace 'my_ns'
drop_namespace 'my_ns'
alter_namespace 'my_ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}
建表 create 表名 , 列族中有若干列 create 'student', 'cf1' desc 'student' 隐式列rowkey 增 put 'default:student', '1001', 'cf1:name', 'alex' hbase(main):032:0> put 'student', '1002', 'cf1:salary', '20000' hbase(main):031:0> put 'student', '1002', 'cf1:hoby', 'java' scan 'student' 改 put 'student', '1002', 'cf1:hoby', 'math' delete 'student' '1000', 'cf1:age' 查{左值要大写=>‘1000’, } [ ) hbase(main):036:0> scan 'student', {STARTROW=>'1001', STOPROW=>'1001'} hbase(main):037:0> scan 'student', {STARTROW=>'1001'} ROW COLUMN+CELL 1001 column=cf1:age, timestamp=1551762695324, value=22 1001 column=cf1:gender, timestamp=1551762910336, value=male 1001 column=cf1:name, timestamp=1551762679483, value=alex 1002 column=cf1:hoby, timestamp=1551763319863, value=math 1002 column=cf1:job, timestamp=1551763148832, value=bigData 1002 column=cf1:name, timestamp=1551763038621, value=kris 1002 column=cf1:salary, timestamp=1551763126022, value=20000 2 row(s) in 0.0230 seconds hbase(main):038:0> scan 'student', {STOPROW=>'1002'} get 'student', '1000', 'cf1:name' hbase(main):040:0> get 'student', '1001', 'cf1:name' 删 delete 'student', '1001', 'cf1:name' deleteall 'student', '1001' truncate 'student' disable 'student' drop 'student' hbase(main):041:0> count 'student' 2 row(s) in 0.0230 seconds => 2 rowkey是根据自动字典排序的
version版本,毫秒数时间戳即默认版本号,scan默认的是加载最新的版本号的数据;
RAW最原始数据;VERSION=>4是本次查询可以看到4个版本的值
它是没有真正的修改,只是在后边追加
flush由内存到hdfs,不是最新的就会丢弃
长整型longint,也可自定义 倒叙排列
hbase(main):013:0> create 'stu1', 'cf1', {NAME=>'cf2', VERSIONS=>3} 0 row(s) in 1.2800 seconds => Hbase::Table - stu1 hbase(main):014:0> desc 'stu1' Table stu1 is ENABLED stu1 COLUMN FAMILIES DESCRIPTION {NAME => 'cf1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENC ODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'} {NAME => 'cf2', BLOOMFILTER => 'ROW', VERSIONS => '3', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENC ODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'} 2 row(s) in 0.0260 seconds
往里put数据
hbase(main):015:0> put 'stu1', '1001', 'cf1:name', 'alex1' 0 row(s) in 0.1060 seconds hbase(main):016:0> put 'stu1', '1001', 'cf1:name', 'alex2' 0 row(s) in 0.0090 seconds hbase(main):017:0> put 'stu1', '1001', 'cf1:name', 'alex3' 0 row(s) in 0.0050 seconds hbase(main):018:0> put 'stu1', '1001', 'cf1:name', 'alex4' 0 row(s) in 0.0060 seconds hbase(main):019:0> put 'stu1', '1001', 'cf1:name', 'alex5' 0 row(s) in 0.0050 seconds hbase(main):020:0> put 'stu1', '1001', 'cf2:name', 'kris1' 0 row(s) in 0.0090 seconds hbase(main):021:0> put 'stu1', '1001', 'cf2:name', 'kris2' 0 row(s) in 0.0110 seconds hbase(main):022:0> put 'stu1', '1001', 'cf2:name', 'kris3' 0 row(s) in 0.0060 seconds hbase(main):023:0> put 'stu1', '1001', 'cf2:name', 'kris4' 0 row(s) in 0.0060 seconds hbase(main):024:0> put 'stu1', '1001', 'cf2:name', 'kris5' 0 row(s) in 0.0060 seconds
hbase(main):025:0> scan 'stu1' ROW COLUMN+CELL 1001 column=cf1:name, timestamp=1551780927829, value=alex5 1001 column=cf2:name, timestamp=1551780984629, value=kris5 1 row(s) in 0.0140 seconds hbase(main):027:0> scan 'stu1', {VERSIONS=>6, RAW=>true} ROW COLUMN+CELL 1001 column=cf1:name, timestamp=1551780927829, value=alex5 1001 column=cf1:name, timestamp=1551780925379, value=alex4 1001 column=cf1:name, timestamp=1551780923004, value=alex3 1001 column=cf1:name, timestamp=1551780920152, value=alex2 1001 column=cf1:name, timestamp=1551780916196, value=alex1 1001 column=cf2:name, timestamp=1551780984629, value=kris5 1001 column=cf2:name, timestamp=1551780982196, value=kris4 1001 column=cf2:name, timestamp=1551780979552, value=kris3 1001 column=cf2:name, timestamp=1551780977159, value=kris2 1001 column=cf2:name, timestamp=1551780972972, value=kris1 1 row(s) in 0.0240 seconds hbase(main):028:0> flush 'stu1' 0 row(s) in 0.4880 seconds hbase(main):029:0> scan 'stu1', {VERSIONS=>6, RAW=>true} ROW COLUMN+CELL 1001 column=cf1:name, timestamp=1551780927829, value=alex5 1001 column=cf2:name, timestamp=1551780984629, value=kris5 1001 column=cf2:name, timestamp=1551780982196, value=kris4 1001 column=cf2:name, timestamp=1551780979552, value=kris3 1 row(s) in 0.0390 seconds
墓碑数据
删除会把删掉的数据让他们成为墓碑
会新增一条最新的墓碑数据
会存到hdfs,但最终会被删除
hbase(main):038:0> put 'stu1', '1001', 'cf1:age', '22' 0 row(s) in 0.0430 seconds hbase(main):040:0> put 'stu1', '1001', 'cf1:name', 'alex6' 0 row(s) in 0.0060 seconds hbase(main):041:0> scan 'stu1', {VERSIONS=>6, RAW=>true} ROW COLUMN+CELL 1001 column=cf1:age, timestamp=1551782031431, value=22 1001 column=cf1:name, timestamp=1551782055498, value=alex6 1001 column=cf1:name, timestamp=1551780927829, value=alex5 1001 column=cf2:name, timestamp=1551780984629, value=kris5 1001 column=cf2:name, timestamp=1551780982196, value=kris4 1001 column=cf2:name, timestamp=1551780979552, value=kris3 1 row(s) in 0.0110 seconds hbase(main):042:0> delete 'stu1', '1001', 'cf1:name' 0 row(s) in 0.0580 seconds hbase(main):043:0> scan 'stu1' ROW COLUMN+CELL 1001 column=cf1:age, timestamp=1551782031431, value=22 1001 column=cf2:name, timestamp=1551780984629, value=kris5 1 row(s) in 0.0160 seconds hbase(main):044:0> scan 'stu1', {VERSIONS=>6, RAW=>true} ROW COLUMN+CELL 1001 column=cf1:age, timestamp=1551782031431, value=22 1001 column=cf1:name, timestamp=1551782116703, type=DeleteColumn 1001 column=cf1:name, timestamp=1551782055498, value=alex6 1001 column=cf1:name, timestamp=1551780927829, value=alex5 1001 column=cf2:name, timestamp=1551780984629, value=kris5 1001 column=cf2:name, timestamp=1551780982196, value=kris4 1001 column=cf2:name, timestamp=1551780979552, value=kris3 1 row(s) in 0.0170 seconds