Hbase安装笔记

HBase简介
HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用 Chubby作为协同服务,HBase利用Zookeeper作为对应。
 
上图描述了Hadoop EcoSystem中的各层系统,其中HBase位于结构化存储层(列式存储),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 Timestamp Column Family
URI Parser
r1 t3 url=http://www.taobao.com title=天天特价
t2 host=taobao.com 
t1  
r2 t5 url=http://www.alibaba.com content=每天…
t4 host=alibaba.com 
Ø   Row Key : 行键, Table的主键 ,Table中的记录按照Row Key的字典序排列
Ø   Timestamp : 时间戳,每次数据操作对应的时间戳,可以看作是数据的version number
Ø   Column Family :列簇,Table在水平方向有一个或者多个Column Family组成,一个Column Family中可以由任意多个Column组成,即Column Family支持动态扩展,无需预先定义Column的数量以及类型,所有Column均以二进制格式存储,用户需要自行进行类型转换。
Rowkey可以使是任意字符串(最大长度 64k ),访问 HBase table 的行只有三种方式:
1,  通过单个 rowkey 访问
2,  通过 rowkey range
3,  全表扫描
通过 row column 确定的存储单元为一个 Cell ,每个 Cell 中不同版本的数据按照时间倒序排序,最新的数据会排在最前面。
Table & Region
当Table随着记录数不断增加而变大后,会逐渐分裂成多份splits,成为regions,一个region由[startkey,endkey)表示,不同的region会被Master分配给相应的RegionServer进行管理:
 
 
Table  在行的方向上分割为多个 Hregion 每个表一开始只有一个region ,随着数据不断插入表, region 不断增大,当增大到一个阀值的时候, Hregion 就会等分会两个新的 Hregion 。当 table 中的行不断增多,就会有越来越多的 Hregion
R egion Hbase 中分布式存储和负载均衡的最小单元。最小单元就表示不同的R egion 可以分布在不同的 Region server 上,但同 一个 R egion 内的数据只会存储在一个服务器上
 
-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缓存。
 
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
 
Data Block段:保存表中的数据,这部分可以被压缩
Meta Block段(可选):保存用户自定义的 key-value 对,可以被压缩
File Info段, HFile 的元信息,不被压缩,用户可以在这部分添加自己的元信息
Data Block Index段: Data Block 的索引。
Meta Block Index段(可选): Meta Block 的索引
Trailer:保存每一段的偏移量。
读取一个 HFile 时,会首先读取 Trailer Trailer 保存了每个段的起始位置,然后 DataBlockIndex 会被读取到内存中,当检索某个 key 时,不需要扫描整个 HFile ,只需从内存中找到 key 所在的 block ,通过一次磁盘 io 将整个 block 读取到内存中,再找到需要的 key
每个 Region 由一个或多个 Store 组成,每个 Store 保存一个列族的所有数据,而每个 Store 又是由一个 MemStore 和零个或多个 StoreFile 组成, StoreFile 是以 HFile 的格式存储在 HDFS 上的。
当客户端进行更新操作时,会连接有关的 HRegionServer ,然后向 Region 提交变更。提交的数据会先写入 WAL MemStore 中,当 MemStore 中的数据累计到某个阈值时, HRegionServer 会启动一个单独的线程将 MemStore 中的内容刷新到磁盘形成一个 StoreFile 。当 StoreFile 文件的数量增长到一定阈值后,就会将多个 StoreFiles 合并成一个 StoreFile ,合并国政中会进行版本合并和数据删除(可以看出 HBase 其实只有增加数据,所有的更新和删除操作都是后续的合并过程中进行的)。当 StoreFile 大小超过一定阈值后,会把当前的 Region 分割成两个 Regions ,并由 HMaster 分配到相应的 Region 服务器上,实现负载均衡。
HLog
 
