跳转到内容

分布式面向列的NoSQL数据库Hbase(四)

分布式面向列的NoSQL数据库Hbase(四)

Section titled “分布式面向列的NoSQL数据库Hbase(四)”
  1. Hbase Java API
    • 掌握基本流程:先构建Connection[ZK]、DDL【HbaseAdmin】、DML【Table】
    • 掌握核心类:Put、Get、Delete、Scan、ResultScanner、Result、Cell
  2. Hbase 存储结构
    • 概念
      • Table:逻辑上操作对象,Table是分布式的概念,用于客户端读写数据对象
      • Region:物理上存储数据对象,Region代表每个分区,默认每张表只有1个Region,每个Region存储在不RS
      • RegionServer:Hbase从节点进程,负责管理表的Region,接受所有Region的读写请求
    • Hbase分布式的划分规则
      • 基本原则:表的每一个分区都有一个范围,所有分区的范围合并在一起一定是-oo  ~ +oo
      • 分区规则:按照Rowkey属于哪个Region的范围,就读写哪个Region
      • 设计目的:构建表中数据的全局有序,加快读取的性能
      • Hbase基于HDFS查询性能慢的问题,怎么解决?
        • Rowkey:作为索引、Rowkey有序
        • 列族的设计
        • 积极使用内存:优先读Memstore、允许构建读缓存BlockCache
        • 写入HDFS的文件是二进制的HFILE文件
    • 读写流程
      • 写:先追加写WAL【Hlog】、写入内存【只做新增,逻辑上更新和删除】
        • Flush:将内存中的数据写入HDFS
        • Compaction:将多个文件合并为整体有序大文件,清理无用数据
        • Split:一个分区的数据过多,读写性能降低,通过Split提高并行度
      • 读:先读Memstore【写缓存】,再读BlockCache【读缓存】,最后读StoreFile
      • 元数据检索流程:管理元数据【Zookeeper】、表的元数据【hbase:meta】
    • 存储结构
      • Table | RegionServer
        • |
        • Region:表的分区
          • |
          • Store:按照列族划分
            • |
            • Memstore:内存区域
            • StoreFile:逻辑上属于Store,物理上存储在HDFS中的HFILE文件
    • 热点问题
      • 现象:存储不均衡,导致了读写都集中在某个Region上,其他Region相对来说比较空闲
      • 原因:1-没有预分区,2-分区范围没有按照Rowkey设计 , 3-rowkey是连续的
      • 解决:1-建表的时候按照rowkey构建预分区,2-设计不连续的rowkey
    • Hbase表的设计
      • rowkey:业务原则、唯一原则、组合原则、散列原则【加盐】、长度原则
      • columnfamily:个数原则【按照列的个数来设计】、长度原则
  1. BulkLoad和基础优化
    • 目标:掌握Bulkload功能和应用场景
  2. SQL on Hbase
    • 目标:掌握Hbase使用过程中的问题以及解决方案

目标了解Hive on Hbase的实现原理 实施

  • 问题:hbase使用层面的问题
    • 1-Hbase不支持SQL,使用成本较高,Hbase使用受到了限制
    • 解决问题:SQL on Hbase
    • 2-Hbase为了解决性能问题,基于Rowkey做了核心设计,Rowkey作为唯一索引,如果不知道Rowkey前缀,只能全表扫描
    • 解决问题:二级索引
  • 功能实现Hive与Hbase集成,使用Hive SQL对Hbase的数据进行处理
    • Hbase:itcast:t1:原始数据表 |
    • Hive:itcast.t1:Hbase的关联表 |
    • 用户可以通过SQL操作Hive中表,底层是MR操作对应的Hbase表
      • SQL读写Hive中的表,而Hive表指向了Hbase的表
      • Hive会调用Hbase读写的类来对Hbase的数据进行读写
  • 原理:在Hive中对Hbase关联的Hive表执行SQL语句,底层通过Hadoop中的Input和Output对Hbase表进行处理
    • Hadoop中InputFormat和OutputFormat
    • 读写文件:TextInputFormat、TextOutputFormat
    • 读写数据库:DBInputFormat、DBOutputFormat
    • 读写Hbase:TableInputFormat、TableOutputFormat
  • 特点
    • 优点:支持完善的SQL语句,可以实现各种复杂SQL的数据处理及计算,通过分布式计算程序实现,对大数据量的数据处理比较友好
    • 缺点:不支持二级索引,单纯读写的性能不高,不适合做即席查询
  • 应用
    • 基于大数据高性能的离线读写,并且使用SQL来开发
    • 离线场景下,为了提高离线的存储性能 小结:了解Hive on Hbase的实现原理

目标实现Hive on Hbase配置 实施

  • 修改hive-site.xml:Hive通过SQL访问Hbase,就是Hbase的客户端,就要连接zookeeper
Terminal window
cd /export/server/hive
vim conf/hive-site.xml
  • 修改hive-env.sh:便于Hive加载Hbase的库包
vim conf/hive-env.sh
  • 启动HDFS、ZK、Hbase:第一台机器
Terminal window
start-dfs.sh
start-zk-all.sh
start-hbase.sh
  • 启动Hive和YARN==【没有对应脚本,按照自己启动的方式去启动Hive】==
