柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

大数据(八)学习部署Hbase

Hbase官网:http://hbase.apache.org/

一、Hbase介绍

1.1 Hbase简介

        HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。

       HBase 是Google Bigtable 的开源实现,与Google Bigtable 利用GFS作为其文件存储系统类似(Hbase依托于Hadoop的HDFS作为最基本存储基础单元,通过使用hadoop的DFS工具就可以看到这些这些数据存储文件夹的结构,还可以通过Map/Reduce的框架(算法)对HBase进行操作), HBase 利用Hadoop HDFS 作为其文件存储系统;Google 运行MapReduce 来处理Bigtable中的海量数据, HBase 同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable 利用Chubby作为协同服务, HBase 利用Zookeeper作为对应。

       HBase是一种构建在HDFS之上的分布式、面向列的存储系统。在需要实时读写、随机访问超大规模数据集时,可以使用HBase。HBase不同于关系型数据库(RDBMS全称为 Relational Database Management System),从另一个角度处理伸缩性问题。它通过线性方式从下到上增加节点来进行扩展。HBase不是关系型数据库,也不支持SQL,但是它有自己的特长,这是RDBMS不能处理的,HBase巧妙地将大而稀疏的表放在商用的服务器集群上。

1.2 Hbase特性

  1. 线性和模块化的可扩展性。

  2. 严格一致的读取和写入。

  3. 自动和可配置的表分片

  4. RegionServers之间的自动故障转移支持。

  5. 方便的基类,用于使用Apache HBase表来支持Hadoop MapReduce作业。

  6. 易于使用Java API进行客户端访问。

  7. 阻止高速缓存和Bloom Filters进行实时查询。

  8. 通过服务器端过滤器查询谓词下推

  9. Thrift网关和支持XML,Protobuf和二进制数据编码选项的REST-ful Web服务

  10. 可扩展的jruby-based(JIRB)外壳

  11. 支持通过Hadoop指标子系统将度量输出到文件或Ganglia; 或通过JMX

1.3 HBase 与传统关系数据库的区别

       ACID 是指数据库事务正确执行的四个基本要素的缩写,其包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)以及持久性(Durability)。对于一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction Processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。下面,我们就简单的介绍下这 4 个特性的含义。

原子性(Atomicity)  #是指一个事务要么全部执行,要么全部不执行。换句话说,一个事务不可能只执行了一半就停止了。比如一个事情分为两步完成才可以完成,那么这两步必须同时完成,要么一步也不执行,绝不会停留在某一个中间状态。如果事物执行过程中,发生错误,系统会将事物的状态回滚到最开始的状态。
一致性(Consistency)  #是指事务的运行并不改变数据库中数据的一致性。也就是说,无论并发事务有多少个,但是必须保证数据从一个一致性的状态转换到另一个一致性的状态。例如有 a、b 两个账户,分别都是 10。当 a 增加 5 时,b 也会随着改变,总值 20 是不会改变的。
隔离性(Isolation)  #是指两个以上的事务不会出现交错执行的状态。因为这样可能会导致数据不一致。如果有多个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
持久性(Durability)   #指事务执行成功以后,该事务对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚。

HBase 与 RDBMS 的区别:

容错性:HBase由软件架构实现,由于由多个节点组成所以不担心某节点宕机情况。RDBMS一般需要额外硬件设备实现HA机制。
数据库大小:HBase是PB级别的。RDBMS是GB和TB级别的。
数据排布方式:稀疏的、分布的多维的Map.RDBMS是以行和列组织。
数据类型:HBase是Bytes(hbase的存储的数据都是字符串,所有的类型都有用户自己处理,它只保存字符串)。RDBMS是以行和列组织(有丰富的数据类型和存储 方式)。
事务支持:HBase只支持单个Row级别。RDBMS是全面的ACID支持,对Row和表。
查询语言:只支持Java API(除非与其他框架一起使用,如Hive,Phoenix). RDBMS是SQL。
索引:HBase只支持Row-key,除非与其他技术一起应用(如Hive,Phoenix)。RDBMS原生支持索引。
吞吐量:HBase是百万查询/每秒。RDBMS是数千查询/每秒。
数据操作:HBase只有简单的插入,查询,删除,清空等操作。表与表之间都是分离的,没有那么多的表关系。RDBMS有复杂的表关系。
存储的模式:HBase是基于列存储,每一个列族都是有好几个文件存储,不同列族的文件是分离的。RDBMS是基于表结构和行模式存储。
数据的维护:HBase对数据的修改,实际上是插入了一条新的数据,而修改前的数据任旧保存在就版本中.EDBMS是在原数据的基本上直接进行修改.

