一起学HBase

HBase: 一个构建在HDFS之上的/分布式的/面向列的开源数据库.

HBase概念:

一个构建在HDFS(高可靠, 有备份)之上的, 分布式的(分而治之, 提高效率), 面向列(不同于其他数据库都是以一行为一条记录)的开源数据库. 由Google BigTable的开源实现, 主要用于海量数据存储, 是hadoop生态圈中很重要的一部分.

HBase表的特点

  • 大: 一个表可以有数十亿行, 上百万列.
  • 面向列: 在HBase表中数据都是按照列来存储.
  • 稀疏: 对于null值, 不占用存储空间.
  • 数据类型单一性: HBase表中数据类型都是字符串string.
  • 无模式: 每行都有一个可以排序的主键和任意多的列, 列可以根据需要动态的增加, 同一张表中不同的行可以有完全不同的列.

HBase 和 RDBMS 的区别

  • 数据类型: HBase中的数据类型都是string字符串.
  • 数据操作: HBase只有普通的增删改查操作, 没有表之间的关联查询
  • 存储模式: HBase是基于列式存储的, 而RDBMS是基于行式存储的.
  • 应用场景: HBase适合存储大量数据, 查询效率很高.

HBase专业术语和数据模型

HBase专业术语

  1. 主键:(Row Key)
    • 用来检索记录的主键,
    • 访问HBase表中的行, 只有三种方式:
      1. 通过单个Row key的方式查询, 只能查询一条数据
      2. 通过Row key的range来查询, 可以查到一组数据
      3. 全表扫描
  2. 列族: (Column Family)
    • 可以理解为: 在字段前面加上一个限定符.
    • 在创建表的时候, 必须要声明列族, 一个列族可以包含多个列
    • 列族没有数据类型, 是一些列的集合.
    • 一个列族所有成员都有着相同的前缀.
  3. 时间戳和存储单元cell
    • 存储单元cell:由 row 和 column 确定一个存储单元
    • 每个cell都存储这同一份数据的多个版本
    • 每个cell中, 不同版本的数据都是通过时间的倒序存储.
    • {row, column, version}元祖就是HBase中的一个cell

HBase存储细节

  1. 每个列族存储在HDFS上的一个单独的文件中.
  2. key和version会在每个列族中存储一份.
  3. 空值是不会被存储的.

HBase伪分布式搭建过程.(适合学习)

真正开发中使用的是 集群模式. 而适合学习的是伪分布式模式.

Linux环境搭建. 虽然前面有些, 但是再温习下搭建过程.

关闭防火墙和SELinux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
禁止掉ipv6网络: vim /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
然后使配置生效:
sysctl -p
输出配置的信息


关闭防火墙:centos7 firewalld, centos6 是iptables
systemctl status firewalld 查看状态
systemctl stop firewalld 停止


关闭selinux
输入: sestatus 查看selinux是否是enforcing
然后修改配置文件 将该状态关闭 vim /etc/selinux/config
把里面的内容: SELINUX=ENFORCING 修改为: SELINUX=disabled 即可.

配置IP

1
2
在centos中设置成桥接模式. 即可.
使用ifconfig 或者 ip addr查看分配的ip地址.

配置主机名和ip映射

1
2
3
4
5
6
7
vim /etc/sysconfig/network
设置成: HOSTNAME=hadoop
重启下生效

sudo vim /etc/hosts文件:
添加一条记录:
192.168.1.239 master.hadoop

设置SSH免密码登录

1
2
3
4
5
6
7
8
9
10
11
1. 生成公钥和私钥:(在哪个用户下生成就是那个用户的秘钥对. 根据用户来区分的)
cd ~/.ssh/
ssh-keygen -t rsa 使用rsa加密算法, 生成一对秘钥. 然后直接回车就可.
然后查看该目录下生成了两个文件: id_rsa, id_rsa.pub, 一个公钥, 一个私钥.

2. 将公钥拷给自己
ssh-copy-id localhost
会生成一个文件authorized_keys
当然, 也可以 使用 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 即可.

3. 然后就可以 start-all.sh 就可以直接启动hadoop, 过程中就不用输出密码了.

安装JDK

