Sqoop
概述
- sqoop是Apache提供的工具,用于HDFS和关系型数据库之间数据的导入与导出
- 可以从HDFS导出数据到关系型数据库,
HBase
- HBase是Doug根据Google的Big Table来实现的,HBase与Big Table的原理一模一样,只是实现的语言不通
- HBase和Hadoop版本的对应关系比较复杂
- HBase借鉴列存储的思想,但是底层依然依靠键值对对存储
- HBase作为非关系型数据库,不支持SQL,提供了一套全新的命令
- HBase中没有表关联(外键、join)的说法
- 在HBase中,强调列族但是不强调列
- HBase的数据类型要么是数字要么是字符串
- HBase适合存储稀疏数据(某一些数据并不完整)——结构化(数据本身有固定结构,可以利用数据库中的一张或几张表来进行固定存储)和半结构化(数据本身有固定结构,但是无法利用固定的一张或几张表来进行存储)数据
- 如果表被禁用,则禁止任何操作(增删改查)
- 不同列族下边允许有相同列
- 行键:RowKey
- 在HBase中没有主键的概念,取而代之的是行键
- 在定义表时不需要定义行键,行键是在向表中添加数据时手动指定的
- 列族/列簇:Colume Family
- 一个列族就类似于mysql中的某一张表,对应于mysql中的表结构,把经常需要查询的某几列放到一个列族中。例如MySQL一张学生表,有姓名、学号、科目、排名、总成绩等很多列,我们可能只需要查看排名和总成绩这两列,二其他几列不查询,因此就可以把排名和总成绩放到一个列族,把其他列放到另一个列族。
- HBase中一张表至少包含一个列族,理论上不限制列族的数量。
- 一个列族可以包含零到多个列,列的数量不做限制,列可以动态增删
- Cell
- 在HBase中,通过行键+列族+列+版本号可以锁定唯一一条数据,这个结构称之为一个Cell
- 每一个Cell中只包含一条数据
- NameSpace
- 类似于关系型数据库中的database,可以用于区分不同的表
- HBase搭建完成之后,默认有2个名称空间:default和hbase
- hbase存放的是HBase本身的额一些配置信息
- 如果没有指定,那么表默认是存放在default中
- 增(put)删(delete、deleteall)改(put)查(get,scan)
- HBase作为数据库,提供了完整的增删改查的功能,HBase是基于HDFS来进行存储的,HDFS的特点是允许一次写入多次读取,不允许修改但是允许追加,此时HBase如何实现“改”的功能?HBase并没只有修改已经写入的数据,而是在尾部追加数据,并且给每一条数据添加时间戳,在获取数据的时候,只需要获取时间戳最大的数据,就是最新的数据,这个时间戳在HBase中称为版本(VERSION)
- 在HBase中,在获取数据的时候,默认获取的是最新版本的1条数据
- 在HBase中,一个表在建立的时候如果没有指定,那么最多只允许对外获取一个版本的数据,如果想要对外获取多个版本的数据,在建表的时候需要指定
HBase完全分布式搭建
-
环境:3个Zookeeper+3个HBase+1个Hadoop伪分布式
-
在第一台服务器上开启hadoop伪分布式
-
在三台服务器上开启Zookeeper并检查状态,一个leader两个follower
-
在第一台服务器上上传并解压HBase安装包
-
进入HBase安装目录的conf目录
-
编辑hbase-env.sh文件:
- JAVA_HOME: export JAVA_HOME=/home/software/jdk1.8
- export HBASE_MANAGES_ZK=false
- 保存退出,使文件重新生效
-
编辑hbase-site.xml
<configuration> <property> <!--hbase的数据本质上还是存储在hdfs上--> <name>hbase.rootdir</name> <value>hdfs://hadoop01:9000/hbase</value> </property> <property> <!--配置分布式--> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <!--配置Zookeeper的连接地址与端口号--> <name>hbase.zookeeper.quorum</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value> </property> </configuration>
-
编辑regionservers:配置三台主机的主机名称
hadoop01 hadoop02 hadoop03
-
回到software目录下,将hbase安装目录远程拷贝到另外两台主机上:
scp -r hbase-1.3.1 root@hadoop02:/home/software/
-
进入hbase安装目录的bin下,启动hbase服务(先启动第一台)
sh start-hbase.sh
,启动后jps
查看进程-
第一台主机的进程有:
2480 DataNode 2912 NodeManager 7030 HMaster 7158 HRegionServer 2808 ResourceManager 6666 QuorumPeerMain 2349 NameNode 2654 SecondaryNameNode 7566 Jps
-
第二台主机的进程有:
2738 HRegionServer 3220 Jps 2492 QuorumPeerMain
-
第三台主机的进程有:
2728 HRegionServer 3210 Jps 2493 QuorumPeerMain
-
常用命令
命令 | 解释 |
---|---|
status | 查看HBase的状态 |
version | 查看HBase的版本信息 |
whoami | 查看当前用户 |
create ‘person’,{NAME=>‘basic’},{NAME=>‘info’},{NAME=>‘expand’} create ‘person’,‘p1’,‘basic’,‘info’,‘expand’(简写形式) | 创建person表,其中包含basic、info、expand三个列族 |
create ‘person’,‘p1’,‘basic:name’,‘Tom’ | 向person表中列族name列添加数据。行键为p1 |
get ‘person’,‘p1’,{COLUMN=>‘basic’} get ‘person’,‘p1’,{COLUMN=>[‘basic’,‘info’]} get ‘person’,‘p1’,‘info’,‘basic’ | |
scan ‘person’,{COLUMN=>[‘basic’,[info]]} scan 'person,{COLUMN=>‘basic’}' 该命令不允许简写 | |
scan ‘person’,{COLUMN=>‘basic:name’} | 查询指定列的数据 |
scan ‘person’,{COLUMN=>‘basic’} | 查询指定列族的数据 |
delete ‘person’,‘d3’,‘info:height’ | 删除行键为d3的info列族的height列的数据 |
deleteall ‘person’,‘d3’ | 删除一行数据 |
disable ‘person’ | 禁用表 |
is_disabled ‘person’ | 查询表的禁用状态 |
is_enabled ‘person’ | 表是否启用 |
enable ‘person’ | 启用表 |
drop ‘person’ | 删除表(必须被禁用) |
list | 列出所有表 |
exist ‘**’ | 查询表是否存在 |
create ‘person’,{NAME=>‘basic’,VERSIONS=>3},{NAME=>‘info’,VERSIONS=>5} | 创建表并设置可查询最大版本数 |