Hbase
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
与FUJITSU Cliq等商用大数据产品不同,HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用 Chubby作为协同服务,HBase利用Zookeeper作为对应。 [1]
上图描述Hadoop EcoSystem中的各层系统。其中,HBase位于结构化存储层,Hadoop HDFS为HBase提供了高可靠性的底层存储支持,Hadoop MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和failover机制。
此外,Pig和Hive还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变的非常简单。 Sqoop则为HBase提供了方便的RDBMS数据导入功能,使得传统数据库数据向HBase中迁移变的非常方便。
版本适配
HaBase对jdk和hadoop有很强的兼容性要求
jdk版本兼容
√ 为兼容
× 为不兼容
HaDoop版本兼容
√ 为兼容
× 为不兼容
!为未测试
本地安装
- 解压
- 配置环境变量
export HBASE_HOME=/usr/local/LinuxApp/hbase2.2.3
export PATH=$PATH:$JAVA_HOME/bin::$HBASE_HOME/bin
export PATH JAVA_HOME HBASE_HOME
#保存退出
source /etc/profile
- 编辑conf / hbase-env.sh文件
并取消注释以#export JAVA_HOME =开头的行,然后将其设置为Java安装路径。 - 编辑conf / hbase-site.xml,这是主要的HBase配置文件。
这时,您需要在本地文件系统上指定HBase和ZooKeeper写入数据的目录并确认一些风险。默认情况 下,在/ tmp下创建一个新目录。许多服务器配置为在重新引导时删除/ tmp的内容,因此您应该将数据 存储在其他位置。以下配置会将HBase的数据存储在名为的用户的主目录中的hbase目录中testuser。
将< property >标签粘贴在标签下面< configuration >,在新的HBase安装中应为空。
<configuration>
<!--HBase数据的保存目录,可以不事先创建data目录,系统会自动创建-->
<property>
<name>hbase.rootdir</name>
<value>file:///home/testuser/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/testuser/zookeeper</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
<description>
Controls whether HBase will check for stream capabilities (hflush/hsync).
Disable this if you intend to run on LocalFileSystem, denoted by a rootdir
with the 'file://' scheme, but be mindful of the NOTE below.
WARNING: Setting this to false blinds you to potential data loss and
inconsistent system state in the event of process and/or node failures. If
HBase is complaining of an inability to use hsync or hflush it's most
likely not a false positive.
</description>
</property>
</configuration>
测试
start-hbase.sh
启动可能会警告:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/LinuxApp/hadoop2.10/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/LinuxApp/hbase2.2.3/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
running master, logging to /usr/local/LinuxApp/hbase2.2.3/logs/hbase-root-master-node1.out
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/LinuxApp/hadoop2.10/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/LinuxApp/hbase2.2.3/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
解决:
- 删除hadoop目录下
/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar - 重新启动…
jps查看进程:出现HMaster进程
81698 HMaster
启动客户端
hbase shell
创建表
create ‘test1’,‘info’
查看
list
出现新建的表测试成功…
集群安装
集群规划
- 解压
- 配置环境变量
- 修改hbase-env.sh
export JAVA_HOME=/usr/local/jdk8
# 使用独立的zookeeper
export HBASE_MANAGES_ZK=false
- 修改hbase-site.xml
<property>
<name>hbase.rootdir</name>
<value>hdfs://LightseaBlue/hbase</value>
</property>
<!-- 开启集群运行方式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/zookeeper</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/usr/local/LinuxApp/hbase2.2.3/tmp</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node1,node2,node3</value>
</property>
- 设置regionservers
node2
node3
node4
- 设置备份 conf/backup-masters
没有此文件需自己创建
node2
- 在hadoop:hdfs-site.xml添加
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>4096</value>
</property>
-
HDFS客户端配置
第一种: 将Hadoop配置文件的位置信息添加到hbase-env.sh的HBASE_CLASSPATH 属性export HBASE_CLASSPATH=/usr/local/hadoop276/etc/hadoop
第二种:将Hadoop的hdfs-site.xml或hadoop-site.xml 拷贝到 ${HBASE_HOME}/conf目录下,或者通过符号链接的方式。如果采用这种方式的话,建议将两者都拷贝或建立符号链接
# 拷贝 cp core-site.xml hdfs-site.xml /usr/local/hbase219/conf/ # 使用符号链接 ln -s /usr/local/hadoop276/etc/hadoop/core-site.xml /usr/local/hbase219/conf ln -s /usr/local/hadoop276/etc/hadoop/hdfs-site.xml /usr/local/hbase219/conf
第三种 :如果你只有少量更改,那么直接配置到hbase-site.xml中即可。
-
同步
scp -r hbase219/ node2:/usr/local/
scp -r hbase219/ node3:/usr/local/
scp -r hbase219/ node4:/usr/local/
- 启动
- 启动zk
- 启动hadoop集群(确保有一台namenode是运行的)
- 启动hbase
start-hbase.sh
- 验证(去web端查看信息也可以使用jps查看进程)
http://node1:16010/master-status
http://node2:16010/master-status
命令
创建:
create 表名,列簇,…,
create 'test','info'
插入&更新:
put 表名,rowid,‘列簇:列名’,'值’
put 'test1','1','info:sex','nan'
put 'test1','2','id','32'
查询操作
scan '表名’
scan 'test1'
获取行或单元(cell)的值
get ‘表名’, ‘行键’
get ‘表名’, ‘行键’, '列簇名’
get 'test1','1'
get 'test1','1','info'
查看表
list
统计表数据行数
count '表名‘
count 'test1'
查看表结构describe
describe '表名’
describe 'test1'
变更表信息
将 info 列族中的数据存放 3 个版本:
alter 'test1',{NAME=>'info',VERSIONS=>3}
get 'test1','1001',{COLUMN=>'info:name',VERSIONS=>3}
删除
- 删除某 rowkey 的全部数据:
deleteall 'test','1001'
- 删除某 rowkey 的某一列数据
delete 'test','1002','info:name'
清空表数据
truncate 'test1'
删除表
- 首先需要先让该表为 disable 状态:
disable 'test1'
- 然后才能 drop 这个表:
drop 'test1'
退出
exit
关闭Hbase
stop-hbase.sh