定义:  HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提  供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不  同的是HBase基于列的而不是基于行的模式。——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
********************************************************************HBase*********************************************************************************************
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

、HBase特点
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

    Hbase是一个面向列的分布式存储系统。

    )存储量大      :可以存储很大的数据量,而关系型数据库是有瓶颈的(一个表可以有数十亿行,上百万列)

    )面向列         : 每行都有一个可排序的主键(rowkey),和任意多的列,列可以根据需要动态的增加,同一张表中可以有很多截然不同的列

    )  稀疏            :   对于空的列(null ) 不占用存储空间的,表可以设计的非常稀疏

    )数据多版本    :每个数据可以有多个版本存储,默认情况下版本号自动分配的,一般来说就是插入时间戳。

    )数据类型单一:在Hbase中数据都是字符串,没有类型

————————————————————————————————————————————————————————————————————
、基本概念
————————————————————————————————————————————————————————————————————

    推荐概念理解网址:https://blog.csdn.net/devcy/article/details/79790113

    )表空间(namespace) :类似于mysql中数据库的概念(database)

    ) 表(table)

    ) 行(row)

    ) 列(Column)

    ) 单元格(cell):    都是由时间戳,具体的值组成(可以看下列的模型)

    ) 行键(rowkey)
            ①所有的行是按照rowkey的字典序进行排序的,字典序是按照二进制逐字节进行比较的
                           (就是每个key的第一位进行比较,然后第二位进行比较,然后第三位,例如:100比20小)
            ②行键总是唯一的,并且只出现一次,行键可以是任意的字节 支持64kb

    ) 列簇:(column family):由若干个列构成一个列簇

    注意:①列簇在建表的时候就需要定义好,并且不能频繁修改,数量也不要太多

             ②空的列(null ) 不占用存储空间的,表可以设计的非常稀疏
————————————————————————————————————————————————————————————————————