1.4 HBase架构组成

HBase采用Master/Slave架构搭建集群,由HMaster节点、HRegionServer节点、ZooKeeper集群组成,而在底层,它将数据存储于HDFS中,因而涉及到HDFS的NN、DN等,总体结构如下:

图片.png

图片.png

Client的主要功能:

使用HBase的RPC机制与HMaster和HRegionServer进行通信
对于管理类操作,Client与HMaster进行RPC
对于数据读写类操作,Client与HRegionServer进行RPC

Zookeeper功能:

通过选举,保证任何时候,集群中只有一个master,Master与RegionServers 启动时会向ZooKeeper注册
实时监控Region server的上线和下线信息,并实时通知给Master
存贮所有Region的寻址入口和HBase的schema和table元数据
Zookeeper的引入实现HMaster主从节点的failover

图片.png

#在HMaster和HRegionServer连接到ZooKeeper后创建Ephemeral节点,并使用Heartbeat机制维持这个节点的存活状态,如果某个Ephemeral节点失效,则HMaster会收到通知,并做相应的处理
#HMaster通过监听ZooKeeper中的Ephemeral节点(默认:/hbase/rs/*)来监控HRegionServer的加入和宕机
#在第一个HMaster连接到ZooKeeper时会创建Ephemeral节点(默认:/hbasae/master)来表示Active的HMaster,其后加进来的HMaster则监听该Ephemeral节点,
#如果当前Active的HMaster宕机,则该节点消失,因而其他HMaster得到通知,而将自身转换成Active的HMaster,在变为Active的HMaster之前,它会创建在/hbase/back-masters/下创建自己的Ephemeral节点

HMaster功能:

管理HRegionServer,实现其负载均衡
管理和分配HRegion,比如在HRegion split时分配新的HRegion;在HRegionServer退出时迁移其内的HRegion到其他HRegionServer上
实现DDL操作(Data Definition Language,namespace和table的增删改,column familiy的增删改等)。
管理namespace和table的元数据(实际存储在HDFS上)。
权限控制(ACL)。
监控集群中所有HRegionServer的状态(通过Heartbeat和监听ZooKeeper中的状态)
处理schema更新请求 (创建、删除、修改Table的定义), 如下图:

图片.png

HRegionServer功能:

存放和管理本地HRegion。
读写HDFS,管理Table中的数据。
Client直接通过HRegionServer读写数据(从HMaster中获取元数据,找到RowKey所在的HRegion/HRegionServer后)。
Region server维护Master分配给它的region,处理对这些region的IO请求
Region server负责切分在运行过程中变得过大的region

