1.HBase基础介绍
1.1 NoSQL简介
1.1.1什么是NoSQL
NoSQL:not only SQL,非关系型数据库
NoSQL是一个通用术语
- 指不遵循传统RDBMS模型的数据库
- 数据是非关系的,且不使用SQL作为主要查询语言
- 解决数据库的可伸缩性和可用性问题
- 不针对原子性或一致性问题
1.1.2为什么使用NoSQL
互联网的发展,传统关系型数据库存在瓶颈
- 高并发读写
- 高存储量
- 高可用性
- 高扩展性
- 低成本
NoSQL和关系型数据库对比
主要有以下一些区别
对比 | NoSQL | 关系型数据库 |
---|---|---|
常用数据库 | HBase、MongoDB、Redis | Oracle、DB2、MySQL |
存储格式 | 文档、键值对、图结构 | 表格式,行和列 |
存储规范 | 鼓励冗余 | 规范性,避免重复 |
存储扩展 | 横向扩展,分布式 | 纵向扩展(横向扩展有限) |
查询方式 | 结构化查询语言SQL | 非结构化查询 |
事务 | 不支持事务一致性 | 支持事务 |
性能 | 读写性能高 | 读写性能差 |
成本 | 简单易部署,开源,成本低 | 成本高 |
1.1.3NoSQL的特点
-
最终一致性
-
应用程序增加了维护一致性和处理事务等职责
-
冗余数据存储
-
NoSQL != 大数据
- NoSQL产品是为了帮助解决大数据存储问题
- 大数据不仅仅包含数据存储的问题
- Hadoop
- Kafka
- Spark, etc
1.1.4NoSQL基本概念
- 三大基石
- CAP、BASE、 最终一致性
- Indexing(索引)、Query(查询)
- MapReduce
- Sharding
- CAP理论
- 数据库最多支持3个中的2个
- Consistency(一致性)
- Availability(可用性)
- Partition Tolerance(分区容错性)
- NoSQL不保证“ACID”
- 提供“最终一致性”
- BASE
- Basically Availble(基本可用)
- 保证核心可用
- Soft-state(软状态)
- 状态可以有一段时间不同步
- Eventual Consistency(最终一致性)
- 系统经过一定时间后,数据最终能够达到一致的状态
- 核心思想是即使无法做到强一致性,但应用可以选择适合的方式达到最终一致性
- 最终一致性
- 最终结果保持一致性,而不是时时一致
- 如账户余额,库存量等数据需强一致性
- 如catalog等信息不需要强一致性
- Causal consistency(因果一致性)
- Read-your-writes consistency
- Session consistency
索引和查询
- Indexing(索引)
大多数NoSQL是按key进行索引
部分NoSQL允许二级索引
HBase使用HDFS,append-only
批处理写入Logged
重新创建并排序文件 - Query(查询)
没有专门的查询语言,通常使用脚本语言查询
有些开始支持SQL查询
有些可以使用MapReduce代码查询
MapReduce、Sharding
- MapReduce
不是Hadoop的MapReduce,概念相关
可进行数据的处理查询 - Sharding(分片)
一种分区模式
可以复制分片
有利于灾难恢复
1.1.5NoSQL分类
主要分为以下四类
分类 | 举例 | 典型应用场景 |
---|---|---|
键值存储数据库(key-value) | Redis, MemcacheDB, Voldemort | 内容缓存等 |
列存储数据库(WIDE COLUMN STORE) | Cassandra, HBase | 应对分布式存储的海量数据 |
文档型数据库(DOCUMENT STORE) | CouchDB, MongoDB | Web应用(可看做键值数据库的升级版) |
图数据库(GRAPH DB) | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等,专注于构建关系图谱 |
键值存储数据库(Key-Value)
列存储数据库(Wide Column Store)
文档型数据库(Document Store)
图数据库(Graph Databases)
1.1.6NoSQL和BI、大数据的关系
- BI(Business Intelligence):商务智能
它是一套完整的解决方案
BI应用涉及模型,模型依赖于模式
BI主要支持标准SQL,对NoSQL支持弱于关系型数据库 - NoSQL和大数据相关性较高
通常大数据场景采用列存储数据库
如:HBase和Hadoop
1.2.HBase介绍
1.2.1HBase概述
- HBase是一个领先的NoSQL数据库
是一个面向列存储的数据库
是一个分布式hash map
基于Google Big Table论文
使用HDFS作为存储并利用其可靠性 - HBase特点
数据访问速度快,响应时间约2-20毫秒
支持随机读写,每个节点20k~100k+ ops/s
可扩展性,可扩展到20,000+节点
1.2.2HBase发展历史
时间 | 事件 |
---|---|
2006年 | Google发表了关于Big Table论文 |
2007年 | 第一个版本的HBase和Hadoop0.15.0一起发布 |
2008年 | HBase成为Hadoop的子项目 |
2010年 | HBase成为Apache顶级项目 |
2011年 | Cloudera基于HBase0.90.1推出CDH3 |
2012年 | HBase发布了0.94版本 |
2013-2014 | HBase先后发布了0.96版本/0.98版本 |
2015-2016 | HBase先后发布了1.0版本、1.1版本和1.2.4版本 |
2017年 | HBase发布1.3版本 |
2018年 | HBase先后发布了1.4版本和2.0版本 |
1.2.3HBase用户群体
1.2.4HBase应用场景
- 应用场景-1
增量数据-时间序列数据
高容量,高速写入
- 应用场景-2
信息交换-消息传递
高容量,高速读写
- 应用场景-3
内容服务-Web后端应用程序
高容量,高速读写
1.2.5Apache HBase生态圈
HBase生态圈技术
Lily – 基于HBase的CRM
OpenTSDB – HBase面向时间序列数据管理
Kylin – HBase上的OLAP
Phoenix – SQL操作HBase工具
Splice Machine – 基于HBase的OLTP
Apache Tephra – HBase事务支持
TiDB – 分布式SQL DB
Apache Omid - 优化事务管理
Yarn application timeline server v.2 迁移到HBase
Hive metadata存储可以迁移到HBase
Ambari Metrics Server将使用HBase做数据存储
1.2.6HBase架构
1.物理架构
HBase采用Master/Slave架构
-
HMaster的作用
是HBase集群的主节点,可以配置多个,用来实现HA
管理和分配Region
负责RegionServer的负载均衡
发现失效的RegionServer并重新分配其上的Region -
RegionServer
RegionServer负责管理维护Region
一个RegionServer包含一个WAL、一个BlockCache (读缓存)和多个Region
一个Region包含多个存储区,每个存储区对应一个列族
一个存储区由多个StoreFile和MemStore组成
一个StoreFile对应于一个HFile和一个列族
HFile和WAL作为序列文件保存在HDFS上
Client与RegionServer交互
- Region和Table
2.逻辑架构Row
- Rowkey(行键)是唯一的并已排序
- Schema可以定义何时插入记录
- 每个Row都可以定义自己的列,即使其他Row不使用
- 相关列定义为列族
- 使用唯一时间戳维护多个Row版本
- 在不同版本中值类型可以不同
- HBase数据全部以字节存储
1.2.7HBase数据管理
- 数据管理目录
- 系统目录表hbase:meta
- 存储元数据等
- HDFS目录中的文件
- Servers上的region实例
- 系统目录表hbase:meta
- HBase数据在HDFS上
- 可以通过HDFS进行修复File
- 修复路径
- RegionServer->Table->Region->RowKey->列族
1.2.8HBase架构特点
- 强一致性
- 自动扩展
- 当Region变大会自动分割
- 使用HDFS扩展数据并管理空间
- 写恢复
- 使用WAL(Write Ahead Log)
- 与Hadoop集成
1.3.HBase数据模型
逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map。
1.3.1 HBase逻辑结构
1.3.2 HBase物理存储结构
1.3.3 数据模型
1.Name Space
命名空间,类似于关系型数据库的DatabBase概念,每个命名空间下有多个表。HBase有两个自带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default表是用户默认使用的命名空间。
2.Region
类似于关系型数据库的表概念。不同的是,HBase定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往HBase写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase能够轻松应对字段变更的场景。
3.Row
HBase表中的每行数据都由一个RowKey和多个Column(列)组成,数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索,所以RowKey的设计十分重要。
4.Column
HBase中的每个列都由Column Family(列族)和Column Qualifier(列限定符)进行限定,例如info:name,info:age。建表时,只需指明列族,而列限定符无需预先定义。
5.Time Stamp
用于标识数据的不同版本(version),每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入HBase的时间。
6.Cell
由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元。cell中的数据是没有类型的,全部是字节数组形式存贮。
2.HBase的安装
2.1环境准备
安装了Hadoop(如果只是安装单机版hbase,zookeeper使用hbase内置的即可)如果需要安装伪分布式或完整分布式则需要先安装zookeeper
2.2解压安装
教程所需的包:链接: https://pan.baidu.com/s/1uM6dAHhP9_ttHViyZsSi-A 提取码: 7ehp
- 将压缩包上传到opt文件夹,并解压
tar -zxvf hbase-1.2.0-cdh5.14.2.tar.gz
- 将文件夹改名为hbase:mv
hbase-1.2.0-cdh5.14.2 hbase
2.3配置环境变量
- 输入
vi /etc/profile
- 插入
export HBASE_HOME=/opt/hbase
export PATH=$HBASE_HOME/bin
- 输入
source /etc/profile
使环境变量生效
2.4配置文件
- 进入
hbase
文件夹下面的conf
文件夹:cd /opt/hbase/conf
配置hbase-env.sh
- 修改
vi hbase-env.sh
- 插入
export JAVA_HOME=/opt/jdk1.8.0_221
- 注释
#export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"
#xport HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"
配置 hbase-site.sh
-
修改
vi hbase-site.sh
-
插入(注意修改ip)
<!—hbase.rootdir 将数据写入哪个目录 如果是单机版只要配置此属性就可以,value中file:/绝对路径,如果是分布式则配置与hadoop的core-site.sh服务器、端口以及zookeeper中事先创建的目录一致-->
<property>
<name>>hbase.rootdir</name>
<value>hdfs://192.168.83.35:9000/hbase</value>
</property>
<!—单机模式不需要配置,分布式配置此项为true-->
<property>
<name>hbase.cluster.distributed</name>
<value>false</value>
</property>
<!—单机模式不需要配置 分布是配置此项为zookeeper指定的物理路径名-- >
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/cm/hbase</value>
</property>
3.Shell常用命令
首先启动master
hbase-daemon.sh start master
使用hbase shell可以进入一个shell命令行界面!出现下图代表成功
HBase shell
3.1其他操作
1.查看集群状态
使用status可以查看集群状态,默认为summary,可以选择‘simple’和‘detailed’来查看详情。
hbase(main):001:0> status
1 active master, 0 backup masters, 1 servers, 0 dead, 7.0000 average load
2.查看版本
hbase(main):002:0> version
1.2.0-cdh5.14.2, rUnknown, Tue Mar 27 13:31:54 PDT 2018
3.查看操作用户及组信息
hbase(main):004:0> whoami
root (auth:SIMPLE)
groups: root
4.查看表操作信息
table_help
5.查看帮助信息
help
6.查看具体命令的帮助
help 'get'
注意引号是必须的!
3.2 表的操作
3.2.1 list:列出HBase的所有表
hbase(main):007:0> list
TABLE
abc
cust
customer
emp_basic
4 row(s) in 0.0510 seconds
list后可以使用*等通配符来进行表的过滤!
hbase(main):016:0> list 'c.*'
TABLE
cust
customer
2 row(s) in 0.0060 seconds
3.2.2 create:创建一个表
创建表时,需要指定表名和列族名,而且至少需要指定一个列族,没有列族的表是没有任何意义的。
创建表时,还可以指定表的属性,表的属性需要指定在列族上!
格式:
create '表名', { NAME => '列族名1', 属性名 => 属性值}, {NAME => '列族名2', 属性名 => 属性值}, …
如果你只需要创建列族,而不需要定义列族属性,那么可以采用以下快捷写法:
create'表名','列族名1' ,'列族名2', …
hbase(main):001:0> create 'student','info'
3.2.3 desc:提供了一个表的描述
hbase(main):003:0> desc 'student'
Table student is ENABLED
student
COLUMN FAMILIES DESCRIPTION
{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CE
LLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_V
ERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0320 seconds
3.2.4 disable 禁用表
停用表后,可以防止在对表做一些维护时,客户端依然可以持续写入数据到表。一般在删除表前,必须停用表。
在对表中的列族进行修改时,也需要停用表。
hbase(main):004:0> disable 'student'
disable_all ‘正则表达式’ 可以使用正则来匹配表名。
is_disabled 可以用来判断表是否被停用。
hbase(main):006:0> is_disabled 'student'
true
3.2.5 enable 启用一个表
和停用表类似。enable ‘表名’用来启用表,is_enabled ‘表名’用来判断一个表是否被启用。
enable_all ‘正则表达式’可以通过正则来过滤表,启用复合条件的表。
3.2.6. exists 验证表是否存在
hbase(main):007:0> exists 'student'
Table student does exist
3.2.7. count:统计行数
hbase(main):014:0> count 'student'
0 row(s) in 0.0260 seconds
=> 0
3.2.8. drop 从HBase中删除表
删除表前,需要先disable表,否则会报错。ERROR: Table xxx is enabled. Disable it first.
hbase(main):011:0> drop 'person'
3.2.9 truncate:清空表
hbase(main):015:0> truncate 'student'
Truncating 'student' table (it may take a while):
- Disabling table...
- Truncating table...
0 row(s) in 3.4410 seconds
3.2.10 get_splits:获取Region
获取表所对应的Region个数。每个表在一开始只有一个region,之后记录增多后,region会被自动拆分。
hbase(main):017:0> get_splits 'student'
Total number of splits = 1
=> []
3.2.11 alter:修改表
alter命令可以修改表的属性,通常是修改某个列族的属性。
增加:alter ‘表名’,NAME=>‘列簇名’
删除:alter ‘表名’,NAME=>‘列簇名’,METHOD=>‘delete’
hbase(main):021:0> alter 'student','studentno'
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9240 seconds
hbase(main):028:0> alter 'student',NAME=>'studentno',METHOD=>'delete'
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9420 seconds
3.3数据操作
3.3.1 scan 扫描并返回表数据
scan命令可以按照rowkey的字典顺序来遍历指定的表的数据。
scan ‘表名’:默认当前表的所有列族。
scan ‘表名’,{COLUMNS=> [‘列族:列名’],…} : 遍历表的指定列
scan 'emp_basic',{COLUMNS=>'emp:name'}
scan ‘表名’, { STARTROW => ‘起始行键’, ENDROW => ‘结束行键’ }:指定rowkey范围。如果不指定,则会从表的开头一直显示到表的结尾。区间为左闭右开。
(由于rowkey并不是整型,所以不会按照数字顺序筛选)
scan 'emp_basic',{STARTROW=>'100',ENDROW=>'200'}
scan ‘表名’, { LIMIT => 行数量}: 指定返回的行的数量
scan 'emp_basic',{LIMIT=>5}
scan ‘表名’, {VERSIONS => 版本数}:返回cell的多个版本
scan 'emp_basic',{VERSIONS=>5}
scan ‘表名’, { TIMERANGE => [最小时间戳, 最大时间戳]}:指定时间戳范围
注意:此区间是一个左闭右开的区间,因此返回的结果包含最小时间戳的记录,但是不包含最大时间戳记录
scan ‘表名’, { RAW => true, VERSIONS => 版本数}
显示原始单元格记录,在Hbase中,被删掉的记录在HBase被删除掉的记录并不会立即从磁盘上清除,而是先被打上墓碑标记,然后等待下次major compaction的时候再被删除掉。注意RAW参数必须和VERSIONS一起使用,但是不能和COLUMNS参数一起使用。
scan ‘表名’, { FILTER => “过滤器”} and|or { FILTER => “过滤器”}: 使用过滤器扫描
3.3.2 put
put可以新增记录还可以为记录设置属性。
put ‘表名’, ‘行键’, ‘列名’, ‘值’
put ‘表名’, ‘行键’, ‘列名’, ‘值’,时间戳
put ‘表名’, ‘行键’, ‘列名’, ‘值’, { ‘属性名’ => ‘属性值’}
put ‘表名’, ‘行键’, ‘列名’, ‘值’,时间戳, { ‘属性名’ =>‘属性值’}
put 'student','1001','info:name','Nick'
put 'student','1001','info:sex','male'
put 'student','1001','info:age','18'
put 'student','1002','info:name','Janna'
put 'student','1002','info:sex','female'
put 'student','1002','info:age','20'
3.3.3 get
get支持scan所支持的大部分属性,如COLUMNS,TIMERANGE,VERSIONS,FILTER
get 'student','1001'
3.3.4 delete
删除某rowkey的全部数据
deleteall 'student','1001'
删除某rowkey的某一列数据:
delete 'student','1002','info:sex'
4.整合Phoenix
4.1Phoenix简介
4.1.1Phoenix定义
Phoenix是HBase的开源SQL皮肤。可以使用标准JDBC API代替HBase客户端API来创建表,插入数据和查询HBase数据。
4.1.2Phoenix特点
1)容易集成:如Spark
,Hive,Pig,Flume和Map Reduce;
2)操作简单:DML命令以及通过DDL命令创建和操作表和版本化增量更改;
3)支持HBase二级索引
创建。
4.1.3Phoenix架构
4.2.Phoenix快速入门
4.2.1安装
1.软件下载
链接: https://pan.baidu.com/s/1oLONAYPZV_M2oyN2-HR_sg 提取码: 6847
2.安装bsdtar3(可选操作)
yum install -y epel-release
yum install -y bsdtar3
3.上传并解压tar包
tar -zxcf apache-phoenix-4.14.0-cdh5.14.2-bin.tar.gz
mv apache-phoenix-4.14.0-cdh5.14.2-bin phoenix
4.配置环境变量
export PHOENIX_HOME=/opt/phoenix
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PATH:$PHOENIX_HOME/bin
5.启动Phoenix
hbase-daemon.sh start master
/opt/phoenix/bin/sqlline.py
4.2.2Phoenix Shell操作
4.2.2.1 表的操作
1)显示所有表
!table 或 !tables
2)创建表
直接指定单个列作为RowKey
CREATE TABLE IF NOT EXISTS student(
id VARCHAR primary key,
name VARCHAR);
在phoenix中,表名等会自动转换为大写,若要小写,使用双引号,如"student"。
指定多个列的联合作为RowKey
CREATE TABLE IF NOT EXISTS us_population (
State CHAR(2) NOT NULL,
City VARCHAR NOT NULL,
Population BIGINT
CONSTRAINT my_pk PRIMARY KEY (state, city));
3)插入数据
upsert into student values('1001','zhangsan');
4)查询记录
select * from student;
select * from student where id='1001';
5)删除记录
delete from student where id='1001';
6)删除表
drop table student;
7)退出命令行
!quit
4.2.2.2 表的映射
1)表的关系
默认情况下,直接在HBase中创建的表,通过Phoenix是查看不到的。如果要在Phoenix中操作直接在HBase中创建的表,则需要在Phoenix中进行表的映射。映射方式有两种:视图映射和表映射。
2)命令行中创建表test
HBase 中test的表结构如下,两个列族info1、info2。
Rowkey | info1 | info2 |
---|---|---|
id | name | address |
hbase shell
create 'test','info1','info2'
3)视图映射
Phoenix创建的视图是只读的,所以只能用来做查询,无法通过视图对源数据进行修改等操作。
在phoenix中创建关联test表的视图
create view "test"(id varchar primary key,"info1"."name" varchar, "info2"."address" varchar);
删除视图
drop view "test";
4)表映射
使用Apache Phoenix创建对HBase的表映射,有两种方法:
(1)HBase中不存在表时,可以直接使用create table指令创建需要的表,系统将会自动在Phoenix和HBase中创建person_infomation的表,并会根据指令内的参数对表结构进行初始化。
(2)当HBase中已经存在表时,可以以类似创建视图的方式创建关联表,只需要将create view改为create table即可。
create table "test"(id varchar primary key,"info1"."name" varchar, "info2"."address" varchar) column_encoded_bytes=0;
4.2.3 Phoenix JDBC操作
1.创建项目并导入依赖
<dependencies>
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version>5.0.0-HBase-2.0</version>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.6</version>
</dependency>
</dependencies>
2.编写代码
import java.sql.*;
public class PhoenixTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.定义参数
String driver = "org.apache.phoenix.jdbc.PhoenixDriver";
String url = "jdbc:phoenix:hadoop100:2181";
//2.加载驱动
Class.forName(driver);
//3.创建连接
Connection connection = DriverManager.getConnection(url);
//4.预编译SQL
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM test");
//5.查询获取返回值
ResultSet resultSet = preparedStatement.executeQuery();
//6.打印结果
while (resultSet.next()) {
System.out.println(resultSet.getString(1) + resultSet.getString(2));
}
//7.关闭资源
resultSet.close();
preparedStatement.close();
connection.close();
}
}
5.HBase的API使用
5.1添加依赖
新建maven项目。并添加依赖
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.0</version>
</dependency>
5.2Hbase核心API
5.2.1 获取Configuration对象
Connection代表对集群的连接对象,封装了与实际服务器的低级别单独连接以及与zookeeper的连接。
Connection可以通过ConnectionFactory类实例化。
Connection的生命周期由调用者管理,使用完毕后需要执行close()以释放资源。
Connection是线程安全的,多个Table和Admin可以共用同一个Connection对象。因此一个客户端只需要实例化一个连接即可。
反之,Table和Admin不是线程安全的!因此不建议并缓存或池化这两种对象。
public static Configuration getConf(){
//使用HBaseConfiguration的单例方法实例化
Configuration conf= HBaseConfiguration.create();
conf.addResource(new Path("/opt/hbase/conf/hbase-site.xml"));
conf.addResource(new Path("/opt/hadoop/etc/hadoop/core-site.xml"));
return conf;
}
5.2.2 创建表
Admin为HBase的管理类,可以通过Connection.getAdmin()获取实例,且在使用完成后调用close()关闭。
Admin可用于创建,删除,列出,启用和禁用以及以其他方式修改表,以及执行其他管理操作。
package cnkgc.hb09;
import cnkgc.hb09.until.HBaseConfs;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import java.io.IOException;
public class CreateTable {
public static void main(String[] args){
Admin admin= HBaseConfs.getAdmin();
HTableDescriptor htd=new HTableDescriptor(TableName.valueOf(args[0]));
for (int i = 0; i < args.length; i++) {
HColumnDescriptor family=new HColumnDescriptor(args[i]);
htd.addFamily(family);
}
try {
admin.createTable(htd);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
admin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
5.2.3插入数据
package cnkgc.hb09;
import cnkgc.hb09.until.HBaseConfs;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import java.io.IOException;
public class insertTable {
public static void main(String[] args) throws IOException {
Connection conn= HBaseConfs.getConn();
Admin admin=HBaseConfs.getAdmin();
TableName[] tableNames = admin.listTableNames();
for (TableName tableName : tableNames) {
System.out.println(tableName.getNameAsString());
}
Table table=conn.getTable(TableName.valueOf("hello"));
String[][] values={
{"1","asfwf","awff","1st White House","WDC"},
{"2","鲍sdf","asda","10th 唐宁街","London"},
{"3","jp","asd","111th sefesg","Beijing"},
{"4","sp","asfdwf","地下sdfesg基地","PingRing"}
};
for (int i = 0; i < values.length; i++) {
Put put=new Put(values[i][0].getBytes());
put.addColumn("name".getBytes(),"fname".getBytes(),values[i][1].getBytes());
put.addColumn("name".getBytes(),"lname".getBytes(),values[i][2].getBytes());
put.addColumn("addr".getBytes(),"address".getBytes(),values[i][3].getBytes());
put.addColumn("addr".getBytes(),"city".getBytes(),values[i][4].getBytes());
table.put(put);
}
admin.close();
conn.close();
}
}
5.2.4打jar包并使用
首先测试创建表,将其打为jar包
将打好的jar包上传到服务器
使用jar包
hadoop jar jar包路径 jar包main方法路径 变量值
6.Hive与HBase的集成
6.1 HBase与Hive的对比
1.Hive
(1) 数据仓库
Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询。
(2) 用于数据分析、清洗
Hive适用于离线的数据分析和清洗,延迟较高。
(3) 基于HDFS、MapReduce
Hive存储的数据依旧在DataNode上,编写的HQL语句终将是转换为MapReduce代码执行。
2.HBase
(1) 数据库
是一种面向列存储的非关系型数据库。
(2) 用于存储结构化和非结构化的数据
适用于单表非关系型数据的存储,不适合做关联查询,类似JOIN等操作。
(3) 基于HDFS
数据持久化存储的体现形式是Hfile,存放于DataNode中,被ResionServer以region的形式进行管理。
(4) 延迟较低,接入在线业务使用
面对大量的企业数据,HBase可以直线单表大量数据的存储,同时提供了高效的数据访问速度。
6.2HBase与Hive集成使用
6.2.1Hive与HBase集成使用场景
- 将HBase作为Hive数据源
让HBase支持类SQL操作
- 将Hive ETL数据存入HBase
便于快速查询
- 构建低延时的数据仓库
利用HBase快速读写能力
实现数据实时查询
6.2.2Hive与HBase集成原理
- 通过两者本身对外的API接口互相通信完成
由Hive的lib目录中hive-hbase-handler-*.jar工具类实现 - HBaseStorageHandler
实现Hive与HBase集成的类
对HiveStorageHandler接口的实现
6.2.3实现
可能需要修改hive-site.xml和增加jar包,我是用的伪分布做测试,暂未发现问题,因此没有修改。
6.2.3.1案例一
emp.txt
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
**目标:**建立Hive表,关联HBase表,插入数据到Hive表的同时能够影响HBase表。
分步实现:
(1) 在Hive中创建表同时关联HBase
CREATE TABLE hive_HBase_emp_table(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")
TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
提示:完成之后,可以分别进入Hive和HBase查看,都生成了对应的表
(2) 在Hive中创建临时中间表,用于load文件中的数据
提示:不能将数据直接load进Hive所关联HBase的那张表中
CREATE TABLE emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';
(3) 向Hive中间表中load数据
load data local inpath '/root/emp.txt' into table emp;
(4) 通过insert命令将中间表中的数据导入到Hive关联HBase的那张表中
insert into table hive_hbase_emp_table select * from emp;
(5) 查看Hive以及关联的HBase表中是否已经成功的同步插入了数据
Hive:
select * from hive_hbase_emp_table;
HBase:
scan 'hbase_emp_table'
6.2.3.2案例二
目标:在HBase中已经存储了某一张表HBase_emp_table,然后在Hive中创建一个外部表来关联HBase中的HBase_emp_table这张表,使之可以借助Hive来分析HBase这张表中的数据。
分步实现:
(1) 在Hive中创建外部表
CREATE EXTERNAL TABLE relevance_HBase_emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
STORED BY
'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" =
":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")
TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
(2) 关联后就可以使用Hive函数进行一些分析操作了
select * from relevance_HBase_emp;