、组件
————————————————————————————————————————————————————————————————————

    HBase的服务器体系结构遵从简单的主从服务器架构,它由HRegion Server集群 + HBase Master集群服务器 + ZK集群组成 。

    主节点Hmaster在整个集群当中只有一个在运行,从节点HRegionServer有很 多个在运行。即只有一个机器上面跑的进程是Hmaster,很多机器上面跑的进程是HRegionServer,

    ZK在HBase和Hadoop HA中一样,都是保存元数据的。

        Hadoop HA :

            ①保存镜像文件和编辑日志
            ②保证集群中只有一个NN

        HBase:

            ①存储HBase的-ROOT-表和.META.表
            ②保证HBase Master集群只有一个HBase Master

        区别:①NN中有镜像文件和编辑日志,所以DN中的心跳检测发送给NN。但是HBase Master没有元数据,所以心跳检测有ZK代替!
                  ②Hadoop HA中起到共享存储系统,但是在HBase中,却是起到HBase Master 和 HRegion Server的中介作用!!

    Zookeeper:

        ①保证任何时候,集群中只有一个HMaster(HBase没有单点故障!!!可以同时启动多个,但是ZK得保证每时刻只有一个HMaster运行);
        ②存储HBase的-ROOT-表和.META.表:

            -ROOT-表:记录了所有.META.表的元数据信息,-ROOT-表只有一个Region --->意思是-ROOT-表只有一张
            .META.表:记录了Hbase中所有表的所有HRegion的元数据信息(位置信息等),.META.表可以有多个Region ----->意思是-META-表可以有多张

            所以说-ROOT保存的是多张.META表的元数据信息

        ③实时监控HRegion Server的信息(心跳检测),并实时通知给HMaster;       

        注:HBase没有单点故障!!!可以同时启动多个,但是ZK得保证每时刻只有一个HMaster运行    

    HMaster:

      ①为HRegionServer分配HRegion
      ②管理HRegionServer的负载均衡(合并的storeFile文件向其他HRegion Server迁移)
      ③在HRegionServer停机后,负责失效HRegionServer上
         HRegion迁移工作。

      ④在Region Split后,负责新Region的分配
      ⑤HDFS上的垃圾文件回收(storeFile合并、切分都在HDFS上进行)

        注:HMaster需要知道HRegionServer的信息,这些信息都有Zookeeper提供!

  HRegion Server:

        ①监控维护Region,处理对这些HRegion的响应,请求;
        ②负责切分在运行过程中变得过大的HRegion。

    HLog

        HLog:用来做灾难恢复使用,HLog记录本台region server上所有HRegion数据的所有变更,一旦region server 宕机,就可以从log中进行恢复。

        注:每个HRegion Server只有一个HLog

    HRegion:(结合图来看)

        注意:
            ①一张表由多个HRegion组成,根据rowkey划分 :

                eg:分为三个HRegion,那么他们的存储rowkey值会是(-)(-)(-),分布在不同的HRegion Server

            ②HRegion由多个store组成,每个store对应一个列族:

                eg:比如一张表有十个列族,那么HRegion会有十个store

        ③store有一个memstore(缓存区)和多个HFile文件组成:


          eg:对写数据时,会先写进memstore,memstore达到阈值时,溢写成文件StoreFile。


          HRegion会将大量的热数据、访问频次最高的数据存储到MemStore中,这样用户在读写数据的时候不需要从磁盘中进行操作,
          直接在内存中既可以读取到数据,正因为MemStore这个重要角色的存在,Hbase才能支持随机,高速读取的功能


        ④MemStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存(二进制)


        ⑤当多个StoreFile文件达到一定的大小后,会触发Compact合并操作,合并为一个StoreFile

        ⑥当Storefile大小超过一定阈值(256M)后,会把当前的HRegion分割为两个(Split),并由Hmaster分配到相应的HRegionServer,实现负载均衡!!

          注:每个HRegionServer相当于一个DN,但有些DN没有HRegionServer。
            所以HMaster将分割后的StoreFile文件数据移到HRegionServer(HDFS)上,这过程必须要实现负载均衡


          注:HBase是通过DFS client把数据写到HDFS上

————————————————————————————————————————————————————————————————————

、HBase读写流程
————————————————————————————————————————————————————————————————————

    写数据流程:
            ,Client先访问zookeeper的root表,然后访问meta表,从meta表获取相应HRegion信息
            ,通过HRegion信息,找到相应的regionserver

            ,把数据操作、真实数据分别写到HLog和MemStore上一份

            ,MemStore达到一个阈值后则把数据刷成一个StoreFile文件。(若MemStore中的数据有丢失,则可以HRegionServer上的HLog上恢复)

       ,当多个StoreFile文件达到一定的大小后,会触发Compact合并操作,合并为一个StoreFile,(这里同时进行版本的合并和数据删除。)

            ,当Storefile大小超过一定阈值后,HRegionServer会把当前的Region分割为两个(Split),并由Hmaster分配到相应的HRegionServer,实现负载均衡

            注:HFile是HBase中真正实际数据的存储格式,HFile是二进制格式文件,StoreFile就是对HFile进行了封装(其实就是一个东西)

    HBase读数据流程

            ,Client先访问zookeeper的root表,然后访问meta表,从meta表获取相应HRegion信息
            ,找到这个HRegion对应的regionserver

            ,查找对应的HRegion
            ,先从MemStore找数据,如果没有,再到StoreFile上读(为了读取的效率)。

    注意:

        ①Client访问hbase上数据时并不需要Hmaster参与,数据的读写也只是访问RegioneServer。
        ②HMaster仅仅维护这table和Region的元数据信息,负载很低。

        ③HBase是通过DFS client把数据写到HDFS上

        ④HFile是HBase中真正实际数据的存储格式,HFile是二进制格式文件,StoreFile就是对HFile进行了封装(其实就是一个东西)
        ⑤MemStore溢写文件成StoreFile,和对StoreFile进行合并都是在HDFS上进行的