RegionServer一般和Datanode在同一台机器上运行,实现数据的本地性,HRegionServer包含多个HRegion,由WAL(HLog)、BlockCache、MemStore、HFile组成:

  1. WAL(Write Ahead Log):它是HDFS上的一个文件,所有写操作都会先保证将数据写入这个Log文件后,才会真正更新MemStore,最后写入HFile中。采用这种模式,可以保证HRegionServer宕机后,依然可以从该Log文件中读取数据,Replay所有的操作,来保证数据的一致性。一个HRegionServer只有一个WAL实例,即一个HRegionServer的所有WAL写都是串行,这当然会引起性能问题,在HBase 1.0之后,通过HBASE-5699实现了多个WAL并行写(MultiWAL),该实现采用HDFS的多个管道写,以单个HRegion为单位。Log文件会定期Roll出新的文件而删除旧的文件(那些已持久化到HFile中的Log可以删除)。WAL文件存储在/hbase/WALs/${HRegionServer_Name}的目录中。

  2. BlockCache:是一个读缓存,将数据预读取到内存中,以提升读的性能 。HBase中提供两种BlockCache的实现:默认on-heap LruBlockCache和BucketCache(通常是off-heap)。通常BucketCache的性能要差于LruBlockCache,然而由于GC的影响,LruBlockCache的延迟会变的不稳定,而BucketCache由于是自己管理BlockCache,而不需要GC,因而它的延迟通常比较稳定,这也是有些时候需要选用BucketCache的原因。

  3. HRegion:是一个Table中的一个Region在一个HRegionServer中的表达,是Hbase中分布式存储和负载均衡的最小单元。一个Table拥有一个或多个Region,分布在一台或多台HRegionServer上。一台HRegionServer包含多个HRegion,可以属于不同的Table。HRegion由多个Store(HStore)构成,每个HStore对应了一个Table在这个HRegion中的一个Column Family,即每个Column Family就是一个集中的存储单元。HStore是HBase中存储的核心,它实现了读写HDFS功能,一个HStore由一个MemStore 和0个或多个StoreFile组成。

  4. MemStore:是一个写缓存(In Memory Sorted Buffer),所有数据的写在完成WAL日志写后,会 写入MemStore中,由MemStore根据一定的算法将数据Flush到底层HDFS文件中(HFile),通常每个HRegion中的每个 Column Family有一个自己的MemStore。

  5. HFile(StoreFile): 用于存储HBase的数据(Cell/KeyValue)。在HFile中的数据是按RowKey、Column Family、Column排序,对相同的Cell(即这三个值都一样),则按timestamp倒序排列

注意:

client访问hbase上数据的过程并不需要master参与(寻址访问zookeeper,数据读写访问regione server),master仅仅维护者table和region的元数据信息,负载很低。

HRegion所处理的数据尽量和数据所在的DataNode在一起,实现数据的本地化。
详细的介绍可参考下面的链接:

http://www.blogjava.net/DLevin/archive/2015/08/22/426877.html

https://www.cnblogs.com/tgzhu/p/5857035.html

博文来自:www.51niux.com

二、HBase集群的部署

hadoop集群的部署:http://blog.51niux.com/?id=175

Zookeeper集群的部署:http://blog.51niux.com/?id=182

HBase官网文档:http://hbase.apache.org/book.html#arch.overview

2.1 HBase的下载并安装:

# wget mirror.bit.edu.cn/apache/hbase/stable/hbase-1.2.6-bin.tar.gz
# tar zxf hbase-1.2.6-bin.tar.gz  -C /home/hadoop/

# chown -R hadoop:hadoop /home/hadoop/hbase-1.2.6
# ln -s /home/hadoop/hbase-1.2.6 /home/hadoop/hbase

2.2 HBase的环境配置并修改配置文件:

设置环境变量(所有节点):

# vim /etc/profile

##########hbase###################
export HBASE_HOME=/home/hadoop/hbase
export PATH=$PATH:$HBASE_HOME/bin

# source /etc/profile

修改hbase-env.sh:

# vim /home/hadoop/hbase/conf/hbase-env.sh

# export JAVA_HOME=/usr/java/jdk1.6.0/
export JAVA_HOME=/usr/java/jdk
# export HBASE_MANAGES_ZK=true
export HBASE_MANAGES_ZK=false
#Hbase依赖一个zookeeper集群所有的节点和客户端都必须能够访问zookeeper。默认的情况下Hbase会管理一个zookeep集群。这个集群会随着Hbase的启动而启动。当然,你也可以自己管理一个zookeeper集群,但需要配置Hbase。
#你需要修改conf/hbase-env.sh里面的HBASE_MANAGES_ZK 来切换。这个值默认是true的,作用是让Hbase启动的时候同时也启动zookeeper.让Hbase使用一个现有的不被Hbase托管的Zookeep集群,需要设置 conf/hbase-env.sh文件中的HBASE_MANAGES_ZK 属性为 false

博文来自:www.51niux.com

修改hbase-site.xml :

# cat /home/hadoop/hbase/conf/hbase-site.xml

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://mycluster/hbase</value>
  </property>
  <property>
     <name>hbase.hregion.max.filesize</name>
      <value>10737418240</value>
  </property>
  <property>
    <name>hbase.hregion.memstore.flush.size</name>
    <value>134217728</value>
  </property>
   <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>  
  </property>
   <property>
     <name>hbase.zookeeper.property.clientPort</name>
     <value>2181</value>
  </property>
  <property>
   <name>zookeeper.session.timeout</name>
   <value>120000</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.tickTime</name>
    <value>6000</value>
  </property>
  <property>
     <name>hbase.zookeeper.quorum</name>
     <value>slave04.hadoop,slave05.hadoop,slave06.hadoop</value>
  </property>
  <property>
       <name>hbase.tmp.dir</name>
       <value>/home/hadoop/hbase/tmp</value>
  </property>