Terminal window
#启动YARN
start-yarn.sh
#先启动metastore服务
hive-daemon.sh metastore
#然后启动hiveserver
hive-daemon.sh hiveserver2
#然后启动beeline
start-beeline.sh

image-20210928101619525.png

小结:实现Hive on Hbase配置

目标实现Hive on Hbase的测试 实施

  • 如果Hbase中表已存在,只能创建外部表
--创建测试数据库
create database course;
use course;
--创建测试表
create external table course.t1(
key string,
name string,
age string,
addr string,
phone string
)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping" = ":key,basic:name,basic:age,other:addr,other:phone")
tblproperties("hbase.table.name" = "itcast:t1");
  • 查询
select * from t1;
select age,count(*) as cnt from t1 group by age order by cnt desc;

注意

  • Hive中的只是关联表,并没有数据,数据存储在Hbase表中
  • 在Hive中创建Hbase的关联表,关联成功后,使用SQL通过MapReduce处理关联表
  • 如果Hbase中表已存在,只能建外部表,使用:key来表示rowkey
  • Hive中与Hbase关联的表,不能使用load写入数据,只能使用insert,通过MR读写数据 小结:实现Hive on Hbase的测试

【模块三:Phoenix的介绍及部署】

Section titled “【模块三:Phoenix的介绍及部署】”

目标了解Phoenix的功能及应用场景 实施

  • http://phoenix.apache.org/
  • 功能
    • 专门基于Hbase所设计的SQL on Hbase  工具
    • 使用Phoenix实现基于SQL操作Hbase:解决了问题1
    • 使用Phoenix构建二级索引并自动维护二级索引:解决问题2
  • 原理
    • 上层提供了SQL接口:底层全部通过Hbase Java API来实现,通过构建一系列的Scan和Put来实现数据的读写
    • 功能非常丰富:底层封装了大量的内置的协处理器,可以实现各种复杂的处理需求,例如二级索引等
  • 特点
    • 优点
      • 支持SQL接口
      • 功能强大:支持自动维护二级索引、创建函数
    • 缺点
      • SQL支持的语法不友好,不是通用性SQL
      • Bug比较多:对Hbase版本集成要求比较高
    • Hive on Hbase对比
      • Hive:SQL更加全面【底层MR】,但是不支持二级索引,底层通过分布式计算工具来实现
      • Phoenix:SQL相对支持不全面【没有计算引擎】,但是性能比较好,直接使用HbaseAPI,支持索引实现
  • 应用对Hbase的即席查询和索引管理
    • Phoenix适用于任何需要使用SQL或者JDBC来快速的读写Hbase的场景
    • 或者需要构建及维护二级索引场景 小结:了解Phoenix的功能及应用场景

目标:安装部署配置Phoenix,集成Hbase 实施

Terminal window
cd /export/software/
rz
  • 第一台机器解压
Terminal window
tar -zxf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C /export/server/
cd /export/server/
mv apache-phoenix-5.0.0-HBase-2.0-bin phoenix-5.0.0-HBase-2.0-bin
  • 修改三台Linux文件句柄数
Terminal window
vim /etc/security/limits.conf
#在文件的末尾添加以下内容,*号不能去掉
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

image-20210928111725533.png

  • 将Phoenix所有jar包分发到Hbase的lib目录下
Terminal window
#拷贝到第一台机器
cd /export/server/phoenix-5.0.0-HBase-2.0-bin/
cp phoenix-* /export/server/hbase-2.1.0/lib/
#分发给第二台和第三台
cd /export/server/hbase-2.1.0/lib/
scp phoenix-* node2:$PWD
scp phoenix-* node3:$PWD
  • 修改hbase-site.xml,添加一下属性
Terminal window
cd /export/server/hbase-2.1.0/conf/
vim hbase-site.xml
  • 同步给其他两台机器
Terminal window
scp hbase-site.xml node2:$PWD
scp hbase-site.xml node3:$PWD
  • 同步给Phoenix
Terminal window
rm -rf /export/server/phoenix-5.0.0-HBase-2.0-bin/bin/hbase-site.xml
cp hbase-site.xml /export/server/phoenix-5.0.0-HBase-2.0-bin/bin/
  • 重启Hbase
stop-hbase.sh
start-hbase.sh
  • 安装依赖
yum -y install python-argparse
  • 注意:如果默认的是Python3,启动会报错,将这个文件中的python进行修改
vim /export/server/phoenix-5.0.0-HBase-2.0-bin/bin/sqlline.py

image-20220808203220853.png

  • 启动Phoenix
cd /export/server/phoenix-5.0.0-HBase-2.0-bin/
bin/sqlline.py node1:2181
  • 测试
!tables
  • 退出
!quit

image-20210323170434725.png

小结:实现Phoenix的安装配置

<repositories>
<repository>
<id>aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-mapreduce</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-jobclient</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-auth</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- JUnit 4 依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
<!-- phoenix core -->
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version>5.0.0-HBase-2.0</version>
</dependency>
<!-- phoenix 客户端 -->
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-queryserver-client</artifactId>
<version>5.0.0-HBase-2.0</version>
</dependency>
</dependencies>