————————————————————————————————————————————————————————————————————
、Hbase寻址过程
————————————————————————————————————————————————————————————————————
     HBase 有两张特殊表(都在ZK上):
        .META.:记录了用户所有表拆分出来的的 Region 映射信息,.META.可以有多个 Regoin(rowkey段)
        -ROOT-:记录了.META.表的 Region 信息,相当于给META表的内容做了一次索引

    Client 访问用户数据前需要首先访问 ZooKeeper,找到-ROOT-表的 Region 所在的位置,然 后访问-ROOT-表,
    接着访问.META.表,从META表中找到RowKey段所在的HRegion Server的位置信息,最后才能找到用户数据的位置去访问,
    中间需要多次 网络操作,不过 client 端会做 cache 缓存。
————————————————————————————————————————————————————————————————————

、基本命令
————————————————————————————————————————————————————————————————————

        bin/hbase shell                    //进入shell

        list_namespace                    //列出所有命名空间
        list_namespace_tables 'hbase'                //列出命名空间hbase中的所有表

        create_namespace 'test'                //创建命名空间
        drop_namespace 'test'                //删除命名空间

        create 'test:t1', 'f1', 'f2', 'f3'                //在命名空间test中创建表t1,有三个列族:‘f1 , 'f2' , 'f3'    

        disable 'test:t1'
         drop 'test:t1'                    //删除表必须先禁用

        put ','f1:name','tiantian'            //添加数据
        put '
        put '
        put '

        '                       //得到key=1001所有列
        ','f1'                //得到key=1001列族下的所有列
        ','f1:name'                //查询key=1001的名字
        }     //得到两个版本的年龄

        count 'test:t1'                    //表的记录数

        delete ','f1:name'                //删除1001的name数据

        scan 'test:t1'                    //Scan 类似于mysql中的select * 但是在实际开发中不建议使用。如果使用请买好车票
        scan 'test:t1',{COLUMNS =>'f1:name'}            //指定列族扫描

        注:①如果没有指定命名空间,默认是defult命名空间

                   '                 //得到defult下key=1001所有列    

             ②当输入create、get、put等关键字中回车,会显示相关命令的实例。    

————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————
、HBase API
————————————————————————————————————————————————————————————————————
    注:Hbase和Hive、MR一样都有自己的API实现,可以用java去实现增删查改。
————————————————————————————————————————————————————————————————————
、Rowkey的设计原则
————————————————————————————————————————————————————————————————————

    ①RowKey唯一原则:必须在设计上保证其唯一性。

    ②RowKey长度原则:一般设计成定长。建议是越短越好

    ③RowKey散列原则:

            如果用时间戳做rowkey,那么HRegion可能是(-)(-)(-)(-);
            那么产生的结果是(-)(-)的数据很多,

            所以一般把时间戳倒过来,-->

    热点问题:

        、加盐:是在rowkey的前面分配随机数,当给rowkey随机前缀后,它就能分布到不同的region中
        、哈希:将rowkey转化为hash值,除以集群个数,就能避免热点问题
        、反转:时间戳反转过来,避免热点问题
————————————————————————————————————————————————————————————————————
、Hbase Filter
————————————————————————————————————————————————————————————————————

    就相当于过滤器,理解为sql语句的过滤条件 where 对查询出来的结果进行过滤,操作Hbase的过滤器可以通过shell的方式完成

     RowFilter:筛选出匹配的所有行
     ValueFilter:按照具体的值来筛选单元格
     ColumnPrefixFilter 按照列的前缀来查找单元格

    需求:  找到访问的网站www.umeng.com的记录
        scan 'ns1:phoneLog',FILTER=>"ValueFilter(=,'binary:www.umeng.com')"

    注:Filter的重要性会越来越低,由于phoenix,毕竟sql是公用的。
