hadoop17--HBASE

HBASE的基本概念

hive和HBASE区别
  1. hive是数据仓库的工具, hive不是真正保存数据的, 而是对HDFS上的数据的一个映射, 而HBASE是一个数据库, 数据是由HBASE来保存的.
  2. hive主要是用来分析数据, 而HBASE主要是用来保存数据的
HBASE与HDFS的区别
  1. HDFS是一个分布式存储系统, 能够存储大量的数据, 但是不支持查询等操作, 而HBASE是建立在HDFS上的数据库
  2. HDFS不支持单条记录的快速检索, 而HBASE是数据库, 检索是最基本的功能
  3. HDFS提供的是一个高延迟的处理, HBASE提供了单行记录低延迟的随机访问
HBASE与关系型数据库的区别

HBASE没有事务的支持, HBASE存储的数据都是非结构化或者半结构化的数据 , 而关系型数据库存储的都是结构化的数据

HBASE的来源

hadoop的诞生源自于谷歌的三大论文

谷歌论文山寨框架
GFSHDFS
mapreducemapreduce
bigtableHBASE(hadoop base)
bigtable背景

谷歌搜索引擎爬取的网页, 都是非结构化数据, 如何存储数据变成了一个难题. bigtable的设计思想为多行三列的一个大表

HBASE继承了bigtable的思想, 开发了 面向列的, 可扩展的, 非关系型的数据库

非关系型数据库
  1. MongoDB : c++编写, 基于文档方式的存储, 存储格式是json格式
  2. redis: 基于内存的, key-value的形式, 通过key快速找到value
关系型数据库
  1. mysql
  2. Oracle
  3. SQLserver
HBASE解决的问题与诞生背景
  1. 互联网的公司数据一般都是爬取过来的, 大量的数据, 并且都是非结构化, 传统的数据库已经不能满足需求了

  2. 交通部门的摄像头, 每天拍摄的内容都是图象, 不能保存在关系型数据库

    HBASE适合存储海量数据, 能够将查询速度范围控制在秒的级别, 并且HBASE是面向列存储的.

HBASE的特点

  1. 面向列: 存储都是按照列进行存储的
  2. 稀疏: 对于空的列式不占用空间的
  3. 无类型: HBASE存储的数据都是字符串, 没有数据类型.

HBASE的存储

  1. 列簇: 一个列簇下边保存多个列, 所谓的列簇指的就是一组列
  2. 行键: HBASE没有主键的概念, 但是存在行键(rowkey)的概念, 可以把行键理解成主键, 行键就是一条记录的唯一标识
  3. 版本: 用于表示更新的数据, 也可以作为数据的检索项
  4. 单元格: 最小的存储单元, 在检索数据的时候, 可以通过以下方式进行单元格数据的唯一确定 rowkey+列簇+时间戳+value

HBSE架构

在这里插入图片描述
主要组件

  1. client : 访问HMaster
  2. Hmaster : 管理类的工作, 主要管理regionServer, 负载均衡, 管理元数据(数据库的名字, 表的名字)
  3. regionServer : 存放region, 而region里边存放的是真正的数据, 并且regionServer可以响应读写请求, 来管理表中的数据
  4. zookeeper : 保证对外提供服务的只有一台, 作为HBASE访问的入口, 切换HMaster的主备, HBASE的部分元数据也是保存在zookeeper中.

HBASE的安装

由于HBASE是基于HDFS上的, 所以在安装HBASE是, 必须存在hadoop, 另外HBASE依赖于zookeeper, 所以在及集群中存在zookeeper

HBASE完全分布式安装.

在完全分布式的安装中, 由于HBASE对时间的要求

  1. 解压HBASE安装文件到安装路径下
sudo tar -zvxf hbase-1.3.1-bin.tar.gz -C /opt/app/

  1. 修改权限为hadoop用户
sudo chown -R hadoop:hadoop hbase-1.3.1/

  1. 配置HBASE的环境 $HBASE/conf/hvase-env.sh
// 修改JAVA_HOME
export JAVA_HOME=/opt/app/jdk1.8.0_181

// 关闭自带的zookeeper, 不需要HBASE自带的zookeeper
export HBASE_MANAGES_ZK=false
  1. 配置HBASE-site.xml文件