HLog用来作灾难备份,使用的是 WAL write-ahead log ,预写式日志(先写入日志,再进行操作))。 HLog 记录数据的所有变更,一旦数据修改,就可以从 log 中进行恢复。
每个 Region Server 只维护一个 HLog (不是每个 Region 一个),这样来自不同 Region (不同表)的日志会混在一起。这样做的目的是不断追加单个文件相对于同时写多个文件而言,可以减少磁盘寻址次数,可以提高对表的写性能。 带来的麻烦是,如果一台 Region 服务器下线,为了恢复其上的 Region ,需要将 Region 服务器上的 Log 进行拆分,然后分发到其他 Region 服务器上进行恢复。
上图中示意了HLog文件的结构,其实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系统架构
 
Client
HBase Client使用HBase的RPC机制与HMaster和HRegionServer进行通信,对于管理类操作,Client与HMaster进行RPC;对于数据读写类操作,Client与HRegionServer进行RPC。
ps RPC(Remote Procedure Call ,远程过程调用 ) 是建立在 Socket 之上的 , 出于一种类比的愿望 , 在一台机器上运行的主程序 , 可以调用另一台机器上准备好的子程序 ,
Zookeeper
Zookeeper Quorum中除了存储了-ROOT-表的地址和HMaster的地址,HRegionServer也会把自己以Ephemeral方式注册到 Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的健康状态。此外,Zookeeper也避免了HMaster的 单点问题。
HMaster
HBase每个时刻只有一个HMaster(主服务器)在运行,HMaster将Region分配给Region服务器,协调Region服务器的负载并维护集群的状态。
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中最核心的模块。
 
 
关于zookeeper:
1 zookeeper hbase 必不可少的,它提供了分布式系统当中的高效协调服务。
2 hbase 内置了 zookeeper ,但效果一般不好,一般都选择外置独立的 zookeeper
所以先来了解一下zookeeper
Zookeeper 的官网上: ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. 
描述了Zookeeper 主要可以:配置管理,名字服务,提供分布式同步以及集群管理。
配置管理
在我们的应用中除了代码外,还有一些就是各种配置。比如数据库连接等。一般我们都是使用配置文件的方式,在代码中引入这些配置文件。但是当我们只有一种配置,只有一台服务器,并且不经常修改的时候,使用配置文件是一个很好的做法,但是如果我们配置非常多,有很多服务器都需要这个配置,而且还可能是动态的话使用配置文件就不是个好主意了。这个时候往往需要寻找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的都可以获得变更。比如我们可以把配置放在数据库里,然后所有需要配置的服务都去这个数据库读取配置。但是,因为很多服务的正常运行都非常依赖这个配置,所以需要这个集中提供配置服务的服务具备很高的可靠性。一般我们可以用一个集群来提供这个配置服务,但是用集群提升可靠性,那如何保证配置在集群中的一致性呢? 这个时候就需要使用一种实现了一致性协议的服务了。Zookeeper 就是这种服务,它使用 Zab 这种一致性协议来提供一致性。现在有很多开源项目使用 Zookeeper 来维护配置,比如在 HBase 中,客户端就是连接一个 Zookeeper ,获得必要的 HBase 集群的配置信息,然后才可以进一步操作。还有在开源的消息队列 Kafka 中,也使用 Zookeeper 来维护 broker 的信息。在 Alibaba 开源的 SOA 框架 Dubbo 中也广泛的使用 Zookeeper 管理一些配置来实现服务治理。
名字服务
名字服务这个就很好理解了。比如为了通过网络访问一个系统,我们得知道对方的IP 地址,但是 IP 地址对人非常不友好,这个时候我们就需要使用域名来访问。但是计算机是不能是别域名的。怎么办呢?如果我们每台机器里都备有一份域名到 IP 地址的映射,这个倒是能解决一部分问题,但是如果域名对应的 IP 发生变化了又该怎么办呢?于是我们有了 DNS 这个东西。我们只需要访问一个大家熟知的 (known) 的点,它就会告诉你这个域名对应的 IP 是什么。在我们的应用中也会存在很多这类问题,特别是在我们的服务特别多的时候,如果我们在本地保存服务的地址的时候将非常不方便,但是如果我们只需要访问一个大家都熟知的访问点,这里提供统一的入口,那么维护起来将方便得多了。
分布式锁
其实在第一篇文章中已经介绍了Zookeeper 是一个分布式协调服务。这样我们就可以利用 Zookeeper 来协调多个分布式进程之间的活动。比如在一个分布式环境中,为了提高可靠性,我们的集群的每台服务器上都部署着同样的服务。但是,一件事情如果集群中的每个服务器都进行的话,那相互之间就要协调,编程起来将非常复杂。而如果我们只让一个服务进行操作,那又存在单点。通常还有一种做法就是使用分布式锁,在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即 fail over 到另外的服务。这在很多分布式系统中都是这么做,这种设计有一个更好听的名字叫 Leader Election(leader 选举 ) 。比如 HBase Master 就是采用这种机制。但要注意的是分布式锁跟同一个进程的锁还是有区别的,所以使用的时候要比同一个进程里的锁更谨慎的使用。
集群管理
在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其他机器需要感知到这种变化,然后根据这种变化做出对应的决策。比如我们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们要根据现在集群目前的状态来分配存储节点。这个时候我们就需要动态感知到集群目前的状态。还有,比如一个分布式的SOA 架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用某种机制发现现在有哪些节点可以提供该服务 ( 这也称之为服务发现,比如 Alibaba 开源的 SOA 框架 Dubbo 就采用了 Zookeeper 作为服务发现的底层机制 ) 。还有开源的 Kafka 队列就采用了 Zookeeper 作为 Cosnumer 的上下线管理。
 