</configuration>

下面是对上面参数的介绍:

hbase.rootdir   #HBase集群中所有RegionServer共享目录,用来持久化HBase的数据,一般设置的是hdfs的文件目录。
hbase.hregion.max.filesize  #单个ColumnFamily的region大小(最大HFile大小。如果一个region的HFiles的总和已经超过这个数值),若按照ConstantSizeRegionSplitPolicy策略,超过设置的该值则自动split。默认值是:10737418240,也就是是10GB。
hbase.hregion.memstore.flush.size   #如果memstore的大小超过此字节数,Memstore将被刷新到磁盘。默认值是134217728,也就是128MB
hbase.cluster.distributed   #群集所处的模式。对于独立模式,可能的值为false,对于分布式模式,可能的值为true。 如果为false,启动将在一个JVM中一起运行所有HBase和ZooKeeper守护进程。默认值是false。
hbase.zookeeper.property.clientPort    #来自ZooKeeper的配置zoo.cfg的属性。 客户端将连接的端口。默认是2081端口
zookeeper.session.timeout    #ZooKeeper会话超时(以毫秒为单位)。 它以两种不同的方式使用。 首先,这个值用于HBase用来连接到集合的ZK客户端。 当它启动一个ZK服务器时它也被HBase使用,它被作为'maxSessionTimeout'传递。如果HBase区域服务器连接到也由HBase管理的ZK集合,那么会话超时将是由此配置指定的。 但是,连接到以不同配置管理的合奏的区域服务器将受到合奏的maxSessionTimeout的限制。 所以,尽管HBase可能会建议使用90秒,但是整体的最大超时时间可能会低于此值,因此优先。 ZK目前的默认值是40秒,比HBase的低。默认值是9000
hbase.zookeeper.property.tickTime  #客户端与zk发送心跳的时间间隔。默认值就是6000,也就是6秒钟
hbase.zookeeper.quorum   #zookeeper集群的URL配置,多个host中间用逗号(,)分割
hbase.zookeeper.quorum  #默认情况下,对于本地和伪分布式操作模式,将其设置为localhost。 对于完全分布式安装,应将其设置为ZooKeeper集成服务器的完整列表。 如果在hbase-env.sh中设置了HBASE_MANAGES_ZK,这是hbase将作为群集启动/停止的一部分启动/停止ZooKeeper的服务器列表。 客户端,我们将把这个集合成员的列表,并把它与hbase.zookeeper.property.clientPort配置放在一起。 并将其作为connectString参数传递给zookeeper构造函数。默认是localhost
hbase.tmp.dir   #本地文件系统上的临时目录。 将此设置更改为指向比“/ tmp”更持久的位置,这是java.io.tmpdir的常见解决方案,因为在重新启动计算机时清除了“/ tmp”目录。默认$ {java.io.tmpdir}/ HBase的 - $ {user.name}

# mkdir /home/hadoop/hbase/tmp

# chown -R hadoop:hadoop /home/hadoop/

#有人总结的Hbase的配置参数:https://www.cnblogs.com/qinersky902/p/6217741.html

修改regionservers配置文件

# vim /home/hadoop/hbase/conf/regionservers  #类似于hadoop的slave,regionservers的服务节点设置到这里,regionservers服务节点一般跟datanode节点在一起。

slave01.hadoop
slave02.hadoop
slave03.hadoop
slave04.hadoop
slave05.hadoop
slave06.hadoop

2.3 将 /home/hadoop/hbase-1.2.6发送到其他hadoop节点

然后做软连接:# ln -s /home/hadoop/hbase-1.2.6 /home/hadoop/hbase

2.4 启动Hbase并查看

$ /home/hadoop/hbase/bin/start-hbase.sh 

#然后查看slave端的日志发现有报错:

$ tail -f /home/hadoop/hbase/logs/hbase-hadoop-regionserver-slave06.hadoop.log

