HBase(总)小白入门知识汇总

7 篇文章 0 订阅

文章目录

1.HBase基础介绍

1.1 NoSQL简介

1.1.1什么是NoSQL

NoSQL:not only SQL,非关系型数据库

NoSQL是一个通用术语

  • 指不遵循传统RDBMS模型的数据库
  • 数据是非关系的,且不使用SQL作为主要查询语言
  • 解决数据库的可伸缩性和可用性问题
  • 不针对原子性或一致性问题

image-20200924163336133

1.1.2为什么使用NoSQL

互联网的发展,传统关系型数据库存在瓶颈

  • 高并发读写
  • 高存储量
  • 高可用性
  • 高扩展性
  • 低成本

NoSQL和关系型数据库对比

主要有以下一些区别

对比NoSQL关系型数据库
常用数据库HBase、MongoDB、RedisOracle、DB2、MySQL
存储格式文档、键值对、图结构表格式,行和列
存储规范鼓励冗余规范性,避免重复
存储扩展横向扩展,分布式纵向扩展(横向扩展有限)
查询方式结构化查询语言SQL非结构化查询
事务不支持事务一致性支持事务
性能读写性能高读写性能差
成本简单易部署,开源,成本低成本高

1.1.3NoSQL的特点

  • 最终一致性

  • 应用程序增加了维护一致性和处理事务等职责

  • 冗余数据存储

  • NoSQL != 大数据

    • NoSQL产品是为了帮助解决大数据存储问题
    • 大数据不仅仅包含数据存储的问题
      • Hadoop
      • Kafka
      • Spark, etc

1.1.4NoSQL基本概念

  • 三大基石
    • CAP、BASE、 最终一致性
  • Indexing(索引)、Query(查询)
  • MapReduce
  • Sharding
  1. CAP理论
  • 数据库最多支持3个中的2个
    • Consistency(一致性)
    • Availability(可用性)
    • Partition Tolerance(分区容错性)
  • NoSQL不保证“ACID”
  • 提供“最终一致性”

image-20200924163738973

  1. BASE
  • Basically Availble(基本可用)
    • 保证核心可用
  • Soft-state(软状态)
    • 状态可以有一段时间不同步
  • Eventual Consistency(最终一致性)
    • 系统经过一定时间后,数据最终能够达到一致的状态
  • 核心思想是即使无法做到强一致性,但应用可以选择适合的方式达到最终一致性
  1. 最终一致性
  • 最终结果保持一致性,而不是时时一致
  • 如账户余额,库存量等数据需强一致性
  • 如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, MongoDBWeb应用(可看做键值数据库的升级版)
图数据库(GRAPH DB)Neo4J, InfoGrid, Infinite Graph社交网络,推荐系统等,专注于构建关系图谱

键值存储数据库(Key-Value)

image-20200924164747438

列存储数据库(Wide Column Store)

image-20200924164759220

文档型数据库(Document Store)

image-20200924164819333

图数据库(Graph Databases)

image-20200924164834330

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-2014HBase先后发布了0.96版本/0.98版本
2015-2016HBase先后发布了1.0版本、1.1版本和1.2.4版本
2017年HBase发布1.3版本
2018年HBase先后发布了1.4版本和2.0版本

1.2.3HBase用户群体

image-20200924165725077

1.2.4HBase应用场景

  • 应用场景-1

增量数据-时间序列数据

高容量,高速写入

image-20200924165817407

  • 应用场景-2

信息交换-消息传递

高容量,高速读写

image-20200924165843295

  • 应用场景-3

内容服务-Web后端应用程序

高容量,高速读写

image-20200924165909477

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架构

image-20200924170008602

  • HMaster的作用
    是HBase集群的主节点,可以配置多个,用来实现HA
    管理和分配Region
    负责RegionServer的负载均衡
    发现失效的RegionServer并重新分配其上的Region

  • RegionServer

    RegionServer负责管理维护Region
    一个RegionServer包含一个WAL、一个BlockCache (读缓存)和多个Region
    一个Region包含多个存储区,每个存储区对应一个列族
    一个存储区由多个StoreFile和MemStore组成
    一个StoreFile对应于一个HFile和一个列族
    HFile和WAL作为序列文件保存在HDFS上
    Client与RegionServer交互

image-20200924170110410

  • Region和Table

image-20200924170132008

2.逻辑架构Row

  • Rowkey(行键)是唯一的并已排序
  • Schema可以定义何时插入记录
  • 每个Row都可以定义自己的列,即使其他Row不使用
    • 相关列定义为列族
  • 使用唯一时间戳维护多个Row版本
    • 在不同版本中值类型可以不同
  • HBase数据全部以字节存储

image-20200924170259209

1.2.7HBase数据管理

  • 数据管理目录
    • 系统目录表hbase:meta
      • 存储元数据等
    • HDFS目录中的文件
    • Servers上的region实例
  • HBase数据在HDFS上
    • 可以通过HDFS进行修复File
    • 修复路径
      • RegionServer->Table->Region->RowKey->列族

image-20200924170349335

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逻辑结构

image-20201014170302781

1.3.2 HBase物理存储结构

image-20201014170345077

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

《适合小白的配置hadoop环境教程》

《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

image-20200914200901562

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"

image-20200914202020717

配置 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

image-20200924184043079

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架构

image-20201010221157154

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

image-20201010224251004

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"。

image-20201010230627169

指定多个列的联合作为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。

Rowkeyinfo1info2
idnameaddress
hbase shell
create 'test','info1','info2'

3)视图映射

Phoenix创建的视图是只读的,所以只能用来做查询,无法通过视图对源数据进行修改等操作。

在phoenix中创建关联test表的视图

create view "test"(id varchar primary key,"info1"."name" varchar, "info2"."address" varchar);

image-20201011224244515

删除视图

 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>

image-20200926162325596

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包

image-20200926170843762

image-20200926170927464

image-20200926170948277

将打好的jar包上传到服务器

image-20200926171024997

使用jar包

hadoop jar jar包路径 jar包main方法路径 变量值

image-20200926171428240

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操作

image-20200928142614904

  • 将Hive ETL数据存入HBase

便于快速查询

image-20200928142703977

  • 构建低延时的数据仓库

利用HBase快速读写能力

实现数据实时查询

image-20200928142735875

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查看,都生成了对应的表

image-20200928161023205

image-20200928161047448

(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;

image-20200928162959409

HBase:

scan 'hbase_emp_table'

image-20200928163131506

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;

image-20200928163504201

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值