• 《OD学HBase》20160814


    一、HBase引入

    http://hbase.apache.org/

    大数据的数据库

    1. 概述

    Hadoop生态系统中的一个分布式、可拓展、面向列、可伸缩,具有自动容错功能的数据库。

    NoSQL数据库

    BigTable:一种分布式海量结构化数据存储系统

    HBase基于google论文实现的开源数据库框架

    场景: 对海量数据进行随机读写、实时查询(对上亿条数据能够在秒级进行访问)

    表:上亿行百万列 ———TB级别甚至PB级别

    设备:廉价的商用服务器

    HBase:真正存储数据还是在HDFS,数据分析处理还是依赖于MapReduce

    2. 搭建HBase

    1)hbase-env.sh

    2)hbase-site.xml

    <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
    </property>

    3)regionservers

    指定hbase数据存储节点regionserver的主机名

    4)backup-masters:指定master节点的备份节点

    5)启动

    bin/start-hbase.sh

    6)检测

    bin/start-hbase.sh

    HMaster进程

    HRegionServer继承

    webui 端口:60010

    http://beifeng-hadoop-02:60010

    8)hbase shell 交互式命令

    bin/hbase shell

    list:查看HBase中的所有表

    create 'test', 'cf':创建一张hbase表,名称test,表的列簇为'cf'

    put 'test', 'rowkey001', 'cf:name','zhangshan':往test表插入一条数据,行健rowkey为rowkey001,列簇(column family)、列标签(column qualifier),值为'zhanshan'

    scan 'test' : 扫描表数据

    回退使用ctrl + delete回退

    rowkey:    

    column=列主键=列簇column family   列标签column qualifier timestarp value

    exit退出

    3. 整合Hue

    通过HBase Thrift servers

    问题:无法联系到 HBase Thrift 1 服务器:Could not connect to beifeng-hadoop-02:9090

    解决方法:在HBASE上启动thrift服务

    启动:bin/hbase-daemon.sh start thrift

    二、HBase的表

    Table 逻辑模型:

    rowkey 行键 --> 类似于RDBMS的主键,唯一标识一行记录

    根据rowkey进行排序

    列簇column family: 创建HBASE表的时候要预先指定,类似于schema的概念

    cf1、cf2、cf3、cf4

    列标签: column qualifier

    列标签可随意添加,真实使用的时候,根据具体业务来定义,由业务来进行约束。

    列标签在不同行的同一个列簇下是可以不相同的。

    timestamp:时间戳,单元格的版本号

    单元格: {table、rowkey、column family、column qualifier、timestamp}  --> value

    hbase的Update:并不是真正意义上对原来的数据进行修改,仅仅只是做了新增操作,只是新增了一个单元格,与原来的单元格仅仅只是时间戳和value不同。

    describe 'test'   ---> 查看hbase表的详细信息

    版本:

    create 'test01', {NAME => 'cf1', VERSIONS => '3', MIN_VERSIONS => '2' }

    scan 'test01', {VERSIONS => 2}

    table

    rowkey

    column family

    column qualifier

    并发:假如数据都是不可变的

    并发编程:将所有对象不可变

    Table物理模型:

    HBase组件:

    1)HMaster:

    (1)主节点

    (2)为Region Server分配Region

    (3)发现失效的Region Server并重新分配其上的region

    (4)管理用户对HBASE表的增删改查操作

    (5)数据不经过Master

    2)Regionserver:

    (1)HBase表的分区

    (2)按照行 rowkey将表数据进行划分,每划分出来的部分称为region,HBASE负载均衡的最小单元。

    默认情况下,表创建时只有一个Region,而且Region空间大小默认是256M。

    随着数据的增加,Region会自动切分,均分成两个Region。

    (3)负责region,处理对这些region的IO请求

    3)Zookeeper

    (1)通过选举,保证任何时候,急群众只有一个master,Master与Region Servers启动时会向Zookeeper注册

    (2)存储Region的寻址入口:

    Zookeeper上面存储hbase:meta这张表有哪些region,这些region在哪些RegionServer上面,Region包含哪些rowkey

    zk上   /hbase/meta-region-server

    (3)表由哪些Region,这些Region在哪些RegionServers上,Region包含哪些rowkey(起始rowkey,截止rowkey)

    这些信息,HBASE有张默认的系统表

    hbase:meta 元数据表,记录以上描述的信息。和普通表是一样的

    (4)实时监控Region server的上线和下线信息,并实时通知给Master

    client -> zookeeper

    (1)从/hbase/meta-region-server节点获取关于hbase:meta表的信息,hbase:meta这张表有哪些region,这些region分布在哪些RegionServer上,每个Region包含哪些rowkey

    (2)从获取到RegionServer信息,直接连接到该RegionServer上,hbase:meta表数据,获取到test表相关信息

    (3)从test表获取真正数据

    Zookeeper上面

    ls /hbase/

    meta-region-server:

    backup-masters: 存储的是backup master信息

    table:存储的是HBASE上表信息

    draining:表示哪些RegionServer下线了

    region-in-transition: 事务

    table-lock:锁信息,只有行锁

    running:

    master:master节点的状态信息

    namespace:表的命名空间

    hbaseid:

    online-snapshot:

    replication:

    splitWAL:

    recovering-regions:

    rs:RegionServers

    hbase表都属于某个namespace,默认default

    系统namespace:hbase

    create 'test02', 'cf1', '', SPLITS => ['10', '20', '30' , '40' ]

    表名,region起始rowkey,时间戳,md5编码

    Region内部结构:

    Region根据表的Column Family列簇划分Store, 

    Store: MemStore,StoreFile

    put 'test02', '25', 'cf1:name', 'value222'

    1)访问zookeeper获取hbase:meta表的位置信息

    2)访问hbase:meta表的数据,获取到test02的位置信息

    3)访问test02表

    (1)根据rowkey找到对应的region

    (2)根据cf1列簇名称找到Region中Store

    (3)插入到Store李米娜MemStore

    (4)MemStore达到最大空间值,刷写到磁盘生成一个StoreFile(本质就是HFile)。

    滚动刷写:当MemStore空间满后,HBASE另外分配一块MemStore来接收数据,而原来的不再接收新数据,只是在进行持久化到磁盘的操作。

    MemStore:一块内存空间,默认128M。

    StoreFile:物理是上DataNode上的一个block

    Region的容错:

    Region的数据本质是HDFS上的文件,(备份),所有Region上的数据其实是由备份的。

    只要Region的信息还在,Region就可以在其他RegionServer上重生。

    当正在往memstore写数据时,RegionServer挂掉;数据丢失。

    WAL机制: Write Ahead Log

    HLog: 本质也是一个HDFS文件。当memstore将数据刷写到磁盘上生成storefile后,对应的数据也会从HLog上删掉。

    hbase往memstore写数据,写到HLog(顺序写),再往memstore上写。

    http://www.cnblogs.com/frydsh/archive/2013/04/13/3018666.html

    HLog日志文件,HLog始终是与MemStore中的数据一致,

    hdfs block是一个逻辑概念

    LSM算法:http://www.cnblogs.com/yanghuahui/p/3483754.html

    三、HDFS上的HBASE

    /hbase 

    /WALS  --->HLog文件存储路径

    /data  ---> HBASE表数据存储路径

    /oldWALS ---> 当MemStore将数据刷写到磁盘生成StoreFile时,HLog会将对应的这部分数据移到oldWALs中,后面再进行删除。

    HBase获取不到zookeeper上的master信息问题:

    http://blog.csdn.net/zwx19921215/article/details/41824751

    四、HBase表的特性

    五、HBase shell

    JRuby实现:

    help

    命令组:

    COMMAND GROUPS:
    Group name: general
    Commands: status, table_help, version, whoami

    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, show_filters

    删除表:disable 'test02',drop 'test02'

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

    创建namespace:create_namespace 'ns1'

    查看namespace:list_namespace

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

    scan 'test01'

    get 'test01','rowkey001'

    get 'test01','rowkey005', 'cf:name'

    get 'test01','rowkey005', 'cf' 

    Group name: tools
    Commands: assign, balance_switch, balancer, catalogjanitor_enabled, catalogjanitor_run, catalogjanitor_switch, close_region, compact, flush, hlog_roll, major_compact, merge_region, move, split, trace, unassign, zk_dump

    create 'test03','cf1'

    put 'test03','rowkey001','cf1:name','zhangsan'

    put 'test03','rowkey001','cf1:sex,'M'

    flush 'test03'  刷写memstore数据到storefile

    Group name: replication
    Commands: add_peer, disable_peer, enable_peer, list_peers, list_replicated_tables, remove_peer, set_peer_tableCFs, show_peer_tableCFs

    Group name: snapshots
    Commands: clone_snapshot, delete_snapshot, list_snapshots, rename_snapshot, restore_snapshot, snapshot

    Group name: quotas
    Commands: list_quotas, set_quota

    Group name: security
    Commands: grant, revoke, user_permission

    Group name: visibility labels
    Commands: add_labels, clear_auths, get_auths, set_auths, set_visibility

    六、JavaAPI

    http://mvnrepository.com/

    HBase支持SNAPPY压缩:

    1)需要将hadoop lib native里面的文件copy到hbase解压安装下lib目录

    cp -r $HADOOP_HOME/lib/native $HBASE/lib/

    2)在hbase-env.sh添加属性

    LD_LIBRARY_PATH = 

    可以从hadoop-env.sh中拷贝过来

    3)将native下的.so文件拷贝的jdk的jre目录中

    cp native/*.so  /jdk/jre/lib/

    4)重启hbase

    5)检验是否支持snappy

    bin/hbase ...CompressionTest ~/mkdir SNAPPY

    6)创建表的时候指定SNAPPY压缩

    create 'test-snappy', {NAME=>'cf1', COMPRESSION => 'SNAPPY'}

    shell命令要点

    属性{'key' => 'value'},如果key为hbase的常量,则不用引号

    使用脚本形式执行HBASE shell命令

    echo 'list' | bin/hbase shell

  • 相关阅读:
    思考--连续的还是跳跃的?(二)
    方法学导论--by 有只茄子
    时空、维度,以及其他(一)
    处理问题的方法--抽象和特例化
    tomcat server 152主机.xml
    java怎么重写覆盖Spring Bean的几种方式
    maven上传jar到私服
    sql_mode=only_full_group_by
    spring何时创建bean
    mysql 快速备份数据库
  • 原文地址:https://www.cnblogs.com/yeahwell/p/5769514.html
Copyright © 2020-2023  润新知