2017-11-17 16:49:02,538 ERROR [main] regionserver.HRegionServerCommandLine: Region server exiting
java.lang.RuntimeException: Failed construction of Regionserver: class org.apache.hadoop.hbase.regionserver.HRegionServer
    at org.apache.hadoop.hbase.regionserver.HRegionServer.constructRegionServer(HRegionServer.java:2682)
    at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.start(HRegionServerCommandLine.java:64)
    at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.run(HRegionServerCommandLine.java:87)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:126)
    at org.apache.hadoop.hbase.regionserver.HRegionServer.main(HRegionServer.java:2697)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.apache.hadoop.hbase.regionserver.HRegionServer.constructRegionServer(HRegionServer.java:2680)
    ... 5 more
Caused by: java.lang.IllegalArgumentException: java.net.UnknownHostException: mycluster
    at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:373)
    at org.apache.hadoop.hdfs.NameNodeProxies.createNonHAProxy(NameNodeProxies.java:258)
    at org.apache.hadoop.hdfs.NameNodeProxies.createProxy(NameNodeProxies.java:153)
    at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:602)
    at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:547)
    at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:139)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2591)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:89)
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2625)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2607)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:368)
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
    at org.apache.hadoop.hbase.util.FSUtils.getRootDir(FSUtils.java:1003)
    at org.apache.hadoop.hbase.regionserver.HRegionServer.initializeFileSystem(HRegionServer.java:609)
    at org.apache.hadoop.hbase.regionserver.HRegionServer.<init>(HRegionServer.java:564)
    ... 10 more
Caused by: java.net.UnknownHostException: mycluster
    ... 25 more

#因为我们配置的是hdfs://mycluster/hbase,这里提示找不到mycluster。

解决办法:

[hadoop@master ~]$ cp /home/hadoop/hadoop/etc/hadoop/core-site.xml /home/hadoop/hbase/conf/
[hadoop@master ~]$ cp /home/hadoop/hadoop/etc/hadoop/hdfs-site.xml /home/hadoop/hbase/conf/
#然后再把配置文件全部节点同步一点。

$ /home/hadoop/hbase/bin/stop-hbase.sh
$ /home/hadoop/hbase/bin/start-hbase.sh   #重新启动一下

master.hadoop节点查看:

$ jps

28111 HMaster

$ lsof -i :16000   #hbase的master端口默认是16000

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    28914 hadoop  306u  IPv6 263145      0t0  TCP master.hadoop:fmsas (LISTEN)
java    28914 hadoop  376u  IPv6 263161      0t0  TCP master.hadoop:fmsas->slave02.hadoop:54033 (ESTABLISHED)
java    28914 hadoop  377u  IPv6 263163      0t0  TCP master.hadoop:fmsas->slave05.hadoop:34019 (ESTABLISHED)
java    28914 hadoop  378u  IPv6 263165      0t0  TCP master.hadoop:fmsas->slave06.hadoop:41143 (ESTABLISHED)
java    28914 hadoop  379u  IPv6 263167      0t0  TCP master.hadoop:fmsas->slave03.hadoop:58112 (ESTABLISHED)
java    28914 hadoop  380u  IPv6 270337      0t0  TCP master.hadoop:fmsas->slave04.hadoop:48841 (ESTABLISHED)
java    28914 hadoop  381u  IPv6 270339      0t0  TCP master.hadoop:fmsas->slave01.hadoop:53878 (ESTABLISHED)

slave节点查看:

$ jps

24116 HRegionServer

$ lsof -i :16020   #regionserver默认监听在16020端口

COMMAND   PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    24116 hadoop  126u  IPv6 1990424      0t0  TCP slave06.hadoop:jwpc (LISTEN)

博文来自:www.51niux.com

zk节点上面查看:

$ /home/hadoop/zookeeper/bin/zkCli.sh -server localhost:2181

[zk: localhost:2181(CONNECTED) 4] ls / 
[zookeeper, yarn-leader-election, spark, hadoop-ha, hbase]
[zk: localhost:2181(CONNECTED) 7] ls2 /hbase
[replication, meta-region-server, rs, splitWAL, backup-masters, table-lock, flush-table-proc, region-in-transition, online-snapshot, master, running, recovering-regions, draining, namespace, hbaseid, table]
cZxid = 0xf000000ed
ctime = Fri Nov 17 16:41:53 CST 2017
mZxid = 0xf000000ed
mtime = Fri Nov 17 16:41:53 CST 2017
pZxid = 0xf000001c5
cversion = 30
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 16
#可以看到产生了好多的子节点
[zk: localhost:2181(CONNECTED) 8] get /hbase/master
�master:16000�i�,�uPBUF
 
