欢迎光临
我们一直在努力

Hbase -- nosql

不当菜狗。微信找到我:Ltong-520_1314

Hbase的安装

上传解压HBase安装包

修改HBase配置文件 都先在node01上修改,后面会分发

在:/export/servers/hbase-2.1.0/conf 目录下

修改:hbase-env.sh

cd /export/servers/hbase-2.1.0/conf

vim hbase-env.sh

# 第28行

export JAVA_HOME=/export/servers/jdk1.8.0_131

export HBASE_MANAGES_ZK=false

(export HBASE_MANAGES_ZK=false这个表示的是不让Hbase去管理zookeaper。)  

修改:hbase-site.xml

这里<value>hdfs://node01:8020/hbase</value>的node01:8020这个是namenode的url必须和上面这个图的一样。后面/hbase是设置hbase之后的数据存在那个目录

在hadoop笔记中:

记住这个目录,因为Hbase配置需要用:

vim hbase-site.xml

——————————

<configuration>

        <!– HBase数据在HDFS中的存放的路径 –>

        <property>

            <name>hbase.rootdir</name>

            <value>hdfs://node01:8020/hbase</value>

        </property>

<!– Hbase的运行模式。false是单机模式,true是分布式模式。若为false,Hbase和Zookeeper会运行在同一个JVM里面 –>

        <property>

            <name>hbase.cluster.distributed</name>

            <value>true</value>

        </property>

        <!– ZooKeeper的地址端口号是2181可以省略,这里需要写上zookeeper所在的机器 –>

        <property>

            <name>hbase.zookeeper.quorum</name>

            <value>node01,node02,node03</value>

        </property>

        <!– ZooKeeper快照的存储位置,这个也是zookeeper保存数据的目录–>

        <property>

            <name>hbase.zookeeper.property.dataDir</name>

            <value>/export/servers/zookeeper-3.4.9/zkdatas</value>

        </property>

        <!–  V2.1版本,在分布式情况下,将兼容性检测设置为false –>

        <property>

            <name>hbase.unsafe.stream.capability.enforce</name>

            <value>false</value>

        </property>

</configuration>

配置环境变量

# 配置Hbase环境变量

vim /etc/profile

export HBASE_HOME=/export/servers/hbase-2.1.0

export PATH=$PATH:${HBASE_HOME}/bin:${HBASE_HOME}/sbin

#加载环境变量

source /etc/profile

复制jar包到lib

cp $HBASE_HOME/lib/client-facing-thirdparty/htrace-core-3.1.0-incubating.jar $HBASE_HOME/lib/

修改regionservers文件,指定Hbase有几个节点

vim regionservers

node01

node02

node03

分发安装包与配置文件

cd /export/servers

scp -r hbase-2.1.0/ node02:$PWD

scp -r hbase-2.1.0/ node03:$PWD

scp -r /etc/profile node02:/etc

scp -r /etc/profile node03:/etc

在node02和node03加载环境变量

source /etc/profile

启动Hbase

Hbase必须最后启动,因为Hbase启动依赖于hadoop和zookeeper,后面zookeeper都用ZK表示。  

# 启动ZK(zookeeper)三台都需要启动,如果不知道三台怎么顺序启动,去看Hadoop笔记。

/export/servers/zookeeper-3.4.9/bin/zkServer.sh start

# 启动hadoop

start-all.sh

启动history server

启动历史记录文件在hadoop-2.7.7:sbin/mr-jobhistory-daemon.sh start historyserver

# 启动hbase 在主节点node01上面运行就行。和启动hadoop一样。

start-hbase.sh 在关闭Hbase的时候也是像上面一样,先关闭zk和hadoop,最后关闭Hbase

验证Hbase是否启动成功

# 启动hbase shell客户端 在任意节点,这里我选择主节点。
hbase shell
# 输入status

[root@node1 onekey]# hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/export/server/hadoop-2.7.5/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/export/server/hbase-2.1.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell
Use \”help\” to get list of supported commands.
Use \”exit\” to quit this interactive shell.
Version 2.1.0, re1673bb0bbfea21d6e5dba73e013b09b8b49b89b, Tue Jul 10 17:26:48 CST 2018
Took 0.0034 seconds
Ignoring executable-hooks-1.6.0 because its extensions are not built. Try: gem pristine executable-hooks –version 1.6.0
Ignoring gem-wrappers-1.4.0 because its extensions are not built. Try: gem pristine gem-wrappers –version 1.4.0
2.4.1 :001 > status
1 active master, 0 backup masters, 3 servers, 0 dead, 0.6667 average load
Took 0.4562 seconds
2.4.1 :002 >