部署 Zookeeper
1 )在官方网站下载安装包 zookeeper-3.4.6.tar.gz
2 )在当前用户目录 hadoop 目录下新建 Zookeeper 目录用来存放 zookeeper-3.4.6.tar.gz ,解压。
3 vim /etc/profile
创建一个环境变量ZOOKEEPER并把该环境变量添加到系统路径:
在export PATH语句前添加两行:
ZOOKEEPER=~/ Zookeeper /zookeeper-3.4.6/
PATH=$PATH:$ZOOKEEPER/bin
export PATH
执行 source /etc/profile
4 配置文件存放在$ZOOKEEPER/conf/ 目录下,将 zoo_sample.cfd 文件名称改为 zoo.cfg,   配置内容如下:
# The number of milliseconds of each tick
tickTime =2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit =10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit =5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir =/home/hadoop/Zookeeper/zookeeper-3.4.6/data
dataLogDir =/home/hadoop/Zookeeper/zookeeper-3.4.6/log
# the port at which the clients will connect
clientPort =2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server .1=192.168.40.128:2888:3888
server .2=192.168.40.129:2888:3888
 
tickTime :这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
dataDir :顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
dataLogDir 如果没提供的话使用的则是dataDir zookeeper 的持久化都存储在这两个目录里。 dataLogDir 里是放到的顺序日志(WAL) 。而 dataDir 里放的是内存数据结构的 snapshot ,便于快速恢复。为了达到性能最大化,一般建议把 dataDir dataLogDir 分到不同的磁盘上,这样就可以充分利用磁盘顺序写的特性。
clientPort :这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
·  initLimit :这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
·  syncLimit :这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
·  server.A=B:C:D :其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
说明 ZooKeeper 采用一种称为 Leader election 的选举算法。在整个集群运行过程中,只有一个Leader ,其他的都是 Follower ,如果 ZooKeeper 集群在运行过程中 Leader 出了问题,系统会采用该算法重新选出一个 Leader 。因此,各个结点之间要能够保证互相连接,必须配置上述映射。 ZooKeeper 集群启动的时候,会首先选出一个 Leader ,在 Leader election 过程中,某一个满足选举算的结点就能成为 Leader 。如果领导者出现了问题失去了响应,那么原有的“跟随者”将重新选出一个新的领导者来完成整个系统的协调工作。                                                            
 