master.hadoop�}�����+�}
cZxid = 0xf00000198
ctime = Fri Nov 17 17:01:15 CST 2017
mZxid = 0xf00000198
mtime = Fri Nov 17 17:01:15 CST 2017
pZxid = 0xf00000198
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x15fbb2555140013
dataLength = 61
numChildren = 0

HDFS上面的查看:

图片.png

HBase在HDFS上面构建的目录树:

/hbase/.tmp  #当对表做创建或者删除操作的时候,会将表move 到该 tmp 目录下,然后再去做处理操作。
/hbase/MasterProcWALs 
/hbas/WALs  #预先写入日志(WAL)将HBase中数据的所有更改记录到基于文件的存储中。 在正常操作下,不需要WAL,因为数据更改从MemStore移动到StoreFiles。 但是,如果在刷新MemStore之前RegionServer崩溃或变得不可用,则WAL确保可以重播对数据的更改。 如果写入WAL失败,整个操作修改数据失败。
#HBase使用WAL接口的实现。 通常,每个RegionServer只有一个WAL实例。 在将它们记录到受影响商店的MemStore之前,RegionServer会记录它们并将其删除。
/hbase/data  #hbase 的核心目录,系统会预置两个 namespace 即:hbase和default。
/hbase/hbase.id  #它是一个文件,存储集群唯一的 cluster id 号,是一个 uuid。
/hbase/hbase.version  #同样也是一个文件,存储集群的版本号,是加密的,看不到,只能通过web-ui才能正确显示出来。
/hbase/oldWALs  #旧的.oldlogs目录。

访问web ui:

网址:master的ip:16010

图片.png

2.5 启动从Hbase并做HA测试

#在master.hadoop上面将/home/hadoop/hbase的整个目录拷贝到smaster.hadoop节点上面。

$ /home/hadoop/hbase/bin/hbase-daemon.sh start master   #然后再备节点上面启动Hmaster服务

#web页面访问:http://192.168.14.49:16010/master-status

图片.png

#备用节点出现了。

$ lsof -i :16000  #在smaster.hadoop上面查看,现在还没有其他slave节点的连接

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    22834 hadoop  304u  IPv6 297175      0t0  TCP smaster.hadoop:fmsas (LISTEN)

$ /home/hadoop/hbase/bin/hbase-daemon.sh stop master   #在master.hadoop节点上面执行关闭Hmaster的操作

[hadoop@smaster ~]$ lsof -i :16000   #可以看到slave节点都跟smaster.hadoop节点建立连接了

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    22834 hadoop  304u  IPv6 297175      0t0  TCP smaster.hadoop:fmsas (LISTEN)
java    22834 hadoop  375u  IPv6 298583      0t0  TCP smaster.hadoop:fmsas->slave01.hadoop:34236 (ESTABLISHED)
java    22834 hadoop  376u  IPv6 298584      0t0  TCP smaster.hadoop:fmsas->slave02.hadoop:36961 (ESTABLISHED)
java    22834 hadoop  377u  IPv6 298585      0t0  TCP smaster.hadoop:fmsas->slave06.hadoop:34253 (ESTABLISHED)
java    22834 hadoop  378u  IPv6 298586      0t0  TCP smaster.hadoop:fmsas->slave05.hadoop:43371 (ESTABLISHED)
java    22834 hadoop  379u  IPv6 298588      0t0  TCP smaster.hadoop:fmsas->slave04.hadoop:41175 (ESTABLISHED)
java    22834 hadoop  380u  IPv6 298590      0t0  TCP smaster.hadoop:fmsas->slave03.hadoop:33348 (ESTABLISHED)

图片.png

$ /home/hadoop/hbase/bin/hbase-daemon.sh start master  #再次启动master.hadoop节点上面的Hmaster服务

图片.png

现在再来看zk里面的信息:

