HBase介绍及集群搭建
1. HBase的基本介绍
- HBase产生背景
HDFS: 分布式文件存储系统
特点: 吞吐量极高, 适合于进行批量数据处理工作, 随机的读写能力比较差(压根就不支持)
但是, 在实际生产环境中, 有时候数据体量比较大, 但是希望能够对数据进行随机的读写操作, 而且不能太慢了, 如何解决呢?
对于市场来说, 其实非常迫切的需要一款能够支持大规模数据存储以及能够对数据进行高效的随机读写操作, 而HBase其实就是在这样的背景下产生, 灵感来源于 google发布的一篇论文(BigTable)
- HBase的基本介绍
1- HBase是一款NoSQL型数据库,不支持SQL,没有表关系, 无法进行Join操作,不支持事务(仅仅支持行级事务)
2- HBase是基于google发布BigTable这篇论文而产生的, 基于HDFS, 也就说, 数据最终是存储到HDFS上, 如果后续想要启动HBase, 必须先启动HDFS, 基于Java语言
3- 查询HBase的数据一般有以下几种方式:
第一种: 通过主键来检索
第二种: 通过主键的范围检索
第三种: 查询全部数据
4- 存储的以结构化数据和半结构化的数据为主
5- HBase的存储都是以字节类型存储的
6- HBase的表的特点:
大: 可以存储上十亿行的数据, 也可以拥有上百万个列
面向列的存储方式: 列 指的 列族(列簇)
稀疏性: 对于Null值, 在HBase中是不占用任何的存储空间的, 所以表可以搞的非常的稀疏
- HBase的应用场景
1- 数据是否需要进行随机读写的操作
2- 数据体量是否比较大(建议TB级别以上)
3- 数据是否是比较稀疏的
如果在实际生产环境中, 发现数据已经具备了以上二种的时候, 其实就可以尝试使用HBase, 如果三种都满足了, 一般都是采用HBase解决
- 发展历程
2. HBase和其他软件的区别
- HBase和 RDBMS区别
HBase: 以表的形式存储 存在行键(row key) 不支持SQL 不支持事务(仅行级事务) 无表关系 不支持Join 采用分布式存储引擎 基于HDFS的文件存储系统 支持 结构化 和半结构化的数据
RDBMS: 以表的形式存储 存在主键(primary key) 支持SQL 支持事务 存在表关系 支持Join 采用单机的存储引擎 基于本地文件系统 支持存储结构化数据
- HBase 和 HDFS的区别
HBase: 基于HDFS, 与HDFS是一种强依赖的关系, 启动HBase, 必须先启动HDFS, 数据最终落在HDFS上, 支持高效的随机读写的特性, 吞吐量相对于HDFS比较低, 适合于实时处理
HDFS: 适合于批处理, 吞吐量极高, 不支持随机读写的能力, 存储更多是一些过去已经发生过的数据
矛盾: 基于HDFS的hbase支持随机读写, 但是HDFS本身自己并不支持, 既有联系 , 又有矛盾, 说明在HBaase的上面一定是做了N多处理的, 才达到这样的效果
- HBase 和 Hive的区别
HIVE: 数据仓库的工具 主要是用于离线数据分析处理 主要对接的离线的处理业务 基于hadoop 高延时
HBASE: nosql型数据库 主要是用于数据的存储工作 主要对接实时业务 基于HADOOP 低延迟
注意:
在后续, 可以让HIVE 和 HBase集成在一起, 由HIVE读取HBase中数据, 进行离线处理分析, 本质上就是让HIVE换一个地方读取数据
3. HBase集群安装操作
在安装过程中, 如果启动失败了, 一般出现错误的位置:
- 1- 在hbase-env.sh中, 没有将注释打开
- 2- 在hbase-site.xml中, 没有修改zookeeper的存储路径地址, 或者说整个内容 拷贝错误
- 3- 没有将jar包(htrace-core-3.1.0-incubating.jar) 拷贝到hbase的lib目录下
- 4- zookeeper或者 hadoop集群压根没有启动良好
如果检测后, 以上这几项内容, 都没有任何的问题, 停止hbase, 将hbase产生的元数据信息, 全部删除清空, 重启hbase:
如何删除元数据: 主要删除二个位置
1) zk上:
进入zookeeper的bin目录下
cd /export/server/zookeeper/bin/
./zkCli.sh
进入客户端后, 执行: rmr /hbase
2) hdfs上:
在linux的shell窗口下执行: hdfs dfs -rm -r /hbase
如何启动HBase:
1- 启动 zookeeper集群: 三个节点都要执行
cd /export/server/zookeeper/bin/
./zkServer.sh start
当三个节点都启动后, 需要查看zk的集群状态:
cd /export/server/zookeeper/bin/
./zkServer.sh status 要能看到二个follower 和 一个 leader 认为 集群启动完成了
2- 启动Hadoop集群:
在node1的任意的节点目录下, 执行 start-all.sh
如何校验是否启动ok:
首先通过 jps 查看各个节点进程是否启动
node1: DataNode ResourceManager NodeManager NameNode
node2: DataNode NodeManager SecondaryNameNode
node3: DataNode NodeManager
接着通过浏览器查看:
node1:9870 主要看安全模式是否退出, 以及激活的datanode是否为3
node1:8088 主要是激活节点是否为3
3- 启动HBase
在node1的任意节点目录下执行: start-hbase.sh
检测:
通过jps查看
node1: HRegionServer HMaster
node2: HRegionServer
node3: HRegionServer
注意: 可能等待一会, 有可能出现宕机 此时通过日志查看: log目录下
cd /export/server/hbase/logs/
tail -100f xxx.log
注意: 由于目前配置文件中均采用全域名(node1.itcast.cn)方式配置的配置文件,但是部分同学, 可能从来没有使用过这几个服务项
可能会出现一个错误, 在启动HBase的时候, 可能在启动过程中, 命令会卡住 一直不动 如果发现此问题, 不断的输入 yes即可 一般仅在前1 2次可能会出现
访问: node1:16010 即可看到HBase集群的管理界面
注意: 在刚刚启动完成后, 里面访问 node1:16010, 可能会看到一个500的界面, 错误的描述为 master init... , 看到这个错误, 不要着急, 等待一会, 重新访问即可, 如果长久一直是这样, 重启试一试, 如果重启不行, 需要进行拍错了
4. HBase的表模型
1- rowkey: 行键, 类似于MySQL中每个表都会有主键, 同样类似于 kv类型中key
在hbase中, 数据会默认进行排序操作, 排序的规则为基于rowkey进行字典升序排序
例如: 1 3 15 2 13 25 请问, 如果按照字典升序排序, 结果是什么呢?
结果为:
1 13 15 2 25 3
规则: 先比较第一位, 如果第一位相同, 比较第二位, 没有第二位比有第二位的小, 依次类推
查询方式:
第一种: 根据rowkey查询
第二种: 根据rowkey的范围查询
第三组: 查询全表数据
2- column family: 列族(列簇)
在创建表的时候, 需要指定列族信息的, 一个表 是可以有多个列族
在hbase中是基于列族管理和管理的, 一个表中建议列族不要太多了, 能少则少, 能用一个解决的, 坚决不用多个
在一个列族下可以有多个列(列限定符号), 最大支持上百万个列
3- 列限定符号(列名): 一个列族下可以有多个列名, 但是一个列名只能被一个列族所管理, 列的数量可以达到上百万, 在建表的时候, 不需要指定的, 在插入数据的时候, 动态执行即可
4- timestamp(时间戳): 在hbase的表中, 每一个单元格的数据都是有时间戳的概念的, 默认 为插入数据的时间, 当然也可以人为指定
5- version(版本号): 在hbase中每一个单元格都是有版本号的概念的, 可以基于版本管理, 存储每一个单元格的历史变化信息
默认版本号为1, 表示只保留最新的版本数据
6- cell(单元格): rowkey + 列族 + 列名 + 列值
注意: 在建表的时候, 必须指定两项内容: 表名 + 列族