·  除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件  myid ,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是  A  的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。
比如 server.1=192.168.201.128:2888:3888,应在myid中填入1
上面的配置中有两个TCP port 。后面一个是用于 Zookeeper 选举用的,而前一个是 Leader Follower Observer 交换数据使用的
 
其他配置:
maxClientCnxns  --  对于一个客户端的连接数限制,默认是 60 ,这在大部分时候是足够了。但是在我们实际使用中发现,在测试环境经常超过这个数,经过调查发现有的团队将几十个应用全部部署到一台机器上,以方便测试,于是这个数字就超过了。
minSessionTimeout, maxSessionTimeout  --  一般,客户端连接 zookeeper 的时候,都会设置一个 session timeout ,如果超过这个时间 client 没有与 zookeeper server 有联系,则这个 session 会被设置为过期 ( 如果这个 session 上有临时节点,则会被全部删除,这就是实现集群感知的基础,后面的文章会介绍这一点 ) 。但是这个时间不是客户端可以无限制设置的,服务器可以设置这两个参数来限制客户端设置的范围。
autopurge.snapRetainCount autopurge.purgeInterval  --  客户端在与 zookeeper 交互过程中会产生非常多的日志,而且 zookeeper 也会将内存中的数据作为 snapshot 保存下来,这些数据是不会被自动删除的,这样磁盘中这样的数据就会越来越多。不过可以通过这两个参数来设置,让 zookeeper 自动删除数据。 autopurge.purgeInterval 就是设置多少小时清理一次。而 autopurge.snapRetainCount 是设置保留多少个 snapshot ,之前的则删除。
不过如果你的集群是一个非常繁忙的集群,然后又碰上这个删除操作,可能会影响zookeeper 集群的性能,所以一般会让这个过程在访问低谷的时候进行,但是遗憾的是 zookeeper 并没有设置在哪个时间点运行的设置,所以有的时候我们会禁用这个自动删除的功能,而在服务器上配置一个 cron ,然后在凌晨来干这件事。
 
说明:zookeeper不是每个主机都必须安装,自定装多少个zookeeper server
 
启动:
由于已经把可执行路径添加到环境变量中了,所以可以直接执行:
zkServer.sh start
(1)这种启动方式是在后台运行,日志文件 (log4j) 会输出到 zookeeper.out ,直接
前台终端启动可以使用: zkServer.sh start-foreground (可以 zkServer – -help查看)
(2)在 bin/zookeeper.out 文件中可以看到以下信息:
WARN  [main:QuorumPeerConfig@293] - No server failure will be tolerated. You need at least 3 servers. 由于 zookeeper 中:当且仅当一半或一半以上的“跟随者”的状态和领导者状态同步以后,才代表着领导者的选举过程完成了。实验中配置了两个 zookeeper server ,所以不允许任何一个 server failure
(3) 由于ZooKeeper 集群启动的时候,每个结点都试图去连接集群中的其它结点,先启动的肯定连不上后面还没启动的,所以上面日志前面部分的异常是可以忽略的。通过后面部分可以看到,集群在选出一个 Leader 后,最后稳定了。
 
查看状态:
执行jps查看状态:
jps    
QuorumPeerMain
可以通过ZooKeeper 的脚本来查看启动状态,包括集群中各个结点的角色(或是 Leader ,或是 Follower ):
zkServer.sh status
hadoop@ubuntu1:~/Zookeeper/zookeeper-3.4.6/bin$ zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/Zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
另一台主机:
hadoop@ubuntu2:~/Zookeeper/zookeeper-3.4.6/bin$ zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/Zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
#查看zookeeper端口:
netstat -at|grep 2181  // 查看是否有 clientPort  端口号在监听服务
#查看端口信息:
netstat -nat 
在其中一台机器上执行客户端脚本,来查看这台服务器是否启动:
zkCli.sh -server 192.168.40.128:2181
#关闭:
zkServer.sh stop 
 
