美文网首页大数据
hbase存储相关浅析

hbase存储相关浅析

作者: 佛系小懒 | 来源:发表于2020-02-01 19:54 被阅读0次

    ​Hbase存储相关介绍

    Region Server: 不同Region数据互斥(Table+StartKey+Time);Region数量不能低于集群节点数量

    数据的高可用:内存

    通过HLog及MemStore实现数据的高可用,具体设计如下:

    HLog(WAL:预写日志===binlog,解决高可用、远程备份):HLog是WAL的实现,HLogKey、HLogSyncer(异步刷日志到H)、HLogRoller(生成新的Hlog、删除多余的Hlog)

    MemStore:默认64M,每个列族对应一个Store(含一个MemStore及不定数StoreFile)

    不可靠数据的持久化:落盘

    通过StoreFile进行数据固化,StoreFile重点涉及Hfile及HBase Compaction的处理;刷磁盘的触发方式包含3种方式。

    StoreFile

    HFile:存储的最小单元;Data Block存Key-Val(KeyLength、ValueLength、Key、Value),删除是逻辑删除,不会真的删除

    HBase Compaction:将小的StoreFile合并成大的StoreFile,包括MinorCompaction、MajorCompaction两类

    触发方式

    (1) flush操作(整个regin的StoreFile都会执行);

    (2) 手动触发

    (3) 后台线程周期检查触发(文件数超过阈值;最早更新时间是否超出某个值

    设置hbase.hregion.majorcompaction及hbase.hregion.majorcompaction.jitter,在指定闭区别)

    【hbase.hregion.majorcompaction-hbase.hregion.majorcompaction*hbase.hregion.majorcompaction.jitter,hbase.hregion.majorcompaction+hbase.hregion.majorcompaction*hbase.hregion.majorcompaction.jitter】

    分类

    (1) MinorCompaction:耗时相对较短,小的相邻的StoreFile合并

    (2) MajorCompaction:耗时长,合并成一个StoreFile,会删除三类数据:ttl过期数据、版本号超过设定的版本数的数据(设置了version数的前提下)、被删除的数据(自动触发的配置在生产环境经常被禁掉,改手动操作--触发的是MajorCompaction)

    数据存储过程

    数据查询过程

    Hbase的具体操作

    前置

    namespace对应mysql的db

    创建带namespace(ns1)的表(t1)

    create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}

    创建使用默认namespace的多个列族的表(f1、f2、f3)

    create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}    等价于    create 't1', 'f1', 'f2', 'f3'

    创建带配置的表

    create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}

    create 't1', {NAME => 'f1', CONFIGURATION => {'hbase.hstore.blockingStoreFiles' => '10'}}

    带拆分信息的表

    hbase> create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40']

    hbase> create 't1', 'f1', SPLITS => ['10', '20', '30', '40']

    hbase> create 't1', 'f1', SPLITS_FILE => 'splits.txt', OWNER => 'johndoe'

    hbase> create 't1', {NAME => 'f1', VERSIONS => 5}, METADATA => { 'mkey' => 'myvalue' }

    hbase> # Optionally pre-split the table into NUMREGIONS, using

    hbase> # SPLITALGO ("HexStringSplit", "UniformSplit" or classname)

    hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

    hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit', REGION_REPLICATION => 2, CONFIGURATION => {'hbase.hregion.scan.loadColumnFamiliesOnDemand' => 'true'}}

    hbase> create 't1', {NAME => 'f1', DFS_REPLICATION => 1}

    Hbase的表结构

    Table= RowKey + Family + Column + Timestamp + Value( RowKey + Family + Column + Timestamp) →  Value

    Row Key

    Row key行键可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。

    列族 (column family)

    hbase表中的每个列都归属某个列族列族是表的chema的一部分(列不是);

    列族必须在使用表之前定义;

    列名都以列族作为前缀(例如courses:history , courses:math 都属于 courses 这个列族)

    时间戳

    HBase中通过row和columns确定的cell为存储单元;

    每个 cell都保存着同一份数据的多个版本,版本通过时间戳来索引

    时间戳的类型是 64位整型:可以由hbase(在数据写入时自动 )赋值(精确到毫秒的当前系统时间);时间戳也可以由客户显式赋值

    每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。

    为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase提供两种数据版本回收方式:保存数据的最后n个版本;保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。

    对Hbase而言,表结构设计会对系统的性能以及开销上造成很大的区别;

    Rowke排序+Column排序进行存储

    hbase shell操作

    数据存表中

    put ‘t1’ ,‘col_f’, 'val-取值'

    查看表中所有数据

    scan ‘表名’

    查询表中一行数据

    get '表名', 'rowkey'

    查询表中一行的指定列

    get 'table name', ‘rowid’, {COLUMN => ‘column family:column name ’}

    删除一行中所有cell

    deleteall ‘<table name>’, ‘<row>’

    使用 delete 命令,可以在一个表中删除特定cell

    delete ‘’, ‘’, ‘’, ‘’

    手工合并hfile

    compact 't1'

    查看表结构

    describe 't1' / desc  't1'

    修改表结构(修改表结构必须先disable)

    alter 't1', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}

    disable 'test1'

    alter 'test1',{NAME=>'body',TTL=>'15552000'},{NAME=>'meta', TTL=>'15552000'}

    enable 'test1'

    分配权限

    语法 grant <user> <permissions> <table> <column family> <column qualifier> 参数后面用逗号分隔

    权限用五个字母表示:"RWXCA".其中分别表示READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')例如,给用户‘test'分配对表t1有读写的权限,hbase(main)> grant 'test','RW','t1'

    查看权限

    语法:user_permission <table>

    # 例如,查看表t1的权限列表hbase(main)> user_permission 't1'

    收回权限

    与分配权限类似,

    语法:revoke <user> <table> <column family> <column qualifier>

    # 例如,收回test用户在表t1上的权限revoke 'test','t1'

    Region管理

    1)移动region

    语法:move 'encodeRegionName', 'ServerName'

    encodeRegionName指的regioName后面的编码,ServerName指的是master-status的Region Servers列表

    示例

    hbase(main)>move'4343995a58be8e5bbc739af1e91cd72d','db-41.xxx.xxx.org,60020,1390274516739'

    2)开启/关闭region

    语法:balance_switch true|false

    hbase(main)>balance_switch

    3)手动split

     语法:split 'regionName', 'splitKey'

    4)手动触发major compaction

    Compact all regions in a table:

    #hbase> major_compact't1'

    Compact an entire region:

    #hbase> major_compact'r1'

    Compact a single column family within a region:

    #hbase> major_compact'r1','c1'

    Compact a single column family within a table:

    #hbase> major_compact't1','c1'

    配置管理及节点重启

    1)修改hdfs配置

    hdfs配置位置:/etc/hadoop/conf,同步hdfs配置

    cat/home/hadoop/slaves|xargs -i -t scp /etc/hadoop/conf/hdfs-site.xml hadoop@{}:/etc/hadoop/conf/hdfs-site.xml

    #关闭:

    cat/home/hadoop/slaves|xargs -i -t ssh hadoop@{} "sudo /home/hadoop/cdh4/hadoop-2.0.0-cdh4.2.1/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop datanode"

    #启动:

    cat/home/hadoop/slaves|xargs -i -t ssh hadoop@{} "sudo /home/hadoop/cdh4/hadoop-2.0.0-cdh4.2.1/sbin/hadoop-daemon.sh --config /etc/hadoop/conf start datanode"

    2)修改hbase配置

    同步hbase配置

    cat/home/hadoop/hbase/conf/regionservers|xargs -i -t scp /home/hadoop/hbase/conf/hbase-site.xml hadoop@{}:/home/hadoop/hbase/conf/hbase-site.xml

    # graceful重启

    cd~/hbase

    bin/graceful_stop.sh--restart --reload --debug inspurXXX.xxx.xxx.org

    相关文章

      网友评论

        本文标题:hbase存储相关浅析

        本文链接:https://www.haomeiwen.com/subject/alixxhtx.html