WebUI

16010是Hbase的端口号。

http://node01:16010/master-status  其实这样输入也行:node01:16010 查看日志: 进入之后按大写的G可以跳到最后。看erro的地方报的错误。  

HBase高可用

考虑关于HBase集群的一个问题,在当前的HBase集群中,只有一个Master,一旦Master出现故障,将会导致HBase不再可用。所以,在实际的生产环境中,是非常有必要搭建一个高可用的HBase集群的。

HBase高可用简介 HBase的高可用配置其实就是HMaster的高可用。要搭建HBase的高可用,只需要再选择一个节点作为HMaster,在HBase的conf目录下创建文件backup-masters,然后再backup-masters添加备份Master的记录。一条记录代表一个backup master,可以在文件配置多个记录。  

搭建HBase高可用(就是主节点挂了有其它顶上去)

1. 先在node01在hbase的conf文件夹中创建 backup-masters 文件  

cd /export/servers/hbase-2.1.0/conf

touch backup-masters 2. 将node02和node03添加到该文件中 vim backup-masters

node02

node03 3. 将backup-masters文件分发到所有的服务器节点中  

scp backup-masters node02:$PWD

scp backup-masters node03:$PWD 在关闭Hbase的时候也是像上面一样,先关闭zk和hadoop,最后关闭Hbase 4. 重新启动hbase  

stop-hbase.sh