遇到的问题:
zookeeper安装配置完成后, jps 能查看服务开启, netstat 可以查看到本地 2181 端口正在监听,但是 zkServer.sh status 查看状态提示如下信息:
JMX enabled by default
Using config: /home/hadoop/Zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
解决:
查看 hosts 文件:
127.0.0.1       localhost
192.168.40.129  ubuntu2
文件中缺少当前主机 ip 的映射,添加:
192.168.40.128  ubuntu1
部署HBase
(1) 新建HBase文件夹,将压缩包在文件夹内解压
tar zxvf hbase-1.0.1.1-bin.tar.gz
(2) vi conf/hbase-env.sh
:?JAVA_HOME,添加JAVA_HOME:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_51
export  HBASE_CLASSPATH =
   :?HBASE_MANAGES_ZK,设置为HBase启动和关闭Zookeeper:
# Tell HBase whether it should manage it'sown instance of Zookeeper or not.
#由HBase负责启动和关闭Zookeeper
HBASE_MANAGES_ZK=false
从hbase-env.sh文件中HBASE_MANAGES_ZK的上方说明中可以了解到,该配置是 让Hbase 使用一个现有的不被 Hbase 托管的 Zookeep er 集群设置  conf/hbase-env.sh 文件中的 HBASE_MANAGES_ZK   属性为  false ,使用 HBasa 自带 zk 则将该属性设置为 true.
 
替换 hadoop jar 文件  
hadoop-core-1.2.1.jar  commons-collections-3.2.1.jar  commons-configuration-1.6.jar  复制到 hbase lib 目录下即可 , 当然必须删除之前的旧版本 
 
(3) 配置conf/hbase-site.xml:
<configuration>
 
<property>
           <name>hbase.master</name>
           <value>master:6000</value>
   </property>
// hbase.master 是指定运行 HMaster 的服务器及端口号
 
 <property>
    <name>hbase.rootdir</name>
    <value>hdfs://ubuntu1:9000/hbase</value>
  </property>
// hbase.rootdir 指定 HBase 的存储目录
//这里须 hadoop /etc /core-site.xml 中的 fs.default.name 保持一致,但是貌似必须要用ibm ,而不能用 ip   
<property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/home/hadoop/Zookeeper/zookeeper-3.4.6/data</value>
  </property>
//dataDir为zookeeper的目录,默认为/temp,重启会被清空
 
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
    < description >The mode the clusterwill be in. Possible values are
      false: standalone and pseudo-distributedsetups with managed Zookeeper
      true: fully-distributed with unmanagedZookeeper Quorum (see hbase-env.sh)
</ description >
  </property>
// hbase.cluster.distributed 设置集群处于分布式模式
 <property>
           <name>hbase.zookeeper.quorum</name>
           <value>master</value>
   </property>
   <property>
           <name>hbase.zookeeper.property.dataDir</name>
           <value>/home/${user.name}/tmp/zookeeper</value>
   </property>
hbase.zookeeper.property.dataDir 设置 Zookeeper 的目录,默认为 /tmp
 
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>ubuntu1,ubuntu2</value>
  </property>
//quorum设置为所有zookeeper节点的主机名或ip地址(以逗号隔开),默认为localhost。
 
< property >
           < name >dfs.replication</ name >
           < value >1</ value >
   </ property >
dfs.replication 设置数据备份数,集群节点小于 3 时需要修改,本次试验是一个节点,所以修改为 1
 
<property>    
        <name>hbase.zookeeper.property.clientPort</name>    
        <value> 2181 </value>    