————————————————————————————————————————————————————————————————————
、Hbase的优化
————————————————————————————————————————————————————————————————————

    、配置MemStore缓存区的大小

    、配置文件合并 compact阈值

    、配置文件拆分的阈值与split

    、还有其他的诸如垃圾回收机制
————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
********************************************************************HBase集成MapReduce***************************************************************************
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
、Hbase与MapReduce集成
————————————————————————————————————————————————————————————————————
    ————————————————————————————————————————————————————————————————
    ①系统集成
    ————————————————————————————————————————————————————————————————
        ————————————————————————————————————————————————————————————
        )安装配置
        ————————————————————————————————————————————————————————————
            Hbase与MapRedcue内部已经做好了集成,直接调用即可

            集成的模式: 

                答:Hbase中读取数据,则可以作为map的输入, 将数据写到hbase中,Hbase就可以作为reduce的输入

            步骤:
                ①把HBase集成的jar包加载到hadoop的classpath路径中(否则会报ClassNotFoundException)

                    vi /etc/profile:
                    export HBASE_HOME=/opt/app/hbase-
                    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:`$HBASE_HOME/bin/hbase mapredcp`

                ②查看集成的示例命令

                    hadoop jar  /opt/app/hbase-/lib/hbase-server-.jar     //需要将hadoop_home/bin追加到path

                          CellCounter: Count cells in HBase table.
                          WALPlayer: Replay WAL files.
                          completebulkload: Complete a bulk data load.
                          copytable: Export a table from local cluster to peer cluster.
                          export: Write table data to HDFS.
                          exportsnapshot: Export the specific snapshot to a given FileSystem.
                          import: Import data written by Export.
                          importtsv: Import data in TSV format.
                          rowcounter: Count rows in HBase table.
        ————————————————————————————————————————————————————————————
        )集成实例(必须在HMaster上运行)
        ————————————————————————————————————————————————————————————
            ①测试统计行数命令(rowcounter)

                hadoop jar  /opt/app/hbase-/lib/hbase-server-.jar rowcounter test:t1

                注:会自动的统计test:t1表的行数

            ②测试导入命令(importcsv)

                )create 'test:t1','f1','f2'                        //创建一个表,表中含有两个列族(f1,f2)

                )  创建一个1.csv

                    ,tiantian,shankou,
                    ,xuewei,jingbian,

                )  hdfs dfs -put  ./.csv   /                        //上传文件到hdfs上

                )

                    hadoop jar /opt/app/hbase-/lib/hbase-server-.jar
                    importtsv -Dimporttsv.separator=,                 //文件中的分隔符
                    -Dimporttsv.columns=HBASE_ROW_KEY,
                    f1:name,
                    f2:location,
                    f2:age
                    test:t1
                    /.csv

                )测试:scan 'test:t1'
    ————————————————————————————————————————————————————————————————
    ②java集成Hbase与MapReduce
    ————————————————————————————————————————————————————————————————
              系统集成其实就是运行hbase自带的jar包

              所以我们其实也可以写MR程序,打包成jar,只不过Map和Reduce继承的TableMapper和TableReducer

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
******************************************************************** Hbase整合hive**********************************************************************************
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

    Hbase:负责存储和读取,没有分析数据的能力,
    hive:对数据进行分析是hive的基本功能,    

    ①原理:
        内部表: 在hive中创建表,在创建的时候hbase同时创建,并且数据保存在hbase中

        外部表: 在hbase中已经存在了一张表,hive创建外部表对hbase中表进行映射,数据还是存在hbase中

    ②配置过程省略;

        eg:    CREATE TABLE hbase_table_1(key int, value string)
            STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
            WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")                //rowkey-------------->key
            TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");        //列族cf1中的列val----->value

            注:hive:hbase_table_1     ------->    hbase: xyz        (两张表的映射)

    ③当导入数据时,首先创建一个普通的表,导入数据,之后使用查询的方式,导入关联表中

        load data local inpath '/data/test.txt' into table hbase_table_2;
        insert overwrite table hbase_table_1 select key ,value from hbase_table_2;

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
********************************************************************Phoenix 与Hbase的集成**************************************************************************
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

        安装步骤省略:

        phoenix : 利用类似于sql语句对hbase进行增删查改。 

        语法:http://forcedotcom.github.io/phoenix/