[zk: localhost:2181(CONNECTED) 9] get /hbase/master
�master:16000����!��PBUF
 
smaster.hadoop�}�����+�}
cZxid = 0xf000001dc
ctime = Fri Nov 17 17:42:19 CST 2017
mZxid = 0xf000001dc
mtime = Fri Nov 17 17:42:19 CST 2017
pZxid = 0xf000001dc
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x25fbb253154001e
dataLength = 62

博文来自:www.51niux.com

三、HBase的使用

3.1 HBase Shell

HBase包含可以与HBase进行通信的Shell。 HBase使用Hadoop文件系统来存储数据。它拥有一个主服务器和区域服务器。数据存储将在区域(表)的形式。这些区域被分割并存储在区域服务器。主服务器管理这些区域服务器,所有这些任务发生在HDFS。

$ /home/hadoop/hbase/bin/hbase shell

hbase(main):002:0> status    #提供HBase的状态
1 active master, 1 backup masters, 6 servers, 0 dead, 0.3333 average load
hbase(main):003:0> version    #提供正在使用HBase的版本
1.2.6, rUnknown, Mon May 29 02:25:32 CDT 2017
hbase(main):005:0> whoami    #正在操作的用户信息
hadoop (auth:SIMPLE)
    groups: hadoop 
hbase(main):006:0> table_help   #表引用命令帮助

3.2 表的常用操作

创建表和列出表:

格式:create ‘<table name>’,’<column family>’ #指定表名和列族名

hbase(main):008:0> create 'member','member_id','address','info'
0 row(s) in 5.1950 seconds

=> Hbase::Table - member

hbase(main):009:0> list   #可以用list查看一下,可以看到member表已经创建了,list就是列出表操作
TABLE                                                                                                                                                                                                                                                                          
member                                                                                                                                                                                                                                                                         
1 row(s) in 0.0470 seconds

=> ["member"]

#可以使用HBaseAdmin类的createTable()方法创建表。

#可以使用HBaseAdmin中有一个方法叫 listTables(),列出HBase中所有的表的列表。

禁用和启动表:

hbase(main):011:0> disable 'member'  #禁用member表,表都要用''引起来啊
hbase(main):015:0> scan 'member'  #扫描这个表,下面的结果是扫描不到
ROW                                                                  COLUMN+CELL                                                                                                                                                                                               
ERROR: member is disabled.
hbase(main):018:0> is_disabled 'member'  #查看表是否被禁用,如果禁用会返回true,如下面的结果
true                                                                                                                                                                                                                                                                           
0 row(s) in 0.0170 seconds
hbase(main):019:0> disable_all 'me.*'   #用来禁用所有匹配到的表,下面是结果输出
member                                                                                                                                                                                                                                                                         
Disable the above 1 tables (y/n)?
y
1 tables successfully disabled

hbase(main):020:0> enable 'member'  #这表示启用member表
hbase(main):021:0> scan 'member'  #扫描member表,下面是结果输出
ROW                                                                  COLUMN+CELL                                                                                                                                                                                               
0 row(s) in 0.0840 seconds
hbase(main):022:0> is_enabled 'member'   #如果是启动就返回true
true                                                                                                                                                                                                                                                                           
0 row(s) in 0.0200 seconds

#要验证一个表是否被禁用,使用isTableDisabled()方法和disableTable()方法禁用一个表。这些方法属于HBaseAdmin类

#要验证一个表是否被启用,使用isTableEnabled()方法;并且使用enableTable()方法使一个表启用。这些方法属于HBaseAdmin类

表描述:

hbase(main):026:0> describe 'member'   #查看member表的描述信息,下面为结果输出。
Table member is ENABLED                                                                                                                                                                                                                                                        
member                                                                                                                                                                                                                                                                         
COLUMN FAMILIES DESCRIPTION                                                                                                                                                                                                                                                    
{NAME => 'address', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '
0'}                                                                                                                                                                                                                                                                            
{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
{NAME => 'member_id', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE =>
 '0'}                                                                                                                                                                                                                                                                          
3 row(s) in 0.0410 seconds

图片.png

#在web页面也可以查看到创建的表以及表的描述。

#剩下的常用操作可以网上搜一波。


作者:忙碌的柴少 分类:大数据 浏览:4455 评论:0
留言列表
发表评论
来宾的头像