概述
HBASE
– HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、 实时读写的分布式数据库
– 利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理 HBase中的海量数据,利用Zookeeper作为其分布式协同服务
– 主要用来存储非结构化和半结构化的松散数据(列存NoSQL数据库)
Hbase的架构图如下所示
1、Client
包含访问HBase的接口并维护cache来加快对HBase的访问
2、ZooKeeper
2.1、ZooKeeper 为 HBase 提供 Failover 机制,选举 Master,避免单点 Master 单点故障问题
2.2、存储所有 Region 的寻址入口:-ROOT-表在哪台服务器上。-ROOT-这张表的位置信息
2.3、实时监控 RegionServer 的状态,将 RegionServer 的上线和下线信息实时通知给 Master
2.4、存储 HBase 的 Schema,包括有哪些 Table,每个 Table 有哪些 Column Family
3、Master
3.1、为 RegionServer 分配 Region
3.2、负责 RegionServer 的负载均衡
3.3、发现失效的 RegionServer 并重新分配其上的 Region
3.4、HDFS 上的垃圾文件(HBase)回收
3.5、处理 Schema 更新请求(表的创建,删除,修改,列簇的增加等等)
4、RegionServer
4.1、RegionServer 维护 Master 分配给它的 Region,处理对这些 Region 的 IO 请求
4.2、RegionServer 负责 Split 在运行过程中变得过大的 Region,负责 Compact 操作
5、HRegion
table在行的方向上分隔为多个Region。Region是HBase中分布式存储和负载均衡的最小单元,即不同的region可以分别在不同的Region Server上,但同一个Region是不会拆分到多个server上。
Region按大小分隔,每个表一般是只有一个region。随着数据不断插入表,region不断增大,当region的某个列族达到一个阈值时就会分成两个新的region。
每个region由以下信息标识:< 表名,startRowkey,创建时间>
由目录表(-ROOT-和.META.)记录该region的endRowkey
6、Store
每一个region由一个或多个store组成,至少是一个store,hbase会把一起访问的数据放在一个store里面,即为每个 ColumnFamily建一个store,如果有几个ColumnFamily,也就有几个Store。一个Store由一个memStore和0或者 多个StoreFile组成。 HBase以store的大小来判断是否需要切分region
7、MemStore
memStore 是放在内存里的。保存修改的数据即keyValues。当memStore的大小达到一个阀值(默认128MB)时,memStore会被flush到文 件,即生成一个快照。目前hbase 会有一个线程来负责memStore的flush操作。
8、StoreFile
memStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction),在合并过程中会进行版本合并和删除工作(majar),形成更大的storefile。
9、HFile
HBase中KeyValue数据的存储格式,HFile是Hadoop的 二进制格式文件,实际上StoreFile就是对Hfile做了轻量级包装,即StoreFile底层就是HFile。
10、HLog
HLog(WAL log):WAL意为write ahead log,用来做灾难恢复使用,HLog记录数据的所有变更,一旦region server 宕机,就可以从log中进行恢复。
HLog文件就是一个普通的Hadoop Sequence File, Sequence File的value是key时HLogKey对象,其中记录了写入数据的归属信息,除了table和region名字外,还同时包括sequence number和timestamp,timestamp是写入时间,sequence number的起始值为0,或者是最近一次存入文件系统中的sequence number。 Sequence File的value是HBase的KeyValue对象,即对应HFile中的KeyValue。
zookeeper
分布、开源的应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态,根据节点的反馈进行下一步合理操作。主要解决分布式应用经常遇到的数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等
基本架构
1 每个Server在内存中存储了一份数据;
2 Zookeeper启动时,将从实例中选举一个leader(Paxos协议);
3 Leader负责处理数据更新等操作(Zab协议);
4 一个更新操作成功,当且仅当大多数Server在内存中成功修改
数据。
hadoop
Hadoop是一个由Apache基金会所开发的分布式系统基础架构,包括HDFS(分布式文件系统),YARN(分布式资源调度系统),MapReduce(分布式计算系统),等等。
Namenode 和 Datanode
HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。
Namenode和Datanode被设计成可以在普通的商用机器上运行。这些机器一般运行着GNU/Linux操作系统(OS)。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。由于采用了可移植性极强的Java语言,使得HDFS可以部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其它机器分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的情况比较少见。
集群中单一Namenode的结构大大简化了系统的架构。Namenode是所有HDFS元数据的仲裁者和管理者,这样,用户数据永远不会流过Namenode。
block
一般用户数据存储在HDFS文件。在一个文件系统中的文件将被划分为一个或多个段和/或存储在个人数据的节点。这些文件段被称为块。换句话说,数据的HDFS可以读取或写入的最小量被称为一个块。缺省的块大小为64MB,但它可以增加按需要在HDFS配置来改变
准备
三个节点:
操作系统:centos
ip:
master:192.168.122.130
node1:192.168.122.104
node2:192.168.122.216
在每台机器上上配置hosts文件,如下:
cat /etc/hosts
192.168.122.130 master
192.168.122.104 node1
192.168.122.216 node2
配置免密登录:
在master节点执行:
ssh-keygen
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh-copy-id node1
ssh-copy-id node2
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
部署zookeeper集群
三台机器都安装jdk,本次实验直接使用yum安装,也可以去下载jdk包进行安装。
yum -y install java java-devel
[root@master ~]# java -version
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)
安装部署zookeeper:
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -xvf zookeeper-3.4.14.tar.gz
cd zookeeper-3.4.14
cp conf/zoo_sample.cfg conf/zoo.cfg
编辑conf/zoo.cfg文件,更改添加如下内容:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/data
dataLogDir=/opt/zookeeper/log
# zookeeper cluster,2888为选举端口,3888为心跳端口
server.1=master:2888:3888
server.2=node1:2888:3888
server.3=node2:2888:3888
tickTime:心跳时间间隔,毫秒
initLimit: 集群中连接到leader的Follower服务器,初始化连接是最长能忍受多少个心跳的时间间隔数
syncLimit: leader与follower之间发送消息,请求和应答时间长度 (5*2000)
将zookeeper的安装包复制到其他节点
scp -r zookeeper-3.4.14 node1:/root/
scp -r zookeeper-3.4.14 node2:/root/
创建data和log目录:
mkdir -p /opt/zookeeper/data
mkdir /opt/zookeeper/log
在data目录中,创建myid文件,标识当前主机。在三台主机中分别执行,数字为1、2、3,如下所示
echo "1" >/opt/zookeeper/data/myid
配置环境变量,编辑~/.bashrc文件,添加如下内容:
export ZOOKEEPER_HOME=/root/zookeeper-3.4.14
export PATH=$ZOOKEEPER_HOME/bin:$PATH
sourc ~/.bashrc
启动zookeeper服务,分别在三台机器上执行如下命令:
[root@master ~]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
启动成功,查看当前节点的状态,包括leader、follower属性:
[root@master ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower
jps可查看zk的进程:
[root@node1 bin]# jps
11496 QuorumPeerMain
11566 Jps
部署hadoop集群
安装部署hadoop
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz
cd hadoop-3.1.3
配置Hadoop:主要需要修改6个配置文件:hadoop-env.sh、workers、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
1.修改hadoop-env.sh指定JAVA_HOME
[root@master hadoop-3.1.3]# vim etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr
2.配置文件core-site.xml
这个是hadoop的核心配置文件,这里需要配置的就这两个属性,fs.default.name配置了hadoop的HDFS系统的命名,位置为主机的9000端口;
hadoop.tmp.dir配置了hadoop的tmp目录的根位置。这里使用了一个文件系统中没有的位置,所以要先用mkdir命令新建一下。
[root@master hadoop-3.1.3]# vim etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name> <!--NameNode 的URI-->
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name> <!--hadoop临时文件的存放目录-->
<value>file:/root/hadoop-3.1.3/tmp</value>
</property>
</configuration>
3.配置文件hdfs-site.xml
这个是hdfs的配置文件,dfs.http.address配置了hdfs的http的访问位置;
dfs.replication配置了文件块的副本数,一般不大于从机的个数
vim etc/hadoop/hdfs-site.xml
<configuration>
<property> <!--Namenode持久存储名字空间及事务日志的本地文件系统路径-->
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/dfs/data</value> <!--目录无需预先创建,会自动创建-->
</property>
<property> <!--DataNode存放块数据的本地文件系统路径-->
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop/dfs/data</value>
</property>
<property> <!--数据需要备份的数量,不能大于集群的机器数量-->
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
<property> <!--设置为true,可以在浏览器中IP+port查看-->
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
4.配置文件mapred-site.xml
这个是mapreduce任务的配置,由于hadoop2.x使用了yarn框架,所以要实现分布式部署,必须在mapreduce.framework.name属性下配置为yarn。mapred.map.tasks和mapred.reduce.tasks分别为map和reduce的任务数,同时指定:Hadoop的历史服务器historyserver,Hadoop自带了一个历史服务器,可以通过历史服务器查看已经运行完的Mapreduce作业记录,比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息。默认情况下,Hadoop历史服务器是没有启动的,我们可以通过下面的命令来启动Hadoop历史服务器
$ /root/hadoop-3.1.3/sbin/mr-jobhistory-daemon.sh start historyserver
这样我们就可以在相应机器的19888端口上打开历史服务器的WEB UI界面。可以查看已经运行完的作业情况。
vim etc/hadoop/mapred-site.xml
<configuration>
<property> <!--mapreduce运用了yarn框架,设置name为yarn-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property> <!--历史服务器,查看Mapreduce作业记录-->
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property> <!--历史服务器的web地址-->
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
5.配置节点yarn-site.xml
该文件为yarn框架的配置,主要是一些任务的启动位置
vim etc/hadoop/yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property> <!--NodeManager上运行的附属服务,用于运行mapreduce-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property> <!--ResourceManager 对客户端暴露的地址-->
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property> <!--ResourceManager 对ApplicationMaster暴露的地址-->
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property> <!--ResourceManager 对NodeManager暴露的地址-->
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property> <!--ResourceManager 对管理员暴露的地址-->
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property> <!--ResourceManager 对外web暴露的地址,可在浏览器查看-->
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>
6.编辑datanode节点
vim etc/hadoop/workers
node1
node2
格式挂HDFS
hdfs namenode -format
设置用户,因为实验使用的是root用户所以设置如下:
export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_SECONDARYNAMENODE_USER="root"
export YARN_RESOURCEMANAGER_USER="root"
export YARN_NODEMANAGER_USER="root"
启动服务
mr-jobhistory-daemon.sh start historyserver ##如果需要可以通过此命令启动历史服务器
start-dfs.sh ##启动hdfs
start-yarn.sh ##启动yarn
或者可以直接执行start-all.sh
启动成功后会看到相应进程
master
[root@master hadoop-3.1.3]# jps
16928 SecondaryNameNode
17617 JobHistoryServer
16658 NameNode
17682 Jps
17204 ResourceManager
11627 QuorumPeerMain
node
root@node1 ~]# jps
14129 Jps
14003 NodeManager
11496 QuorumPeerMain
13902 DataNode
安装部署hbase
wget http://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.1.7/hbase-2.1.7-bin.tar.gz
tar -xvf hbase-2.1.7-bin.tar.gz
cd hbase-2.1.7
1.添加环境变量 vim ~/.bashrc
export HBASE_HOME=/root/hbase-2.1.7
export PATH=$HBASE_HOME/bin:$PATH
2.编辑文件 vim conf/hbase-env.sh
export JAVA_HOME=/usr ## 根据环境更改java_home
export HBASE_MANAGES_ZK=false ##不使用hbase自带的zookeeper
3.配置hbase-site.xml文件
vim conf/base-site.xml
<configuration>
<property>
<name>hbase.rootdir</name> <!-- hbase存放数据目录 -->
<value>hdfs://master:9000/opt/hbase/hbase_db</value> <!-- 端口要和Hadoop的fs.defaultFS端口一致-->
</property>
<property>
<name>hbase.cluster.distributed</name> <!-- 是否分布式部署 -->
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name> <!-- list of zookooper -->
<value>master:2181,node1:2181,node2:2181</value>
</property>
<property> <!--指定master节点-->
<name>hbase.master</name>
<value>master:60000</value>
</property>
<property><!--zookooper配置、日志等的存储位置 -->
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/hbase/zookeeper</value>
</property>
</configuration>
4.配置regionservers
vim conf/regionservers
node1
node2
5.将配置好的文件复制到node节点
scp -r hbase-2.1.7 node1:/root
scp -r hbase-2.1.7 node2:/root
启动服务
start-hbase.sh
错误记录:
本次实验为初次部署,遇到版本不兼容的问题。可以根据具体的问题替换相应的jar包。
在部署hbase时候,regionserver节点出现 “java.lang.NoClassDefFoundError: com/ctc/wstx/io/InputBootstrapper” 错误。原因是在替换jar包时出错,导致引入的jar包不全。
Hbase简单操作
1、进入HBase客户端命令操作界面
$ bin/hbase shell
2、查看当前数据库中有哪些表
hbase(main):001:0> list
3、创建一张表( create ‘表名’,‘列祖名’ )
hbase(main):002:0> create ‘test’,‘info’
4、向表中存储一些数据( put ‘表名’,‘ROWKEY’,‘列族名:列名’,‘值’ )
hbase(main):003:0> put ‘test’,‘100’,‘info:test1’,‘game’
hbase(main):004:0> put ‘test’,‘100’,‘info:test2’,‘play’
5、扫描查看存储的数据
hbase(main):005:0> scan ‘test’
hbase(main):005:0> scan 'test'
ROW COLUMN+CELL
100 column=info:test1, timestamp=1574694449357, value=game
100 column=info:test2, timestamp=1574694457129, value=play
1 row(s)
Took 0.0276 seconds
6、查看表结构
hbase(main):006:0> describe ‘student’
参考:
https://www.cnblogs.com/lxbmaomao/p/9387659.html
http://www.mamicode.com/info-detail-2354995.html
https://www.cnblogs.com/jokerq/p/10206287.html
https://www.cnblogs.com/raphael5200/p/5229164.html
https://www.cnblogs.com/arjenlee/articles/9224366.html
http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html