————————————————————————————————————————————————————————————————————

4-HBase的更多相关文章

  1. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  2. Redis/HBase/Tair比较

    KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式    支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...

  3. Hbase的伪分布式安装

    Hbase安装模式介绍 单机模式 1> Hbase不使用HDFS,仅使用本地文件系统 2> ZooKeeper与Hbase运行在同一个JVM中 分布式模式– 伪分布式模式1> 所有进 ...

  4. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

  5. Spark读写Hbase的二种方式对比

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 一.传统方式 这种方式就是常用的TableInputFormat和TableOutputForm ...

  6. 深入学习HBase架构原理

    HBase定义 HBase 是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtabl ...

  7. hbase协处理器编码实例

    Observer协处理器通常在一个特定的事件(诸如Get或Put)之前或之后发生,相当于RDBMS中的触发器.Endpoint协处理器则类似于RDBMS中的存储过程,因为它可以让你在RegionSer ...

  8. hbase集群安装与部署

    1.相关环境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 hbase1.2.4 本篇文章仅涉及hbase集群的搭建,关于hadoop与zookeeper的相关部 ...

  9. 从零自学Hadoop(22):HBase协处理器

    阅读目录 序 介绍 Observer操作 示例下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,Sour ...

  10. Hbase安装和错误

    集群规划情况: djt1 active Hmaster djt2 standby Hmaster djt3 HRegionServer 搭建步骤: 第一步:配置conf/regionservers d ...

随机推荐

  1. ios 当margin-left margin-right 超过设备宽度

    ios 当margin-left  margin-right过长,相加超过  超过设备宽度时,导致页面不能上下滚动,目前尚未找到解决办法,记录一下

  2. C语言简单计算一元二次方程

    #include <stdio.h> #include <math.h> /*计算一元二次方程的根*/ void Cal(double a,double b,double c) ...

  3. 兄弟连学python---Socket介绍

    UDP协议 UDP:用户数据报协议,不可靠性,只是把应用程序传给IP层数据报送出去,但是不能保证他们是否能到达目的地,传输数据报钱不用再客户端和服务器之间建立连接,并且没有超时重发机制,所以传输速度快 ...

  4. Spring EnableWebMvc vs WebMvcConfigurationSupport

    EnableWebMvc vs WebMvcConfigurationSupport spring doc解释 WebMvcConfigurationSupport: This is the main ...

  5. 如何将本地git仓库中的代码上传到github

    1,  在github上新建一个仓库,比如为:CSS3Test,仓库地址为:https://github.com/hyuanyuanlisiwei/CSS3Test 2,本地git仓库中的文件项目为C ...

  6. tornado--启动

    tornado--启动 from tornado import web from tornado import ioloop from tornado.httpserver import HTTPSe ...

  7. javaSE-多线程

    [线程池概念] 由于系统启动一个新线程的成本是比较高的,因为他涉及与操作系统的交互(这也就是为什么可以有百万个Goroutines,却只有几千个java线程).在这种情形下,使用线程池可以很好地提高性 ...

  8. 光照构建失败。Swarm启动失败

    这是别人(http://blog.csdn.net/z609932088/article/details/52368015)写的,亲试可用 如下图 百度许久,有大神指出是我在编译源码的的时候没有将其中 ...

  9. ERROR: cannot launch node of type [turtlebot_teleop/turtlebot_teleop_key] 问题解决

    当遇到问题

  10. django1.4 简单事例 ,根目录下templates

    django发展很快,但是有的是用的老版本,比如我现在看到一个项目,它用的是 Django1.4,而且app不是创建在了项目的根目录下,这样,它的Setting中设置就会不一样,若是设置错误,就会找不 ...