1
2
3
4
5
6
7
8
9
10
jdk:
[jdk1.8.rpm](wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/jdk-8u151-linux-x64.rpm
rpm -rvh xxxx.rpm


hadoop:
http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.5/hadoop-2.7.5.tar.gz
tar -zxvf xxx.tar.gz

最后配置相应的环境变量.

安装HBase

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
hbase1.1.13

wget http://mirror.bit.edu.cn/apache/hbase/1.1.13/hbase-1.1.13-bin.tar.gz

tar -zxvf ...tar.gz

配置环境:

1. hbase-env.sh
配置JAVA_HOME=xxxx

2. hbase-site.xml
可以到官网 hbase.apache.org -> getting start 拷贝
<!-- 将hbase配置到hdfs中. -->
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.1.239:9000/hbase</value>
</property>
<!-- zookeeper的数据目录, 必须实现创建好, 可以创建在hadooop目录下data文件 -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/hadoop/data</value>
</property>

<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
</configuration>

3. 修改regionservers
添加: 192.168.1.239

4. 启动hbase
bin/hbase-daemon.sh start zookeeper
bin/hbase-daemon.sh start master
bin/hbase-daemon.sh start regionserver

jps查看这个三个进程是否启动成功.

5. 通过web console查看 web ui
192.168.1.239:16010 访问.

HBase在HDFS上的目录结构

  • /hbase/.tmp: 临时目录,当对表做创建和删除的时候, 会将表先move到该目录下, 然后进行操作
  • /hbase/data: 核心目录, 存储HBase表的数据.
  • 默认情况下:/hbase/data下有两个目录
    • /hbase/data/default: 当创建表的时候, 没有指定namespace时, 表就会创建在此目录下.
    • /hbase/data/hbase: 系统默认创建的表, 里面包含两张表: meta表和namespace表
  • /hbase/hbase: id: 存储的是集群唯一的cluster id(uuid)
  • /hbase/hbase.version: 集群的版本号
  • /hbase/oldWALs: 当WALs目录的logs没有用之后, 就会将这些logs移动此目录下. HMaster会定期清理.

HBae的Shell 操作

基本操作:

1
2
3
4
5
6
7
8
9
1. 创建表: create '表名称','列族名1','列族名2','列族名...'
2. 添加记录: put '表名称','行名称(rowkey)','列名称','值'
3. 查看记录: get '表名称','行名称'
4. 查看表中记录数: count '表名称'
5. 删除记录: delete '表名称','行名称','列名称;'
6. 删除一张表: 1. 先屏蔽表 disable '表名称' 2. drop '表名称'
7. 查看所有记录: scan '表名称'
8. 查看表中某个列中所有的数据: scan '表名称',{COLUMNS=>'列族名称:列名称'}
9. 更新记录: 重写添加一遍进行覆盖.

组命令:

1
2
3
4
5
6
7
8
9
10
11
12
general
命令: status, table_help, version, whoami
Namespace
命令: alter_namespace, create_namespce, describle_namespace, drop_namespace, list_namespce, list_namespace_tables
visibility labels
Replication
ddl
Security
dml
Tools
Quotas
....

hbase Shell

命令行中输出hbase shell进入shell模式

输入: help 可以查看提示.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
1. 命令行中输出hbase shell进入shell模式(要先把hbase配置到环境变量中/etc/profile)
2. 创建表: create 'user', 'info'
0 row(s) in 2.8310 seconds
=> Hbase::Table - user
3. 查看所有表: list
TABLE
user
1 row(s) in 0.0370 seconds

=> ["user"]
4. 插入一条数据:
put 'user','rowkey001','info:name', 'dottie'
put 'user','rowkey002','info:name', 'daejong'
put 'user','rowkey002','info:age', '23'

5. 查看表信息:
scan 'user'
输出结果:
ROW COLUMN+CELL
rowkey001 column=info:name, timestamp=1516367389405, value=dottie
rowkey002 column=info:age, timestamp=1516367502487, value=23
rowkey002 column=info:name, timestamp=1516367464267, value=daejong
2 row(s) in 0.0360 seconds`

6. 根据rowkey查看某条信息:
get 'user', 'rowkey001'
输出:
COLUMN CELL
info:name timestamp=1516367389405, value=dottie
1 row(s) in 0.0760 seconds

get 'user', 'rowkey002'
输出:
COLUMN CELL
info:age timestamp=1516367502487, value=23
info:name timestamp=1516367464267, value=daejong
2 row(s) in 0.0080 seconds

7. 根据rowkey删除某条信息:
deleteall 'user', 'rowkey001'
0 row(s) in 0.1750 seconds

8. 删除一张表
disable 'student'
drop 'student'

9. 查看所有的namespace
list_namespace
输出:
NAMESPACE
default
hbase
2 row(s) in 0.0590 seconds

10 .创建一个namespace
create_namespace 'ns1'
查看:
list_namespace
输出:
NAMESPACE
default
hbase
ns1
3 row(s) in 0.0400 seconds

11. 删除一个namespace
drop_namespace 'ns1'
0 row(s) in 0.0850 seconds

最后

关于HBase的搭建和一些表的定义和创建. 到这里算是结束了. 接下来的博客中会继续深入记录HBase的进阶知识.