我的HBase分布式环境搭建过程
Hadoop集群架构简介Hadoop框架中最核心设计就是:HDFS和MapReduce,HDFS提供了海量数据的存储,MapReduce提供了对数据的计算,它是HBase列式数据库的基础。
HDFS:Hadoop Distributed File System,Hadoop的分布式文件系统,大文件被分成默认64M一块的数据块,分布存储在集群机器中。
MapReduce:Hadoop为每一个input split创建一个task调用Map计算,在此task中依次处理此split中的一个个记录(record),map会将结果以key/value的形式输出,hadoop负责按key值将map的输出整理后作为Reduce的输入,Reduce Task的输出为整个job的输出,保存在HDFS上。
Hadoop的集群主要由NameNode、DataNode、Secondary NameNode、JobTracker、TaskTracker组成。
NameNode中记录了文件是如何被拆分成block以及这些block都存储到了那些DateNode节点。
NameNode同时保存了文件系统运行的状态信息。
DataNode中存储的是被拆分的blocks。
Secondary NameNode帮助NameNode收集文件系统运行的状态信息。
JobTracker当有任务提交到Hadoop集群的时候负责Job的运行,负责调度多个TaskTracker。
TaskTracker负责某一个map或者reduce任务。
在Hadoop集群架构中,服务器依据用途可分成Master节点和Worker节点,Master负责分配任务,而Worker负责执行任务。Master节点中含有JobTracker、NameNode、TaskTracker和DataNode程序;Worker节点含有TaskTracker和DataNode。另外在系统的架构上,最简单的Hadoop架构,可以分成上层的MapReduce运算层以及下层的HDFS数据层。
在Master节点的服务器中会执行两套程序:一个是负责安排MapReduce运算层任务的JobTracker,以及负责管理HDFS数据层的NameNode程序。而在Worker节点的服务器中也有两套程序,接受JobTracker指挥,负责执行运算层任务的是TaskTracker程序,与NameNode对应的则是DataNode程序,负责执行数据读写操作以及执行NameNode的副本策略。
在MapReduce运算层上,担任Master节点的服务器负责分配运算任务,Master节点上的JobTracker程序会将Map和Reduce程序的执行工作指派给Worker服务器上的TaskTracker程序,由TaskTracker负责执行Map和Reduce工作,并将运算结果回复给Master节点上的JobTracker。
在HDFS数据层上,NameNode负责管理和维护HDFS的名称空间、并且控制档案的任何读写动作,同时NameNode会将要处理的数据切割成一个个档案区块(Block),每个区块是64MB,例如1GB的数据就会切割成16个档案区块。NameNode还会决定每一份档案区块要建立多少个副本,一般来说,一个档案区块总共会复制成3份,并且会分散储存到3个不同Worker服务器的DataNode程序中管理,只要其中任何一份档案区块遗失或损坏,NameNode会自动寻找位于其他DataNode上的副本来回复,维持3份的副本策略。
在一套Hadoop集群中,分配MapReduce任务的JobTracker只有1个,而TaskTracker可以有很多个。同样地,负责管理HDFS文件系统的NameNode也只有一个,和JobTracker同样位于Master节点中,而DataNode可以有很多个。不过Master节点中除了有JobTracker和NameNode以外,也会有TaskTracker和DataNode程序,也就是说Master节点的服务器也可以在本地端扮演Worker角色的工作。
在部署上,因为Hadoop采用Java开发,所以Master服务器除了安装操作系统如Linux之外,还要安装Java执行环境,然后再安装Master需要的程序,包括了NameNode、JobTracker和DataNode与TaskTracker。而在Worker服务器上,则只需安装Linux、Java环境、DataNode和TaskTracker。
HBase简介
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用 Chubby作为协同服务,HBase利用Zookeeper作为对应。
Hadoop HDFS为HBase提供了高可靠性的底层存储支持,Hadoop MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和failover机制。此外,Pig和Hive还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变的非常简单。Sqoop则为HBase提供了方便的RDBMS数据导入功能,使得传统数据库数据向HBase中迁移变的非常方便。
HBase访问接口
1. Native Java API,最常规和高效的访问方式,适合Hadoop MapReduce Job并行批处理HBase表数据
2.HBase Shell,HBase的命令行工具,最简单的接口,适合HBase管理使用
3.Thrift Gateway,利用Thrift序列化技术,支持C++,PHP,Python等多种语言,适合其他异构系统在线访问HBase表数据
4.REST Gateway,支持REST 风格的Http API访问HBase, 解除了语言限制
5.Pig,可以使用Pig Latin流式编程语言来操作HBase中的数据,和Hive类似,本质最终也是编译成MapReduce Job来处理HBase表数据,适合做数据统计
6.Hive,当前Hive的Release版本尚没有加入对HBase的支持,但在下一个版本Hive 0.7.0中将会支持HBase,可以使用类似SQL语言来访问HBase
HBase数据模型
Table & Column Family
Row Key: 行键,Table的主键,Table中的记录按照Row Key排序
Timestamp: 时间戳,每次数据操作对应的时间戳,可以看作是数据的version number
Column Family:列簇,Table在水平方向有一个或者多个Column Family组成,一个Column Family中可以由任意多个Column组成,即Column Family支持动态扩展,无需预先定义Column的数量以及类型,所有Column均以二进制格式存储,用户需要自行进行类型转换。
Table & Region
当Table随着记录数不断增加而变大后,会逐渐分裂成多份splits,成为regions,一个region由[startkey,endkey)表示,不同的region会被Master分配给相应的RegionServer进行管理:
-ROOT- && .META. Table
HBase中有两张特殊的Table,-ROOT-和.META.
.META.:记录了用户表的Region信息,.META.可以有多个regoin
-ROOT-:记录了.META.表的Region信息,-ROOT-只有一个region
Zookeeper中记录了-ROOT-表的location
Client访问用户数据之前需要首先访问zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问,中间需要多次网络操作,不过client端会做cache缓存。
MapReduce on HBase
在HBase系统上运行批处理运算,最方便和实用的模型依然是MapReduce。
HBase Table和Region的关系,比较类似HDFS File和Block的关系,HBase提供了配套的TableInputFormat和TableOutputFormat API,可以方便的将HBase Table作为Hadoop MapReduce的Source和Sink,对于MapReduce Job应用开发人员来说,基本不需要关注HBase系统自身的细节。
HBase系统架构
Client
HBase Client使用HBase的RPC机制与HMaster和HRegionServer进行通信,对于管理类操作,Client与HMaster进行RPC;对于数据读写类操作,Client与HRegionServer进行RPC。
Zookeeper
Zookeeper Quorum中除了存储了-ROOT-表的地址和HMaster的地址,HRegionServer也会把自己以Ephemeral方式注册到Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的健康状态。此外,Zookeeper也避免了HMaster的单点问题,见下文描述。
HMaster
HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行,HMaster在功能上主要负责Table和Region的管理工作:
1.管理用户对Table的增、删、改、查操作
2.管理HRegionServer的负载均衡,调整Region分布
3.在Region Split后,负责新Region的分配
4.在HRegionServer停机后,负责失效HRegionServer 上的Regions迁移
HRegionServer
HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。
HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。每个HStore对应了Table中的一个Column Family的存储,可以看出每个Column Family其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个Column Family中,这样最高效。
HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer,用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile),当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除,因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的compact过程中进行的,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBase I/O的高性能。当StoreFiles Compact后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前Region Split成2个Region,父Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。
在理解了上述HStore的基本原理后,还必须了解一下HLog的功能,因为上述的HStore在系统正常工作的前提下是没有问题的,但是在分布式系统环境中,无法避免系统出错或者宕机,因此一旦HRegionServer意外退出,MemStore中的内存数据将会丢失,这就需要引入HLog了。每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取 到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。
HBase存储格式
HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,主要包括上述提出的两种文件类型:
1.HFile, HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile
2.HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File
HFile
下面是HFile的存储格式:
首先HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。Trailer中有指针指向其他数据块的起始点。File Info中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等,Data Index和Meta Index块记录了每个Data块和Meta块的起始点。
Data Block是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的Block Cache机制。每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询。每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏。后面会详细介绍每个KeyValue对的内部构造。
HFile里面的每个KeyValue对就是一个简单的byte数组,但是这个byte数组里面包含了很多项,并且有固定的结构。我们来看看里面的具体结构:
开始是两个固定长度的数值,分别表示Key的长度和Value的长度。紧接着是Key,开始是固定长度的数值,表示RowKey的长度,紧接着是RowKey,然后是固定长度的数值,表示Family的长度,然后是Family,接着是Qualifier,然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)。Value部分没有这么复杂的结构,就是纯粹的二进制数据了。
HLogFile
其实HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。
HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue,可参见上文描述。
结束
上文对HBase技术在功能和设计上进行了大致的介绍,由于篇幅有限,本文没有过多深入地描述HBase的一些细节技术,下文将介绍笔者的部署经验。
下面就是我的安装配置过程:
基本环境:Debian 7 x64 openjdk7
cdh5官方的hadoop及base
安装目的:学习hbase数据库,对比与mysql及postgresql在一些大量数据计算上的方式方法。由于没有java编程背景,所有mapreduce便无缘涉及了。仅是把它当成一种数据库的学习掌握了。
htcom:master节点,实体宿主机
xd0-2:虚拟机,datanode节点及RegionServer等相关服务
----------------------hdfs环境配置--------------------------------
一、配置环境变量:
下载jdk,安装它。接下来配置环境变量:
vim /etc/profile/hadoop.sh
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/:$JRE_HOME/lib/
export HBASE_HOME=/usr/local/hbase
export PATH=$HBASE_HOME/bin:$PATH
export HBASE_MANAGES_ZK=true
export HADOOP_PREFIX=/usr/local/hadoop
export HADOOP_HOME=/home/hadoop
export PATH=$PATH:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin
export HADOOP_COMMON_HOME=${HADOOP_PREFIX}
export HADOOP_HDFS_HOME=${HADOOP_PREFIX}
export HADOOP_MAPRED_HOME=${HADOOP_PREFIX}
export HADOOP_YARN_HOME=${HADOOP_PREFIX}
配置完成后,重新登录或执行source指令使其生效。
命令:
source /etc/profile/hadoop.sh
在相关机器的hosts文件中加入对应的ip和主机名:
more /etc/hosts
127.0.0.1 localhost
192.168.0.9 htcom
192.168.0.80 xd0
192.168.0.81 xd1
192.168.0.82 xd2
192.168.0.83 xd3
二、配置auto-ssh-login的登录方式:ssh自动登录配置
需要注意的是,也要为本机建立自动登录。
三、下载hadoop包,解压到/usr/local下,改名为hadoop
在每台机器创建支行的用户
useradd -c 'hadoop big data' -m -g daemon -r -u 1028 -s /bin/bash hadoop
在主节点上创建对应的目录及权限
chown -R hadoop /usr/local/hadoop
passwd hadoop
su - hadoop
mkdir /usr/local/hadoop/tmp
mkdir /usr/local/hadoop/dfs
mkdir -p /usr/local/hadoop/dfs/namesecondary
mkdir -p /usr/local/hadoop/dfs/datanode
mkdir -p /usr/local/hadoop/dfs/namenode
四、hadoop配置:/usr/local/hadoop/etc/hadoop
1、vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://htcom:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<property>
<!--<name>hadoop.native.lib</name>-->
<name>io.native.lib.available</name>
<value>true</value>
<description>Should native hadoop libraries, if present, be used.</description>
</property>
</configuration>
2、vim hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/dfs/namenode</value>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/dfs/datanode</value>
</property>
<property>
<name>dfs.http.address</name>
<value>htcom:50070</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>xd0:50090</value>
</property>
<property>
<name>fs.checkpoint.dir</name>
<value>file:/usr/local/hadoop/dfs/namesecondary</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
<description>
Enable WebHDFS (REST API) in Namenodes and Datanodes.
</description>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
<description>
If "true", enable permission checking in HDFS. If "false", permission
checking is turned off, but all other behavior is unchanged. Switching
from one parameter value to the other does not change the mode,
owner or group of files or directories.
</description>
</property>
<property>
<name>dfs.datanode.handler.count</name>
<value>100</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>30</value>
</property>
<property>
<name>dfs.block.size</name>
<value>1073741824</value>
</property>
</configuration>
3、指定master(namenode)节点(主机名)
vim masters
htcom
4、指定datanode节点
vim slaves
xd0
xd1
xd2
五、将配置好的hadoop同步到其他机器
for i in {80..82};do rsync -av --del /usr/local/hadoop/ 192.168.0.$i:/usr/local/hadoop/;done
for i in {80..82};do rsync -av /usr/local/hbase/ 192.168.0.$i:/usr/local/hbase/;done
当再次修改配置后的同步:
for i in {80..82};do rsync -av /usr/local/hadoop/etc/ 192.168.0.$i:/usr/local/hadoop/etc/;done
for i in {80..82};do rsync -av --exclude=zookeeper/ --exclude=logs/ /usr/local/hbase/ 192.168.0.$i:/usr/local/hbase/;done
六、dfs格式化:只在master上做就可以了。
bin/hdfs namenode -format
七、启动 :
先启hadoop的hdfs
sbin/start-dfs.sh
八、查看hdfs集群状态
bin/hdfs dfsadmin -report
也可通过主节点的50070端口查看hadoop运行状态:
http://htcom:50070/
-------------------
至此,hadoop的hdfs就算是基本完成了,下面来配置hbase,同样的下载到主节点上,配置完成后复制分发到各个相关节点上。这里没有配置独立的zookeeper,而是用的hbase中自带的zk进行管理。
-------------------
----------------------hbase环境配置--------------------------------
1、hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://htcom:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>htcom:60000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>htcom,xd0,xd1</value>
</property>
<property>
<name>hbase.regionserver.handler.count</name>
<value>100</value>
</property>
<!--
<property>
<name>hbase.hregion.max.filesize</name>
<value>20480</value>
</property>
<property>
<name>hfile.block.cache.size</name>
<value>0.36</value>
</property>
-->
<property>
<name>dfs.socket.timeout</name>
<value>18000</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/hbase/zookeeper</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hbase/tmp</value>
</property>
<property>
<name>hbase.rpc.timeout</name>
<value>18000</value>
</property>
<property>
<name>hbase.zookeeper.property.maxClientCnxns</name>
<value>1500</value>
</property>
</configuration>
2、指定regionservers
vim regionservers
xd0
xd1
xd2
一些老版本中还要指定zookeeper的编号id,新的版本不用设置,它们是自动管理。
hadoop@htcom:/usr/local/hbase$ more zookeeper/myid
0
配置完成参考上述的方法将代码复制到对应的region servers上。
开启:在主节点htcom上(/usr/local/hbase目录下):
bin/start-hbase.sh
也可通过主节点的60010端口查看hbase运行状态:
http://htcom:60010/
另外也可通过'jps'指令来查看对应的java进程组,下面这个是xd0主机的:
hadoop@xd0:~$ jps
5391 SecondaryNameNode
6775 Jps
5556 HRegionServer
5209 DataNode
5472 HQuorumPeer
--------------------------------------------------------------------
开启HBase Rest接口(主节点上)
bash /usr/local/hbase/bin/hbase-daemon.sh start rest -p 8000
--------------------------------------------------------------------
一些常用的shell命令
名称 命令表达式
创建表 create '表名称', '列名称1','列名称2','列名称N'
添加记录 put '表名称', '行名称', '列名称:', '值'
查看记录 get '表名称', '行名称'
查看表中的记录总数 count '表名称'
删除记录 delete '表名' ,'行名称' , '列名称'
删除一张表 先要屏蔽该表,才能对该表进行删除,第一步 disable '表名称' 第二步 drop '表名称'
查看所有记录 scan "表名称"
查看某个表某个列中所有数据 scan "表名称" , ['列名称:']
get 'test', 'row1'
get 'page_freeoa','014336909385691366'
get 'page_freeoa' {COLUMN => 'cf:title'}
get 'databytype' 'wb'
scan 'freeoarticle2', {COLUMNS => ['cf:issue_dt','cf:title'],LIMIT => 7, STARTROW => '20120518120601639'}
scan 'check_url_repetition', { LIMIT => 10}
--------------------------------------------------------------------
hbase伪分布式
前提条件是安装好hadoop,hadoop分为单机模式,伪分布式,和完全分布式。
伪分布式是指:一个机器上,即当namenode,又当datanode,或者说即是jobtracker,又是tasktracker。没有所谓的在多台机器上进行真正的分布式计算,故称为"伪分布式"。
分三步:
1.添加环境变量
2.编辑hbase-env.sh文件
3.编辑hbase-site.xml 文件
添加环境变量
export HBASE_HOME=/usr/local/cdh/hbase
export PATH=$PATH:$PIG_HOME/bin:$HADOOP_HOME/bin:$HBASE_HOME/bin:$
编辑hbase-env.sh文件,添加:
export JAVA_HOME=/usr/local/java/jdk1.7.0_67
export HBASE_CLASSPATH=/usr/local/hadoop/etc/hadoop
3.编辑hbase-site.xml 文件
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://cent:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
</configuration>
4.启动
bin/start-hbase.sh
[root@cent hbase]# jps
7100 ResourceManager
7800 HMaster
6894 SecondaryNameNode
7745 HQuorumPeer
6729 DataNode
6631 NameNode
8158 Jps
7204 NodeManager
7932 HRegionServer
Hadoop中单机模式与伪分布式有什么不同
单机(非分布式)模式
这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统。
伪分布式运行模式
这种模式也是在一台单机上运行,但用不同的Java进程模仿分布式运行中的各类结点(NameNode,DataNode,JobTracker,TaskTracker,SecondaryNameNode),请注意分布式运行中的这几个结点的区别:从分布式存储的角度来说,集群中的结点由一个NameNode和若干个DataNode组成,另有一个SecondaryNameNode作为NameNode的备份。从分布式应用的角度来说,集群中的结点由一个JobTracker和若干个TaskTracker组成,JobTracker负责任务的调度,TaskTracker负责并行执行任务。TaskTracker必须运行在DataNode上,这样便于数据的本地计算。JobTracker和NameNode则无须在同一台机器上。
--------------------------------------------------------------------