HBase - Hadoop Database
hbase的设计思想来自于google的bigtable
主键:Row Key
主键是用来检索记录的主键,访问Hbase table 中的行,只有三种方式
- 通过单个Row Key 访问
- 通过Row Key 的range
- 全表扫描
列族:Column Family
列族在创建表的时候声明,一个列族可以包含多个列,列中的数据都是以二进制形式存在,没有数据类型
时间戳:Timestamp
Hbase中通过row和columns确定的为一个存储单元称为cell,每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引
查询记录时,不指定版本默认查询最新版本。
搭建distributed clusted & HA 步骤:
目前集群情况:
7台机器:hadoop-server01 ~ hadoop-server07
NameNode:1,2有, 对外提供hdfs://ns1抽象路径,通过Zookeeper来控制Active以及standby节点
DFSZKFailoverController(zkfc):用作监控NameNode节点,定时向Zookeeper汇报健康情况,所以只有1,2有
DataNode:7台都有
NodeManager:7台都有
ResourceManager:3,4有
QuorumPeerMain:Zookpeeper进程,5,6,7有
JournalNode:共享NameNode的edits数据,也是5,6,7有
待会hbase要实现的目标:
1做HMaster(active),2和3做为HMaster(Backup),同时7台机器上都跑HRegionServer,实现HMaster(active)节点宕机后,自动通过Zookeeper实现切换
1.把机器上hadoop的配置文件(core-site.xml,hdfs-site.xml)拷贝到hbase的conf下面,这样如果HDFS本身是基于NameNode二次抽象成的NameServices就不需要再配置了,也可以不用拷贝。直接把配置再写一遍也可以.
2.修改hbase-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_55
//告诉hbase使用外部的zk
export HBASE_MANAGES_ZK=false
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>hadoop-server05:2181,hadoop-server06:2181,hadoop-server07:2181</value>
</property>
</configuration>
vim regionservers
hadoop-server01
hadoop-server02
hadoop-server03
hadoop-server04
hadoop-server05
hadoop-server06
hadoop-server07
3.复制到其他节点(这里我用了自定义脚本)
cd ~/app
scp_hadoop_many hbase/ $PWD
如果没有批量自动化脚本,也可以分别使用scp拷贝。
4.启动HDFS和Zookeeper,Hbase
分别在5,6,7机器上启动Zookeeper
zkServer.sh start
启动hdfs集群
start-dfs.sh
启动Hbase集群 (在1机器上启动)
start-hbase.sh
为了HA,我在2,3也启动了hbase Master
hbase-daemon.sh start master
现在就可以访问机器的60010查看hbase状态了。
可以看到7个节点,并且有2个backup master
访问:60010/zk.jsp 可以查看Zookeeper Dump
附注:
1.脚本 scp_hadoop_many
#!/bin/bash
if [ $# -ne 2 ]then
echo "usage:<sourceFile> <targetFile>"
exit 1
fi
ips=(hadoop-server02 hadoop-server03 hadoop-server04 hadoop-server05 hadoop-server06 hadoop-server07)
for ip in ${ips[*]}
do
scp -r $1 [email protected]$ip:$2
done
附注:
1.脚本 scp_hadoop_many
#!/bin/bash
if [ $# -ne 2 ]then
echo "usage:<sourceFile> <targetFile>"
exit 1
fi
ips=(hadoop-server02 hadoop-server03 hadoop-server04 hadoop-server05 hadoop-server06 hadoop-server07)
for ip in ${ips[*]}
do
scp -r $1 [email protected]$ip:$2
done