// 配置HBASE临时目录
<property >
		<name>hbase.tmp.dir</name>
		<value>/opt/app/hbase-1.3.1/hbase</value>
  </property>

// 配置hbase 临时目录保存位置
 <property >
	    <name>hbase.rootdir</name>
	    <value>hdfs://ns1/hbase</value>
 </property>

//设置hbase的存储模式为分布式存储
 <property >
	    <name>hbase.cluster.distributed</name>
	    <value>true</value>
</property>

//设置hbase中zookeeper 的信息,地址为自己配置的主机名称
<property>
	    <name>hbase.zookeeper.quorum</name>
	    <value>hadoop01,hadoop02,hadoop03</value>
</property>
  1. 配置hbase在hdfs上的保存路径,如果配置了HA 则路径必须和HA提供的路径一直,并且还需要把hdfs-site.xml 和 core-site.xml 两个配置文件复制到hbase的conf目录下
cp core-site.xml /opt/app/hbase-1.3.1/conf/
cp hdfs-site.xml /opt/app/hbase-1.3.1/conf/
  1. 配置regionservers 该文件类似于 salves 文件,描述的是 regionserver的节点信息. 在配置过程中存在几个regionserver 就写几个主机名称
hadoop01
hadoop02
hadoop03
  1. 修改 hbase中hadoop的jar包,由于hbase要操作hdfs,所以hbase需要hadoop的jar包支持。所以在hbase中配置环境中hadoop的jar包
  2. 分发hbase到不同的节点上
sudo scp -r hbase-1.3.1/ hadoop02:/opt/app/
sudo scp -r hbase-1.3.1/ hadoop03:/opt/app/
  1. 修改分发后的文件权限
启动HBASE
  1. 启动master服务(只需要启动一个)
bin/hbase-daemon.sh start master
  1. 启动 regionserver 服务 在3个节点上启动
bin/hbase-daemon.sh start regionserver
  1. 在web端查看, 端口号为16010

HBASE的基本使用(shell操作)

HBASE自带了shell操作, 而HBASE本身就是可以作为client

bin/base shell

在shell中删除时, 若出现不能删除时, 则可以使用Ctrl+delete进行删除, 在shell中可以通过help命令进行查看操作命令介绍

hbase(main):002:0> help
---------------------------------------------------
 Group name: ddl
  Commands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, locate_region, show_filters

  Group name: namespace
  Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables

  Group name: dml
  Commands: append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve

通过help命令可查看到很多操作信息,主要在shell操作中分为两类操作 ddl dml

HBASE—DDL

在hbase中没有数据库的概念,数据库的概念在hbase中称作namespace 可以理解为namespace就是关系型数据库中的数据库的概念,在namespace下面存在着数据表

namespace的操作
  1. 显示所有的namespace
hbase(main):003:0>  list_namespace
NAMESPACE
default
hbase
student
3 row(s) in 0.0230 seconds
  1. 查看namespace下的所有表
hbase(main):004:0> create_namespace 'hbase'
0 row(s) in 1.4860 seconds
  1. 创建namespace
hbase(main):006:0> create_namespace 'nstest'
0 row(s) in 0.9010 seconds
  1. 查看namespace描述
hbase(main):007:0> describe_namespace 'nstest'
DESCRIPTION
{NAME => 'nstest'}
1 row(s) in 0.0630 seconds
  1. 删除namespace
hbase(main):008:0> drop_namespace 'nstest'
0 row(s) in 0.9190 seconds
table的操作

HBASE中提供的建表的实例

create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}
  • ns1 : 表示namespace的名字
  • t1 : 表名称
  • f1 : 列簇名称
  • => : 等于的意思
  • {} : 定义一个列簇,不同列簇可以在不同{}中表示, 一个{}只能定义一个列簇
  • {}中的变量名称必须为大写
  • 在创建表的时候,可以指定一个namespace,如果没有指定namespace则创建的表在默认的namespace下
  1. 创建表, 没有指定namespace 则该表创建在默认的default中
hbase(main):009:0> create 'stu_info','f1'
0 row(s) in 4.4160 seconds

=> Hbase::Table - stu_info
  1. 创建表,并且指定一个namespace
hbase(main):038:0> create 'student:stu_info2','f1'
0 row(s) in 2.2320 seconds

=> Hbase::Table - student:stu_info2

