• Hadoop Hbase理论及实操


    Hbase特点

    HBase是一个构建在HDFS上的分布式列存储系统;
    HBase是基于Google BigTable模型开发的,典型的key/value系统;
    HBaseApache Hadoop生态系统中的重要一员,主要用于海量结构化数据存储;
    从逻辑上讲,HBase将数据按照表、行和列进行存储。
    hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。

    Hbase 储存原理

    HBase不是一个关系型数据库,它需要不同的方法定义你的数据模型,HBase实际上定义了一个四维数据模型,下面就是每一维度的定义:

    行键:每行都有唯一的行键,行键没有数据类型,它内部被认为是一个字节数组。

    列簇:数据在行中被组织成列簇,每行有相同的列簇,但是在行之间,相同的列簇不需要有相同的列修饰符。在引擎中,HBase将列簇存储在它自己的数据文件中,所以,它们需要事先被定义,此外,改变列簇并不容易。

    列修饰符:列簇定义真实的列,被称之为列修饰符,你可以认为列修饰符就是列本身。

    版本:每列都可以有一个可配置的版本数量,你可以通过列修饰符的制定版本获取数据

    RowKey:是Byte array,是表中每条记录的“主键”,方便快速查找,Rowkey的设计非常重要。
    Column Family:列族,拥有一个名称(string),包含一个或者多个相关列
    Column:属于某一个columnfamilyfamilyName:columnName,每条记录可动态添加
    Version Number:类型为Long,默认值是系统时间戳,可由用户自定义
    Value(Cell)Byte array

     

    Hbase 物理储存模型

    每个column family存储在HDFS上的一个单独文件中,空值不会被保存。
    Key Version number在每个 column family中均有一份;
    HBase 为每个值维护了多级索引,即:<key, column family, column name, timestamp>

    物理储存

    1table中所有的行都是按照row key的字典排序

    2table在行方向上分割为多个Region

    3Region按大小分割,每个表做出一个region 随着数据的增加,达到一个值只够

    就会自动拆分,之后会越来越多的Region

    4RegionHbase中分布式储存和负载均衡的最小单元

    不同的Region 分布到不同的RegionServer

    5Region虽然是分布式存储的最小单元,但并不是存储的最小单元。Region由一个或者多个Store组成,每个store保存一个columns family;每个Strore又由一个memStore0至多个StoreFile组成,StoreFile包含HFilememStore存储在内存中,StoreFile存储在HDFS

     

    Hbase架构及基本组件

     

     

    Hbase基本组件说明

    Client

    包含访问hbase的接口,并维护cache来加快对HBase的访问,比如region的位置信息

    Master

    1region server 分配region

    2负责region server 的负载均衡

    3发现生效的region server并重新分配其他的region

    4管理用户对表的增删改查

    Region server

    1 region server维护region 处理对这些region'io请求

    2 region server 负责切分运行过程中变大的region

    Zookeeoer

    1 通过选举,保证任何时候,集群中只有一个master masterregionservers启动时会向zooker注册

    2储存所有region的寻址入口

    3实时监控region server的上下线信息,并实时给master

    4 储存hbaseschematable元数据

    5默认下 hbase管理zooeeper的实例,比如启动或者停止zookeeper

    6 zookeeper 的引入使得master不再是单点故障

     

    write-ahead-Logwal

     

     

    该机制用于数据的容错和恢复:

    每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同RegionLog数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取 到这些regionHRegionServerLoad Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flushStoreFiles,完成数据恢复

    HBase容错性
    Master容错:Zookeeper重新选择一个新的Master
    ü无Master过程中,数据读取仍照常进行
    ü无master过程中,region切分、负载均衡等无法进行
    RegionServer容错:定时向Zookeeper汇报心跳,如果一旦时间内未出现心跳,Master将该RegionServer上的Region重新分配到其他RegionServer上,失效服务器上“预写”日志由主服务器进行分割并派送给新的RegionServer
    Zookeeper容错:Zookeeper是一个可靠地服务,一般配置35Zookeeper实例
    Region定位流程:

    寻找RegionServer

    ZooKeeper--> -ROOT-(Region)--> .META.--> 用户表

    -ROOT-
    ü表包含.META.表所在的region列表,该表只会有一个Region

    üZookeeper中记录了-ROOT-表的location

    .META.

    表包含所有的用户空间region列表,以及RegionServer的服务器地址。

    Hbase使用场景

    1大数据量的存储,大数据量高并发的操作

    2需要对数据的随机的读写操作

    3读写均是简单的操作

    Hdfs 适合批处理场景不支持数据的随机查找 不支持增量数据的查找

    不支持数据的更新

     

    参考地址http://blog.csdn.net/woshiwanxin102213/article/details/17584043

    Hbase shell 使用

    使用hbase shell 进入命令行

      1 查询服务器状

    Status

      2创建表

    注意不能加:

     Create ‘lvhou’,’lvhou_id’,’address’,’info’

      3获取表的结构 及查看表

          List

          Desc ‘lvhou’

      4 删出一个列族

       Disable ‘lvhou’

       Alter ‘member’,{NAME=>’address’,METHOD=>’delete’}

       Desc ‘lvhou’

       Enable ‘lvhou’

     

    5 删除一个表

    删之前一定要设置表不可用

      Disable ‘lvhou’

      Drop ‘lvhou’

       Desc ‘lvhou’

     

    6将表重新创建回来

     Create ‘lvhou’,’lvhou_id’,’addrss’,’info’

    7插入数据

     

    8查询数据

     

    扫描全表

    删除id=001’的infoage字段

    删除整行

    查询表中的行数

    将整张表清空

     

    使用hive操作表

    首先在hbase中创建表

     

    2hive中创建表

     

    3hive插入数据

     

    hbase中查寻

     

    PHOENIX操作

    登陆到phoenix

     

    查看表

     

    插入数据

     

    查看数据

     

    查看hbase数据

     

    官网phoenix总结

    1select

     Select * from lvhou_test limit 1000;

    从一个或多个表中选择数据。UNION ALL组合来自多个select语句的行。ORDER BY根据给定的表达式对结果进行排序。LIMIT(或FETCH FIRST)限制查询返回的行数,如果未指定或指定为null或小于零,则不应用限制。的LIMIT(或FETCH FIRST)子句后执行ORDER BY,以支持前N个类型的查询子句。OFFSET子句在开始返回行之前跳过很多行。可选的提示可用于覆盖由查询优化器做出的决定。

    SELECT * FROM TEST LIMIT 1000;
    SELECT * FROM TEST LIMIT 1000 OFFSET 100;
    SELECT full_name FROM SALES_PERSON WHERE ranking >= 5.0
        UNION ALL SELECT reviewer_name FROM CUSTOMER_REVIEW WHERE score >= 8.0

    2 Upsert values

    如果不存在则插入,否则更新表中的值。列的列表是可选的,如果不存在,则值将按照它们在模式中声明的顺序映射到列。值必须计算为常数。

    ON DUPLICATE KEY如果您需要UPSERT原子,请使用该条款(Phoenix 4.9中提供)。在这种情况下,性能会更慢,因为在完成提交时需要在服务器端读取该行。使用IGNORE,如果你不是要不要UPSERT,如果行已存在执行。否则,UPDATE表达式将被评估,并且用于设置列的结果,例如执行原子增量。一个UPSERT以相同的同一行提交的批处理将在执行顺序进行处理。

    例:

    UPSERT INTO TEST VALUES('foo','bar',3);
    UPSERT INTO TEST(NAME,ID) VALUES('foo',123);
    UPSERT INTO TEST(ID, COUNTER) VALUES(123, 0) ON DUPLICATE KEY UPDATE COUNTER = COUNTER + 1;
    UPSERT INTO TEST(ID, MY_COL) VALUES(123, 0) ON DUPLICATE KEY IGNORE;

    Upsert select

    如果不存在插入,并根据运行另一个查询的结果更新表中的行。这些值根据源和目标表之间的匹配位置来设置。列的列表是可选的,如果不存在,将按照它们在模式中声明的顺序映射到列。如果自动提交开启,并且a)目标表与源表匹配,并且bselect不执行聚合,则目标表的总体将在服务器端完成(具有约束违反记录但是否则忽略)。否则,在客户端上缓存数据,如果自动提交开启,则按照UpsertBatchSize连接属性(或phoenix.mutate.upsertBatchSize HBase配置属性默认为10000行)按行批处理提交数据,

    例:

    UPSERT INTO test.targetTable(col1, col2) SELECT col3, col4 FROM test.sourceTable WHERE col5 < 100
    UPSERT INTO foo SELECT * FROM bar;

    3 Delete

    删除where子句选择的行。如果自动提交开启,则删除完全由服务器端执行。

    例:

    DELETE FROM TEST;
    DELETE FROM TEST WHERE ID=123;
    DELETE FROM TEST WHERE NAME LIKE 'foo%';

    4 Crteate table

    创建一个新表。HBase引用的表和列族如果不存在,将被创建。除非是双引号,否则所有表,列系列和列名都是高位,在这种情况下,它们是区分大小写的。HBase表中存在但未列出的列系列将被忽略。在创建时,为了提高查询性能,如果没有明确定义列族,则将空键值添加到任何现有行或默认列族的第一列系列中。Upserts还将添加这个空键值。这可以通过拥有一个键值列来提高查询性能,我们可以保证始终存在,从而最小化必须投影并随后返回给客户端的数据量。HBase表和列配置选项可以作为键/值对传递,以HBase根据需要配置表。请注意,当使用该IF NOT EXISTS子句时,如果表已经存在,则不会对此进行任何更改。另外,没有验证是否检查现有的表元数据是否与提出的表元数据相匹配。所以最好使用DROP TABLE后面CREATE TABLE是表元数据可能会改变。

    例:

    CREATE TABLE my_schema.my_table ( id BIGINT not null primary key, date)
    CREATE TABLE my_table ( id INTEGER not null primary key desc, date DATE not null,
        m.db_utilization DECIMAL, i.db_utilization)
        m.DATA_BLOCK_ENCODING='DIFF'
    CREATE TABLE stats.prod_metrics ( host char(50) not null, created_date date not null,
        txn_count bigint CONSTRAINT pk PRIMARY KEY (host, created_date) )
    CREATE TABLE IF NOT EXISTS "my_case_sensitive_table"
        ( "id" char(10) not null primary key, "value" integer)
        DATA_BLOCK_ENCODING='NONE',VERSIONS=5,MAX_FILESIZE=2000000 split on (?, ?, ?)
    CREATE TABLE IF NOT EXISTS my_schema.my_table (
        org_id CHAR(15), entity_id CHAR(15), payload binary(1000),
        CONSTRAINT pk PRIMARY KEY (org_id, entity_id) )
        TTL=86400

    5 Drop table

    放一张桌子 可选CASCADE关键字也会导致表上的任何视图都被删除。删除表时,默认情况下,底层HBase数据和索引表将被删除。phoenix.schema.dropMetaData可用于覆盖此值,并保留HBase时间点查询的表。

    例:

    DROP TABLE my_schema.my_table;
    DROP TABLE IF EXISTS my_table;
    DROP TABLE my_schema.my_table CASCADE;

  • 相关阅读:
    MySql模糊查询like通配符使用详细介绍
    使用powershell批量添加Qt的文件(生成pro)
    宏定义的教训
    使用powershell批量添加Keil和IAR的头文件路径
    python和数据科学(Anaconda)
    CDCE913产生任意频率
    QT中检索设定目录下所有指定文件的方法
    QT中将ASCII转换为对应数值的方法
    STM8如何使用自带的bootloader
    QT中使用函数指针
  • 原文地址:https://www.cnblogs.com/tsxylhs/p/7353728.html
Copyright © 2020-2023  润新知