HBase基础,
记录HBase的学习历程,趟过的坑和总结。内容较多,请先查看目录。
介绍
那HBase是什么呢?我们能用它来做什么?带着这两个疑问,我们一起学习
- HBase是一个NOSQL数据库,能够完成大数据的秒级查询
- HBase的数据真正存储的地方还是在HDFS
- HBase的核心思想 / Bigtable(大表)原理:将所有数据存入一张表中,以存储空间换性能
HBase的几个概念
- 表:存储和管理数据,Bigtable大表,而不是二维表
- 行键:不唯一且不为空,相同行键作为一条记录
- 列族:列的集合(创建大表时预先定义好列族,列是插入数据时HBase自动创建的)
- 时间戳:列的一个属性
- 单元格:一个单元格存储多个数据
HBase表的特点(五大)
- 大:一张表有上亿行、上百万的列
- 面向列:列式数据库,按照列来存储数据的
- 稀疏:因为空列不占据存储空间
- 无模式:不同行可以有截然不同的列
- 数据类型非常单一:只有字符串类型,没有其他数据类型
安装
- 下载 https://hbase.apache.org/downloads.html
- 解压 tar -zxvf hbase-1.3.3-bin.tar.gz
- 添加环境变量HBASE_HOME
- vi /ect/profile
export HBASE_HOME=/root/training/hbase-1.3.3 export PATH=$HBASE_HOME/bin:$PATH
- source /etc/profile
- vi /ect/profile
HBase的四种模式
本地模式
- 特点:1.不需要HDFS,将数据直接保存在本地磁盘上;2.测试HBase数据库的增删改查功能
- 修改hbase-env.sh,添加JAVA_HOME的路径
- 修改hbase-site.xml
<!--配置HBase在本地磁盘上数据保存的路径--> <property> <name>hbase.rootdir</name> <value>file:///root/training/hbase-1.3.3/data</value> </property>
- 启动 start-hbase.sh,控制台输出以下日志即启动成功
starting master, logging to /root/training/hbase-1.3.3/logs/hbase-root-master-bigdata11.out
输入jps也能看到进程HMaster
伪分布式模式
- 特点:单机虚拟出多个节点(HMaster、Regionserver),具备HBase的所有功能,HBase数据保存在HDFS上
- 修改hbase-env.sh,添加JAVA_HOME的路径,设置HBASE_MANAGES_ZK=true(缺省值也是true)
配置HBase管理Zookeeper的方式有两种,这里使用HBase自带的zookeeper(默认使用自带)
- 修改hbase-site.xml
<!--配置HBase在HDFS上数据保存的路径--> <property> <name>hbase.rootdir</name> <value>hdfs://bigdata11:9000/hbase</value> </property> <!--配置HBase在HDFS上数据备份的个数--> <property> <name>dfs.replication</name> <value>1</value> </property> <!--配置HBase集群的模式--> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!--配置zookeeper地址信息--> <property> <name>hbase.zookeeper.quorum</name> <value>bigdata11</value> </property> <!--配置zookeeper数据存放路径--> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/data/myzk</value> </property>
- 先start-all.sh启动Hadoop集群,再start-hbase.sh启动HBase集群,输入后能够看到控制台输出
查看java进程jps
全分布式模式
基于Hadoop集群搭建,注意各节点时间要同步,
否则Hadoop执行MapReduce就会报错,HBase的Regionserver会自动停止
- 集群规划
bigdata12 HMaster、zookeeper
bigdata13 Regionserver
bigdata14 Regionserver - 给上面三个节点添加环境变量HBASE_HOME,然后source ~/.bash_profile
- 修改hbase-env.sh,添加JAVA_HOME的路径,配置HBase管理Zookeeper的方式(默认使用自带)
- 修改hbase-site.xml
<!--配置HBase在HDFS上数据保存的路径--> <property> <name>hbase.rootdir</name> <value>hdfs://bigdata12:9000/hbase</value> </property> <!--配置HBase在HDFS上数据备份的个数--> <property> <name>dfs.replication</name> <value>2</value> </property> <!--配置HBase集群的模式--> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!--配置zookeeper地址信息--> <property> <name>hbase.zookeeper.quorum</name> <value>bigdata12</value> </property> <!--配置zookeeper数据存放路径--> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/data/myzk</value> </property> <!--允许HBase集群时间误差的最大值,单位是:毫秒--> <property> <name>hbase.master.maxclockskew</name> <value>180000</value> </property>
- 修改regionservers
bigdata13
bigdata14 - bigdata12配置好后,把本地整个文件夹拷贝到其他两个节点
scp -r hbase-1.3.3 root@bigdata13:/root/training
scp -r hbase-1.3.3 root@bigdata14:/root/training - 先start-all.sh启动Hadoop集群,再start-hbase.sh启动HBase集群,然后查看各个节点的进程
HA模式
部署HA前,访问http://bigdata12:16010
Hadoop的HA模式需要单独搭建,而HBase的HA模式不需要单独搭建
在从节点bigdata13或bigdata14手动启动:hbase-daemon.sh start master
原理:多几个HMaster
小技巧
如果你用的终端模拟工具是Xshell的话,在使用hbase shell的脚本时,肯定也发现了不能使用delted和back建回退删除,解决方法如下
操作HBase
参考资料:https://www.cnblogs.com/shadowalker/p/7350484.html
HBase数据保存的过程(Region的分裂)
HDFS:数据的倾斜 功能:数据平衡—>数据的拷贝(移动)
hdfs balancer run a cluster balancing utility
HBase:数据倾斜的问题 数据平衡----->数据的移动
问题:网络造成巨大的压力
解决方案:多增加从节点的个数
Java API 操作HBase
需要的依赖
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-common</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.3.1</version>
</dependency>
HBase的过滤器
- 列值过滤器:select * from emp where sal=3000;
SingleColumnValueFilter - 列名前缀过滤器:查询员工的姓名 select ename from emp;
ColumnPrefixFilter - 多个列名前缀过滤器:查询员工的姓名和薪水: select ename,sal from emp;
MultipleColumnPrefixFilter - 行键过滤器:通过rowkey查询,类似通过Get查询数据
RowFilter - 组合多个过滤器查询数据:where 条件1 and(or) 条件2
如查询sal=3000的员工姓名,需要用到列值过滤器+列名前缀过滤器
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL); //and
filterList.addFilter(singleColumnValueFilter);
filterList.addFilter(columnPrefixFilter);
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。