Hbase是基于hdfs之上的,可以在HFDS上查看创建好的表

  1. 查看表的描述信息
hbase(main):039:0> desc 'stu_info'
Table stu_info is ENABLED
stu_info
COLUMN FAMILIES DESCRIPTION
{NAME => 'f1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP
_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMP
RESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '6553
6', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0780 seconds
  1. 删除表. 删除表之前需要禁用该表, 然后再进行删除操作, 否则会抛异常
hbase(main):041:0>  disable 'stu_info' //禁用要删除的表, 禁用是disable, 启用是enable
0 row(s) in 2.3570 seconds

hbase(main):042:0> drop  'stu_info'  // 删除表
0 row(s) in 1.2420 seconds

HBASE—DML
插入数据

HBASE提供的实例:

help 'put'
hbase> put 'ns1:t1', 'r1', 'c1', 'value'

可以把put理解为mysql中的insert语句, 代表插入一条语句

ns1: 命名空间

t1: 表名称

r1: rowkey

c1: 要插入的值

value:

  1. 在默认的命名空间中创建一张表, 作为插入数据测试用
create 'hadoop' 'info','f1'
0 row(s) in 6.1850 seconds

=> Hbase::Table - hadoopinfo
  1. 插入数据
hbase(main):004:0> put 'hadoopinfo','1001','f1:name','zhangsan'
0 row(s) in 0.6470 seconds
hbase(main):004:0> put 'hadoopinfo','1001','f1:age','18'
0 row(s) in 0.2920 seconds
  1. 在插入数据的时候, rowkey都是以字符创的格式进行保存的, 它的最大长度可以保存64kb
查询数据

对于查询的数据可以使用get命令, get命令可以理解为快速查询, 不支持全表查询

  1. 查询指定的rowkey查询
hbase(main):007:0> get 'hadoopinfo', '1001'
COLUMN                CELL
 f1:age               timestamp=1542082626437, value=18
 f1:name              timestamp=1542082513237, value=zhangsan
1 row(s) in 0.2580 seconds
  1. 按照指定的列簇进行查询
hbase(main):008:0> get 'hadoopinfo','1001','f1'
COLUMN                CELL
 f1:age               timestamp=1542082626437, value=18
 f1:name              timestamp=1542082513237, value=zhangsan
1 row(s) in 0.0580 seconds
  1. 按照指定列簇下的列进行查询
hbase(main):009:0> get 'hadoopinfo','1001','f1:name'
COLUMN                CELL
 f1:name              timestamp=1542082513237, value=zhangsan
1 row(s) in 0.0170 seconds

hbase(main):010:0> get 'hadoopinfo','1001','f1:age'
COLUMN                CELL
 f1:age               timestamp=1542082626437, value=18
1 row(s) in 0.0110 seconds

get命令不支持全表查询, 如果要查询全表, 则可以使用scan命令, 类似于mysql中的select * from . 这种全表扫描的方式在企业开发中是不用的, 因为数据量特别大, 全表扫面所需要的时间特别长.

hbase(main):016:0> scan 'hadoopinfo'	//禁止使用
ROW                   COLUMN+CELL
 1001                 column=f1:age, timestamp=1542082626437, value=18
 1001                 column=f1:name, timestamp=1542082513237, value=zhangsan
1 row(s) in 0.0180 seconds

hbase(main):015:0>  scan 'hadoopinfo', {COLUMNS => 'f1:name'}//斟酌使用
ROW                   COLUMN+CELL
 1001                 column=f1:name, timestamp=1542082513237, value=zhangsan
1 row(s) in 0.0370 seconds
删除表

在删除表的时候, 可以使用delete, 可以按照指定的rowkey进行删除, 但是只删除一个列簇是删不掉的, 执行命令不报异常

hbase(main):017:0> delete 'hadoopinfo' ,'1001', 'f1'
0 row(s) in 0.1060 seconds
hbase(main):019:0> scan 'hadoopinfo'//查看删除后的数据
ROW                   COLUMN+CELL
 1001                 column=f1:age, timestamp=1542082626437, value=18
 1001                 column=f1:name, timestamp=1542082513237, value=zhangsan
1 row(s) in 0.0180 seconds

在删除时必须指定一个列

delete 'hadoopinfo' ,'1001', 'f1:name'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值