start-hbase.sh  

  • 查看webui,检查Backup Masters中是否有node02、node03
  • http://node01:16010/master-status 验证:

    尝试杀掉node01节点上的master

    kill -9 HMaster进程id

    安装Phoenix

    下载

    大家可以从官网上下载与HBase版本对应的Phoenix版本。对应到HBase 2.1,应该使用版本「5.0.0-HBase-2.0」。

    http://phoenix.apache.org/download.html

    也可以使用资料包中的安装包。 Phoenix官方网址:http://phoenix.apache.org/

    安装 上传安装包到Linux系统,并解压  在三台里面都安装,先安装一个,然后在拷贝。

    cd /export/softwars

    tar -xvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C ../servers/  

    将phoenix的所有jar包添加到所有HBase RegionServer和Master的复制到HBase的lib目录

    #  拷贝jar包到hbase lib目录 

    cp /export/servers/apache-phoenix-5.0.0-HBase-2.0-bin/phoenix-*.jar /export/servers/hbase-2.1.0/lib/

    #  进入到hbase lib  目录

    cd /export/servers/hbase-2.1.0/lib/

    分发jar包到每个HBase 节点

    scp phoenix-*.jar node02:$PWD

    scp phoenix-*.jar node03:$PWD

    修改配置文件

    cd /export/servers/hbase-2.1.0/conf

    vim hbase-site.xml

    ——

    # 1. 将以下配置添加到 hbase-site.xml 后边

    <!– 支持HBase命名空间映射 启用命名空间映射  –>

    <property>

        <name>phoenix.schema.isNamespaceMappingEnabled</name>

        <value>true</value>

    </property> <!– 建议:将系统表也映射到命名空间 –> <property>     <name>phoenix.schema.mapSystemTablesToNamespace</name>     <value>true</value> </property>

    <!– 支持索引预写日志编码 –>

    <property>

      <name>hbase.regionserver.wal.codec</name>

      <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>

    </property>

    # 2. 将hbase-site.xml分发到每个节点

    scp hbase-site.xml node02:$PWD

    scp hbase-site.xml node03:$PWD  

    将配置后的hbase-site.xml拷贝到phoenix的bin目录 在node01上

    cp /export/servers/hbase-2.1.0/conf/hbase-site.xml /export/servers/apache-phoenix-5.0.0-HBase-2.0-bin/bin/

    重新启动HBase

    stop-hbase.sh

    start-hbase.sh

    启动Phoenix客户端,连接Phoenix Server

    注意:第一次启动Phoenix连接HBase会稍微慢一点。

    cd /export/servers/apache-phoenix-5.0.0-HBase-2.0-bin/

    bin/sqlline.py node01:2181

    //

    bin/sqlline.py

    # 输入!table查看Phoenix中的表

    !table !tables — 只会显示当前 schema 下的表  

    如果是ambari里面安装了phoenix咋们在这里找到

    如果部署时勾选phoenix的话:/usr/hdp/3.1.4.0-315/phoenix/bin 在这个位置

    也可以通过ps -ef|grep phoenix找到。 我建议安装

    退出:

    常用shell操作

    我们可以以shell的方式来维护和管理HBase。例如:执行建表语句、执行增删改查操作等等。

    当Hbase在shell里面输入错了之后,只会换行不会打印,这样就导致了我们没法输入,

    所有需要输入>”这个符号去解决:

    HBase入门

    介绍:

    HBase 是构建在 HDFS 之上的分布式数据库

    Hbase和Hive的对比

    和hvie一样,数据都是存在Hdfs上的

    两者区别:

    Hadoop的局限

  •  Hadoop主要是实现批量数据的处理,并且通过顺序方式访问数据
  •  要查找数据必须搜索整个数据集, 如果要进行随机读取数据,效率较低
  • HBase 与 NoSQL  

  • NoSQL是一个通用术语,泛指一个数据库并不是使用SQL作为主要语言的非关系型数据库
  • HBase是BigTable的开源java版本。是建立在HDFS之上,提供高可靠性、高性能、列存储、可伸缩、实时读写NoSQL数据库系统
  • HBase仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务
  • 主要用来存储结构化和半结构化的松散数据
  • Hbase查询数据功能很简单,不支持join等复杂操作,不支持复杂的事务(行级的事务),从技术上来说,HBase更像是一个「数据存储」而不是「数据库」,因为HBase缺少RDBMS中的许多特性,例如带类型的列、二级索引以及高级查询语言等
  • Hbase中支持的数据类型:byte[]
  • 与Hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加存储和处理能力,例如,把集群从10个节点扩展到20个节点,存储能力和处理能力都会加倍
  • HBase中的表一般有这样的特点   
  • 大:一个表可以有上十亿行,上百万列
  • 面向列:面向列(族)的存储和权限控制,列(族)独立检索
  • 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏
  • hbase参考文档:https://hbase.apache.org/book.html

    HBase应用场景

    对象存储

    不少的头条类、新闻类的的新闻、网页、图片存储在HBase之中,一些病毒公司的病毒库也是存储在HBase之中

    时序数据

    HBase之上有OpenTSDB模块,可以满足时序类场景的需求

    推荐画像

    用户画像,是一个比较大的稀疏矩阵,蚂蚁金服的风控就是构建在HBase之上

    时空数据

    主要是轨迹、气象网格之类,滴滴打车的轨迹数据主要存在HBase之中,另外在技术所有大一点的数据量的车联网企业,数据都是存在HBase之中

    CubeDB OLAP

    Kylin一个cube分析工具,底层的数据就是存储在HBase之中,不少客户自己基于离线计算构建cube存储在hbase之中,满足在线报表查询的需求

    消息/订单

    在电信领域、银行领域,不少的订单查询底层的存储,另外不少通信、消息同步的应用构建在HBase之上

    Feeds流

    典型的应用就是xx朋友圈类似的应用,用户可以随时发布新内容,评论、点赞。

    NewSQL 通过Phoenix

    之上有Phoenix的插件,可以满足二级索引、SQL的需求,对接传统数据需要SQL非事务的需求

    HBase特点

  •  强一致性读/写
  • HBASE不是“最终一致的”数据存储
  • 它非常适合于诸如高速计数器聚合等任务
  •  自动分块
  • HBase表通过Region分布在集群上,随着数据的增长,区域被自动拆分和重新分布
  •  自动RegionServer故障转移
  •  Hadoop/HDFS集成
  • HBase支持HDFS开箱即用作为其分布式文件系统
  •  MapReduce
  • HBase通过MapReduce支持大规模并行处理,将HBase用作源和接收器
  •  Java Client API
  • HBase支持易于使用的 Java API 进行编程访问
  •  Thrift/REST API
  •  块缓存和布隆过滤器
  • HBase支持块Cache和Bloom过滤器进行大容量查询优化
  •  运行管理
  • HBase为业务洞察和JMX度量提供内置网页。
  • 结构

  • 以表形式存在
  • 支持HDFS文件系统
  • 使用行键(row key)
  • 原生支持分布式存储、计算引擎
  • 使用行、列、列蔟和单元格
  • 功能

  • 支持向外扩展
  • 使用API和MapReduce、Spark、Flink来访问HBase表数据
  • 面向列蔟,即每一个列蔟都是一个连续的单元
  • 数据总量不依赖具体某台机器,而取决于机器数量
  • HBase不支持ACID(AtomicityConsistencyIsolationDurability
  • 适合结构化数据和非结构化数据
  • 一般都是分布式的
  • HBase不支持事务,支持的是单行数据的事务操作
  • 不支持Join
  • HDFS对比HBase

    hdfs:

  • HDFS是一个非常适合存储大型文件的分布式文件系统
  • HDFS它不是一个通用的文件系统,也无法在文件中快速查询某个数据
  • Hbase

  • HBase构建在HDFS之上,并为大型表提供快速记录查找(和更新)
  • HBase内部将大量数据放在HDFS中名为「StoreFiles」的索引中,以便进行高速查找
  • Hbase比较适合做快速查询等需求,而不适合做大规模的OLAP应用
  • HBase架构

    系统架构

    Client

    客户端,例如:发出HBase操作的请求。例如:之前我们编写的Java API代码、以及HBase shell,都是CLient

    Master Server

    在HBase的Web UI中,可以查看到Master的位置。

  • 监控RegionServer
  • 处理RegionServer故障转移
  • 处理元数据的变更
  • 处理region的分配或移除
  • 在空闲时间进行数据的负载均衡
  • 通过Zookeeper发布自己的位置给客户端
  • Region Server

  • 处理分配给它的Region
  • 负责存储HBase的实际数据
  • 刷新缓存到HDFS
  • 维护HLog
  • 执行压缩
  • 负责处理Region分片
  • RegionServer中包含了大量丰富的组件,如下:
  • Write-Ahead logs
  • HFile(StoreFile)
  • Store
  • MemStore
  • Region
  • 逻辑结构模型

    Region

    在HBASE中,表被划分为很多「Region」,并由Region Server提供服务

    Store

    Region按列蔟垂直划分为「Store」,存储在HDFS在文件中

    MemStore

  • MemStore与缓存内存类似
  • 当往HBase中写入数据时,首先是写入到MemStore
  • 每个列蔟将有一个MemStore
  •  当MemStore存储快满的时候,整个数据将写入到HDFS中的HFile中
  • StoreFile

  •  每当任何数据被写入HBASE时,首先要写入MemStore
  •  当MemStore快满时,整个排序的key-value数据将被写入HDFS中的一个新的HFile中
  •  写入HFile的操作是连续的,速度非常快
  •  物理上存储的是HFile
  • WAL

  •  WAL全称为Write Ahead Log,它最大的作用就是      故障恢复
  •  WAL是HBase中提供的一种高并发、持久化的日志保存与回放机制
  •  每个业务数据的写入操作(PUT/DELETE/INCR),都会保存在WAL中
  •  一旦服务器崩溃,通过回放WAL,就可以实现恢复崩溃之前的数据
  •  物理上存储是Hadoop的Sequence File
  • Hbase启动方式:

    Hbase必须最后启动,因为Hbase启动依赖于hadoop和zookeeper,后面zookeeper都用ZK表示。

    # 启动ZK(zookeeper)三台都需要启动,如果不知道三台怎么顺序启动,去看Hadoop笔记。  

    /export/servers/zookeeper-3.4.9/bin/zkServer.sh start # 启动hadoop start-all.sh 启动history server 启动历史记录文件在hadoop-2.7.7:sbin/mr-jobhistory-daemon.sh start historyserver  

    # 启动hbase 在主节点node01上面运行就行。和启动hadoop一样。

    start-hbase.sh 在关闭Hbase的时候也是像上面一样,先关闭zk和hadoop,最后关闭Hbase

    验证Hbase是否启动成功

    # 启动hbase shell客户端 在任意节点,这里我选择主节点。

    hbase shell

    # 输入status  

    [root@node1 onekey]# hbase shell
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/export/server/hadoop-2.7.5/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/export/server/hbase-2.1.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
    HBase Shell
    Use \”help\” to get list of supported commands.
    Use \”exit\” to quit this interactive shell.
    Version 2.1.0, re1673bb0bbfea21d6e5dba73e013b09b8b49b89b, Tue Jul 10 17:26:48 CST 2018
    Took 0.0034 seconds
    Ignoring executable-hooks-1.6.0 because its extensions are not built. Try: gem pristine executable-hooks –version 1.6.0
    Ignoring gem-wrappers-1.4.0 because its extensions are not built. Try: gem pristine gem-wrappers –version 1.4.0
    2.4.1 :001 > status
    1 active master, 0 backup masters, 3 servers, 0 dead, 0.6667 average load
    Took 0.4562 seconds
    2.4.1 :002 >

    WebUI

    16010是Hbase的端口号。

    http://node01:16010/master-status  其实这样输入也行:node01:16010 查看日志: 进入之后按大写的G可以跳到最后。看erro的地方报的错误。

    ambari看的方式:

    安装目录说明

    目录名

    说明

    bin

    所有hbase相关的命令都在该目录存放

    conf

    所有的hbase配置文件

    hbase-webapps

    hbase的web ui程序位置

    lib

    hbase依赖的java库

    logs

    hbase的日志文件

    参考硬件配置

    针对大概800TB存储空间的集群中每个Java进程的典型内存配置:

    进程

    描述

    NameNode

    8 GB

    每100TB数据或每100W个文件大约占用NameNode堆1GB的内存

    SecondaryNameNode

    8GB

    在内存中重做主NameNode的EditLog,因此配置需要与NameNode一样

    DataNode

    1GB

    适度即可

    ResourceManager

    4GB

    适度即可(注意此处是MapReduce的推荐配置)

    NodeManager

    2GB

    适当即可(注意此处是MapReduce的推荐配置)

    HBase HMaster

    4GB

    轻量级负载,适当即可

    HBase RegionServer

    12GB

    大部分可用内存、同时为操作系统缓存、任务进程留下足够的空间

    ZooKeeper

    1GB

    适度

    推荐:

  • Master机器要运行NameNode、ResourceManager、以及HBase HMaster,推荐24GB左右
  • Slave机器需要运行DataNode、NodeManager和HBase RegionServer,推荐24GB(及以上)
  • 根据CPU的核数来选择在某个节点上运行的进程数,例如:两个4核CPU=8核,每个Java进程都可以独立占有一个核(推荐:8核CPU)
  • 内存不是越多越好,在使用过程中会产生较多碎片,Java堆内存越大, 会导致整理内存需要耗费的时间越大。例如:给RegionServer的堆内存设置为64GB就不是很好的选择,一旦FullGC就会造成较长时间的等待,而等待较长,Master可能就认为该节点已经挂了,然后移除掉该节点
  • HBase数据模型

    在HBASE中,数据存储在具有行和列的表中。这是看起来关系数据库(RDBMS)一样,但将HBASE表看成是多个维度的Map结构更容易理解。

    ROWKEY

    C1列蔟

    C2列蔟

    rowkey

    列1

    列2

    列3

    列4

    列4

    列6

    rowkey

    0001

    C1(Map)

    列1 => 值1

    列2 => 值2

    列3 => 值3

    C2(Map)

    列4 => 值4

    列5 => 值5

    列6 => 值6

    概念模型

    Row Key

    Time Stamp

    ColumnFamily

    contents

    ColumnFamily

    anchor

    ColumnFamily

    people

    \”com.cnn.www\”

    t9

    anchor:cnnsi.com = \”CNN\”

    \”com.cnn.www\”

    t8

    anchor:my.look.ca = \”CNN.com\”

    \”com.cnn.www\”

    t6

    contents:html = \”<html>…\”

    \”com.cnn.www\”

    t5

    contents:html = \”<html>…\”

    \”com.cnn.www\”

    t3

    contents:html = \”<html>…\”

    \”com.example.www\”

    t5

    contents:html = \”<html>…\”

    people:author = \”John Doe\”

  •  上述表格有两行、三个列蔟(contens、ancho、people)
  •  “com.cnn.www”这一行anchor列蔟两个列(anchor:cssnsi.com、anchor:my.look.ca)、contents列蔟有个1个列(html)
  •  “com.cnn.www”在HBase中有 t3、t5、t6、t8、t9 5个版本的数据
  •  HBase中如果某一行的列被更新的,那么最新的数据会排在最前面,换句话说同一个rowkey的数据是按照倒序排序的
  • 术语

    表(Table):

  •  HBase中数据都是以表形式来组织的
  •  HBase中的表由多个行组成
  •  

    行(row)

  • HBASE中的行由一个rowkey(行键)和一个或多个列组成,列的值与rowkey、列相关联
  • 行在存储时按行键按字典顺序排序
  • 行键的设计非常重要,尽量让相关的行存储在一起
  • 例如:存储网站域。如行键是域,则应该将域名反转后存储(org.apache.www、org.apache.mail、org.apache.jira)。这样,所有Apache域都在表中存储在一起,而不是根据子域的第一个字母展开
  • 后续,我们会讲解rowkey的设计策略。  

    列(Column)

  •  HBASE中的列由列蔟(Column Family)和列限定符(Column Qualifier)组成
  •  表示如下——列蔟名:列限定符名。例如:C1:USER_ID、C1:SEX
  • c1是列族  后面的是限定列  

    列蔟(Column Family)

  •  出于性能原因,列蔟将一组列及其值组织在一起
  •  每个列蔟都有一组存储属性,例如:
  • 是否应该缓存在内存中
  • 数据如何被压缩或行键如何编码等
  •  表中的每一行都有相同的列蔟,但在列蔟中不存储任何内容
  •  所有的列蔟的数据全部都存储在一块(文件系统HDFS)
  •  HBase官方建议所有的列蔟保持一样的列,并且将同一类的列放在一个列蔟中
  • 列标识符(Column Qualifier) 真正的列

  •  列蔟中包含一个个的列限定符,这样可以为存储的数据提供索引
  •  列蔟在创建表的时候是固定的,但列限定符是不作限制的
  •  不同的行可能会存在不同的列标识符
  • 单元格(Cell)

  •  单元格是行、列系列和列限定符的组合
  •  包含一个值和一个时间戳(表示该值的版本)
  •  单元格中的内容是以二进制存储的
  • 这里Row就是RowKey

    C1: 列蔟

    列蔟:后面的ADDRESS是列 Timestamp:时间搓 Value:值 下面的这个框框的所有东西被称为单元格。  

    常用shell操作(知道这个方便写java) –简单了解 后续用Phoenix查询数据

    我们可以以shell的方式来维护和管理HBase。例如:执行建表语句、执行增删改查操作等等。

    当Hbase在shell里面输入错了之后,只会换行不会打印,这样就导致了我们没法输入,

    所有需要输入>”这个符号去解决:

    需求

    有以下订单数据,我们想要将这样的一些数据保存到HBase中。  

    订单ID

    订单状态

    支付金额

    支付方式ID

    用户ID

    操作时间

    商品分类

    001

    已付款

    200.5

    1

    001

    2020-5-2 18:08:53

    手机;

    接下来,我们将使用HBase shell来进行以下操作:

  • 创建表
  • 添加数据
  • 更新数据
  • 删除数据
  • 查询数据
  • 创建表

    在HBase中,所有的数据也都是保存在表中的。要将订单数据保存到HBase中,首先需要将表创建出来。

    启动HBase Shell

    HBase的shell其实JRuby的IRB(交互式的Ruby),但在其中添加了一些HBase的命令。

    启动HBase shell:

    hbase shell

    或者使用Phoenix客户端:

    创建表

    语法:

    create \”表名\”,\”列蔟1\”, \”列蔟2\”,……….

    创建订单表,表名为ORDER_INFO,该表有一个列蔟为C1 create \’ORDER_INFO\’,\’C1\’       //记住了后面别加‘;’号 hbase(main):005:0> create \’test11\’,\’c1\’

    注意:  

  • create要写成小写
  • 一个表可以包含若干个列蔟
  • 命令解析:调用hbase提供的ruby脚本的create方法,传递两个字符串参数
  • 通过下面链接可以看到每个命令都是一个ruby脚本
  • https://github.com/apache/hbase/tree/branch-2.1/hbase-shell/src/main/ruby/shell/commands

     

       

    查看表

    hbase(main):005:0> list
    TABLE
    ORDER_INFO
    1 row(s)
    Took 0.0378 seconds
    => [\”ORDER_INFO\”]

    删除表

    要删除某个表,必须要先禁用表  

    禁用表

    语法:disable \”表名\”

    删除表

    语法:drop \”表名\”

    例如:删除ORDER_INFO表 disable \”ORDER_INFO\” drop \”ORDER_INFO\”  

    添加数据

    需求 接下来,我们需要往订单表中添加以下数据。  

    订单ID

    订单状态

    支付金额

    支付方式ID

    用户ID

    操作时间

    商品分类

    ID

    STATUS

    PAY_MONEY

    PAYWAY

    USER_ID

    OPERATION_DATE

    CATEGORY

    000001

    已提交

    4070

    1

    4944191

    2020-04-25 12:09:16

    手机;

     

    PUT操作

    HBase中的put命令,可以用来将数据保存到表中。但put一次只能保存一个列的值。以下是put的语法结构:  

    put \’表名\’,\’ROWKEY\’,\’列蔟名:列名\’,\’值\’ //put当\’列蔟名:列名\’存在时就是更新,不存在就是添加。所有更新命令也是这么写的。

    要添加以上的数据,需要使用7次put操作。如下:

    put \’ORDER_INFO\’,\’000001\’,\’C1:ID\’,\’000001\’
    put \’ORDER_INFO\’,\’000001\’,\’C1:STATUS\’,\’已提交\’
    put \’ORDER_INFO\’,\’000001\’,\’C1:PAY_MONEY\’,4070
    put \’ORDER_INFO\’,\’000001\’,\’C1:PAYWAY\’,1
    put \’ORDER_INFO\’,\’000001\’,\’C1:USER_ID\’,4944191
    put \’ORDER_INFO\’,\’000001\’,\’C1:OPERATION_DATE\’,\’2020-04-25 12:09:16\’
    put \’ORDER_INFO\’,\’000001\’,\’C1:CATEGORY\’,\’手机;\’

    查看添加的数据

    需求 要求将rowkey为:000001对应的数据查询出来。 get命令  语法: get \’表名\’,\’rowkey\’ get \’ORDER_INFO\’,\’000001\’

    显示中文

    在HBase shell中,如果在数据中出现了一些中文,默认HBase shell中显示出来的是十六进制编码。要想将这些编码显示为中文,我们需要在get命令后添加一个属性:{FORMATTER => \’toString\’}  

    查看订单的数据

    这里必须是FORMATTER大写且\’toString\’中的S也必须是大写 get \”表名\”, \”rowkey\” get \’ORDER_INFO\’,\’000001\’, {FORMATTER => \’toString\’} 注:  

  • { key => value},这个是Ruby语法,表示定义一个HASH结构
  • get是一个HBase Ruby方法,’ORDER_INFO’、’000001’、{FORMATTER => \’toString\’}是put方法的三个参数
  • FORMATTER要使用大写
  • 在Ruby中用{}表示一个字典,类似于hashtable,FORMATTER表示key、’toString’表示值
  • 更新操作

    更新操作

    将订单ID为000001的状态,更改为「已付款」  

    使用put来更新数据 同样,在HBase中,也是使用put命令来进行数据的更新,语法与之前的添加数据一模一样。  

    更新指定的列

    put \’ORDER_INFO\’, \’000001\’, \’C1:STATUS\’, \’已付款\’  //如果C1:STATUS以前不存在,那么就会新建

    注意:  

  •  HBase中会自动维护数据的版本
  •  每当执行一次put后,都会重新生成新的时间戳
  • C1:STATUS   timestamp=1588748844082, value=已提交

    C1:STATUS   timestamp=1588748952074, value=已付款

    C1:STATUS   timestamp=1588748994244, value=已付款

    get \’ORDER_INFO\’, \’000001\’, {VERSIONS => 3, COLUMN => \’C1\’, FORMATTER => \’toString\’}

    Hbase能不能时间穿梭得看表是否开启了这个功能:

    查看表结构

    describe \’ORDER_INFO\’

    开启版本权限的流程:开启可以保存5个版本

    # 先禁用表
    disable \’ORDER_INFO\’

    # 修改列族 C1 的版本数(比如设为 5)
    alter \’ORDER_INFO\’, {NAME => \’C1\’, VERSIONS => 5}

    # 重新启用表
    enable \’ORDER_INFO\’

    删除操作 -删除单元格数据

    删除状态列数据  

    需求 将订单ID为000001的状态列删除。  

    delete命令

    在HBase中,可以使用delete命令来将一个单元格的数据删除。语法格式如下:

    delete \’表名\’, \’rowkey\’, \’列蔟:列\’。

    注意:此处HBase默认会保存多个时间戳的版本数据,所以这里的delete删除的是最新版本的列数据,但是老版本这时就显示出来啦,若一直删除至老版本都没有的话,就彻底删除完了。  

    删除指定列的一个单元格

    delete \’ORDER_INFO\’,\’000001\’,\’C1:STATUS\’

    删除整行数据

    需求 将订单ID为000001的信息全部删除(删除所有的列)

    deleteall命令

    deleteall命令可以将指定rowkey对应的所有列全部删除。语法:

    deleteall \’表名\’,\’rowkey\’  

    删除指定的订单

    deleteall \’ORDER_INFO\’,\’000001\’  

    清空表

    需求 将ORDER_INFO的数据全部删除 truncate命令  

    truncate命令用来清空某个表中的所有数据。语法:

    truncate \”表名\”

    清空ORDER_INFO的所有数据 truncate \’ORDER_INFO\’

    导入测试数据集

    在资料的 数据集/ ORDER_INFO.txt 中,有一份这样的HBase数据集,我们需要将这些指令放到HBase中执行,将数据导入到HBase中。  

    可以看到这些都是一堆的put语句。那么如何才能将这些语句全部执行呢?

    put \’表名\’,\’ROWKEY\’,\’列蔟名:列名\’,\’值\’     //put当\’列蔟名:列名\’存在时就是更新,不存在就是添加。所有更新命令也是这么写的。

    开始导入:

    上传ORDER_INFO.txt文件 将该数据集文件上传到指定的目录中

    执行  

    使用以下命令执行:

    hbase shell /export/softwars/ORDER_INFO.txt

    即可。

    完整路径:

    /usr/hdp/3.1.4.0-315/hbase/bin/hbase shell /export/softwars/ORDER_INFO.txt

    计数操作

    需求

    查看HBase中的ORDER_INFO表,一共有多少条记录。  

    count命令

    count命令专门用来统计一个表中有多少条数据。语法:

    count ‘表名’ 注意:这个操作是比较耗时的。在数据量大的这个命令可能会运行很久。

    大量数据的计数统计

    当HBase中数据量大时,可以使用HBase中提供的MapReduce程序来进行计数统计。语法如下:

    $HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter \’表名\’

    启动YARN集群

    启动yarn集群

    start-yarn.sh

    启动history server

    启动历史记录文件在hadoop-2.7.7:sbin/mr-jobhistory-daemon.sh start historyserver

    执行MR JOB

    $HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter \’ORDER_INFO\’

    通过观察YARN的WEB UI,我们发现HBase启动了一个名字为rowcounter_ORDER_INFO的作业。  

    查看值的话咋们要到yarn的日志里面去看:

    yarn logs -applicationId application_1766057336546_0001 > result.txt

    less result.txt

    数据导入/导出(10W数据)

    在资料中,有一份10W的抄表数据文件,我们需要将这里面的数据导入到HBase中。

    Import JOB

    在HBase中,有一个Import的MapReduce作业,可以专门用来将数据文件导入到HBase中。 用法  

    hbase org.apache.hadoop.hbase.mapreduce.Import 表名 HDFS数据文件路径

    导入数据

    1 将资料中数据文件上传到Linux中

    2 再将文件上传到hdfs中

    hadoop fs -mkdir -p /water_bill/output_ept_10W
    hadoop fs -put part-m-00000_10w /water_bill/output_ept_10W

    3 启动YARN集群

    start-yarn.sh

    4 使用以下方式来进行数据导入  这里面的数据要求是在Hdfs上。所以/water_bill/output_ept_10W目录是Hdfs上的目录,导入也是按照mapreduce操作一样,将这个目录下的数据进行导入。

    hbase org.apache.hadoop.hbase.mapreduce.Import WATER_BILL /water_bill/output_ept_10W

    解释:/water_bill/output_ept_10W:hdfs路径  

    导出数据

    hbase org.apache.hadoop.hbase.mapreduce.Export WATER_BILL /water_bill/output_ept_10W_export

    解释:/water_bill/output_ept_10W_export:这里数据是导入到hdfs的路径上了

    说明:

    当你运行:

    hbase org.apache.hadoop.hbase.mapreduce.Export WATER_BILL /water_bill/output_ept_10W_export

    导出的数据是 SequenceFile格式,存储在HDFS上。每个文件的内容结构如下:

    查看导出数据的方法:

    # 1. 查看HDFS上的文件列表
    hadoop fs -ls /water_bill/output_ept_10W_export

    # 输出类似:
    # /water_bill/output_ept_10W_export/_SUCCESS
    # /water_bill/output_ept_10W_export/part-m-00000
    # /water_bill/output_ept_10W_export/part-m-00001

    # 2. 查看SequenceFile内容(需要转换为文本查看)
    hadoop fs -text /water_bill/output_ept_10W_export/part-m-00000 | head -n 5

    # 看到的可能是二进制内容,或者转换后的文本类似:
    # row_key1 column=cf1:col1, timestamp=1640995200000, value=value1
    # row_key1 column=cf1:col2, timestamp=1640995200000, value=value2
    # row_key2 column=cf1:col1, timestamp=1641081600000, value=value3

    查看文件格式的方法:

    # 1. 查看文件前几行
    hadoop fs -cat /water_bill/output_ept_10W/part-m-00000_10w | head -n 5

    # 2. 如果是SequenceFile,用-text参数
    hadoop fs -text /water_bill/output_ept_10W/part-m-00000_10w | head -n 5

    # 3. 如果是HFile,用hbase命令查看
    hbase org.apache.hadoop.hbase.io.hfile.HFile -p -f /water_bill/output_ept_10W/part-m-00000_10w

    如果我们的数据格式是:

    # 假设你的数据格式:rowkey,columnfamily:column,value,timestamp

    需要使用ImportTsv工具(文本转HBase) 然后在用org.apache.hadoop.hbase.mapreduce.Import导入

    如果对于很大的数据量,我们就需要Bulk load这中方式 要自己写mapreduce代码了 可以 看后面HBase批量装载——Bulk load

    扫描操作  scan命令

    查看ORDER_INFO表中所有的数据  

    在HBase,我们可以使用scan命令来扫描HBase中的表。语法:

    sca

    赞(0)
    未经允许不得转载:171主机测评 » Hbase -- nosql
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址