</property>
// 对于独立的Zookeeper ,要指明 Zookeeper host 和端口。可以在  hbase-site.xml 中设置 也可以在 Hbase CLASSPATH 下面加一个 zoo.cfg 配置文件。  HBase  会优先加载  zoo.cfg  里面的配置,把 hbase-site.xml 里面的覆盖掉 .
</configuration>
 
关于HBase其他配置,查看HBase默认配置说明.docx。
 
(4) 配置conf/regionservers
在regionservers中加入所有Region服务器的主机名或ip地址:
ubuntu1
ubuntu2
(5) 把HBase复制到其他机器上:
scp –r ~/HBase/hbase-1.0.1.1 hadoop@ubuntu2:~/HBase/
(6) 启动:
在配置文件中设置了zookeeper不随hbase启动,所以zookeeper需要手动启动各个zk server
启动顺序:hadoop-->zookeeper-->hbase
关闭顺序:hbase-->zookeeper-->hadoop
1>, hadoop:  sbin/start-all.sh
启动的时候使用./来启动,如果使用sh会报 [ 的错误
2>, zookeeper:bin/zkServer.sh start (需要将每台主机上的zk server都手动开启)
3>, hbase:start-hbase.sh
 
停止:
1>,hbase:stop-hbase.sh
2>,zookeeper:zkServer.sh stop
3>,hadoop:sbin/stop-all.sh
 
用jps命令看是否运行正常  
13889 HMaster
13764 HQuorumPeer  
14180 HRegionServer
注意 hbase.cluster.distributed配置为false的时候,后面两个进程hbase不会启动
 
HBase Shell:
./bin/hbase提供的命令使用如下:
Usage: hbase [<options>] <command> [<args>]
Options:
--config DIR Configuration direction to use. Default: ./conf
--hosts HOSTS Override the list in 'regionservers' file

Commands:
Some commands take arguments. Pass no args or -h for usage.
shell Run the HBase shell
hbck Run the hbase 'fsck' tool
snapshot Create a new snapshot of a table
snapshotinfo Tool for dumping snapshot information
wal Write-ahead-log analyzer
hfile Store file analyzer
zkcli Run the ZooKeeper shell
upgrade Upgrade hbase
master Run an HBase HMaster node
regionserver Run an HBase HRegionServer node
zookeeper Run a Zookeeper server
rest Run an HBase REST server
thrift Run the HBase Thrift server
thrift2 Run the HBase Thrift2 server
clean Run the HBase clean up script
classpath Dump hbase CLASSPATH
mapredcp Dump CLASSPATH entries required by mapreduce
pe Run PerformanceEvaluation
ltt Run LoadTestTool
version Print the version
CLASSNAME Run the class named CLASSNAME

说明:通过SecureCRT连接的HBase shell输入错误无法删除,并且回车后没有报错处于无响应状态:
解决:SecureCRT会话选项,仿真,终端-->设置为linux,确定
Ctrl+删除键 就可以删除错误内容
(1)进入hbase shell: 
$bin/ hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.0.1.1, re1dbf4df30d214fca14908df71d038081577ea46, Sun May 17 12:34:26 PDT 2015
hbase(main):001:0>
使用status命令查看运行状态:
$ status
1 servers, 0 dead, 2.0000 average load
输入help命令可以查看有哪些shell命令以及参数选项:
$ help
查看某一命令: help ‘create’
(2)创建一个包含列族fam1,fam2的表tab1,并通过list指令 查看表是否创建成功:
hbase(main):001:0>  create  'tab1','fam1','fam2'
0 row(s) in 21.1190 seconds
=> Hbase::Table - tab1
hbase(main):002:0>  list
TABLE                                                                           
tab1                                                                            
1 row(s) in 0.0550 seconds
=> ["tab1"]
(3)使用put命令向表中插入数据,参数分别为表名,行名,列名和值,其中列名前需要列族作为前缀,时间戳有系统自动生成。插入成功后通过scan命令查看表中的信息:
hbase(main):003:0> put  'tab1','rowkey002','fam1:col1','val01'   //尝试,只能一次put一个值
0 row(s) in 0.4090 seconds
hbase(main):004:0>  scan  'tab1'
ROW                   COLUMN+CELL                                               
 rowkey001            column=fam1:col1, timestamp=1440646526949, value=val1     
 rowkey001            column=fam1:col2, timestamp=1440646864405, value=val2     
 rowkey001            column=fam2:col1, timestamp=1440646919266, value=val11    
 rowkey002            column=fam1:col1, timestamp=1440647297389, value=val01    
 rowkey002            column=fam1:col2, timestamp=1440646561306, value=val2     
2 row(s) in 0.3050 seconds
(4)获取表中一行数据
hbase(main):005:0> get 'tab1','rowkey001'
COLUMN                CELL                                                      
 fam1:col1            timestamp=1440646526949, value=val1                       
 fam1:col2            timestamp=1440646864405, value=val2                       
 fam2:col1            timestamp=1440646919266, value=val11                      
3 row(s) in 0.1160 seconds
(5)删除表中一行数据
hbase(main):006:0> delete 'tab1','rowkey001','fam1:col2'
0 row(s) in 0.3150 seconds
 
其他命令可参考:

在shell中执行help可以查看hbase shell提供的命令:
> help
HBase Shell, version 1.1.3, r72bc50f5fafeb105b2139e42bbee3d61ca724989, Sat Jan 16 18:29:00 PST 2016
Type 'help "COMMAND"', (e.g. 'help "get"' -- the quotes are necessary) for help on a specific command.
Commands are grouped. Type 'help "COMMAND_GROUP"', (e.g. 'help "general"') for help on a command group.

COMMAND GROUPS:
Group name: general
Commands: status, table_help, version, whoami

Group name: ddl
Commands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, show_filters

Group name: namespace
Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables

Group name: dml
Commands: append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve

Group name: tools
Commands: assign, balance_switch, balancer, balancer_enabled, catalogjanitor_enabled, catalogjanitor_run, catalogjanitor_switch, close_region, compact, compact_rs, flush, major_compact, merge_region, move, split, trace, unassign, wal_roll, zk_dump

Group name: replication
Commands: add_peer, append_peer_tableCFs, disable_peer, disable_table_replication, enable_peer, enable_table_replication, list_peers, list_replicated_tables, remove_peer, remove_peer_tableCFs, set_peer_tableCFs, show_peer_tableCFs

Group name: snapshots
Commands: clone_snapshot, delete_all_snapshot, delete_snapshot, list_snapshots, restore_snapshot, snapshot

Group name: configuration
Commands: update_all_config, update_config

Group name: quotas
Commands: list_quotas, set_quota

Group name: security
Commands: grant, revoke, user_permission

Group name: procedures
Commands: abort_procedure, list_procedures

Group name: visibility labels
Commands: add_labels, clear_auths, get_auths, list_labels, set_auths, set_visibility

SHELL USAGE:
Quote all names in HBase Shell such as table and column names. Commas delimit
command parameters. Type <RETURN> after entering a command to run it.
Dictionaries of configuration used in the creation and alteration of tables are
Ruby Hashes. They look like this:

{'key1' => 'value1', 'key2' => 'value2', ...}

and are opened and closed with curley-braces. Key/values are delimited by the
'=>' character combination. Usually keys are predefined constants such as
NAME, VERSIONS, COMPRESSION, etc. Constants do not need to be quoted. Type
'Object.constants' to see a (messy) list of all constants in the environment.

If you are using binary keys or values and need to enter them in the shell, use
double-quote'd hexadecimal representation. For example:

hbase> get 't1', "key\x03\x3f\xcd"
hbase> get 't1', "key\003\023\011"
hbase> put 't1', "test\xef\xff", 'f1:', "\x01\x33\x40"

HBase API使用:
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值