Hbase 基于HDFS分布式列存储Nosql数据库(四) 概念及原理介绍

LSM-tree模型

  • 概念: Log-Struct-Merge 模型树,即wal,flush,compaction,split等过程;

  • 功能: 将随机无序的数据变成有序的数据,通过有序的算法来加快数据的读取,因为写入时需要进行排序,所有牺牲了一定的写入数据的效率,都用内存来实现数据的读写的存储

  • 主要步骤:

    1. 请求时现将数据保存到预写日志,然后写入内存
    2. 在内存中对数据进行排序
    3. 将内存中的数据写入文件,构成一个有序数据文件
    4. 合并: 将有序的多个数据文件进行合并生成一个新的有序的文件
    5. 删除和更新: 在模型设计中,本身并没有删除和更新,通过插入来模拟的,一般都是在文件合并时来进行实际的物理删除操作

WAL

  • 概念: 预写日志, write-ahead-log
  • 职责: 当产生写的请求后,写请求提交给regionserver,regionserver会将这个写的操作记录在WAL中,即Hlog,然后再写入memstore
  • 存储: 将WAL存储在hdfs上,每台regionserver维护一份WAL,
  • 场景: 用于数据恢复,hfile由hdfs恢复,memstore由WAL恢复
  • 补充:
    oldwals: 不再被需要的Hlog日志文件

Flush

  • 概念: 刷写
  • 功能: 数据在memstore中先做一次按rowkey的字典顺序排序,然后将memstore中的数据写入持久化到hdfs上,会生成一个有序的storefile文件
  • 场景: 由于memstore是使用的内存,内存容量有限,为了提高新数据的命中率,需要将老的数据吸入hdfs进行安全存储

Compaction

  • 概念: 合并
  • 功能: 将hdfs上的多个storefile文件进行合并,构建统一的有序文件
  • 场景: 为提供文件的快速读取,将多个storefile文件合并成一个整体有序的storefile文件,因为读取多个数据源没有读取一个数据源快
  • 过程:
    minor compaction: 将hdfs上早些生成的一些文件进行合并
    major compaction: 将所有的文件进行合并,合并的过程中会将标记为删除或过期的数据真正的删除

Split

  • 概念: 分裂
  • 功能: 若一个region分区的数据过多,会分裂成两个region
  • 场景: 一个分区的数据过多时,就会容易造成服务端引起的热点问题,无法实现分布式高性能,此时由regionserver将这一个分区均分为两个分区,由master重新将两个分区分配到不同的regionserver中,分配成功后旧的region下线

数据加载

  • 概念: 将数据导入到hbase中,有两种实现方式。

    • “使用put对象”

      • 例如: hbase shell,java api,mr程序封装
      • 缺点: 数据流经过WAL,然后经过内存,最后再到hdfs上,当导入海量数据是,容易导致region和hdfs的io过高,增加服务端负载,影响其他应用
    • “Bulkload”

      • 原理: hbase底层存储是hdfs上的hfile文件,然后通过meta表关联数据,所以可以先本地将数据转换为hfile文件,然后上传到hdfs上去,同时补充上meta表数据
      • 场景: 适用于导入大量数据的批量hbase场景,要求稳定性能
      • 缺点:
        1. 数据第一次读取时都是在hdfs上的,没有存在memstore中,所以第一次会变慢,但是如果数据量特别大的时候,两种方式最终的数据第一次读取都是在hdfs上的,所以没差别
        2. 数据直接从传到hdfs上的,没经过WAL,所以当出现数据丢失,没办法恢复数据,需要重新再转换一次
  • 实现:
    应用程序实现:
    1. 负责将普通文件转换成为hfile文件
    2. 负责将转换好的hfile文件加载到hbase表中
    hbase自带实现:
    1.ImportTSV,是hbase-server.jar包中自带的一个命令,可以实现使用put方式将数据导入hbase表中,也实现了将普通文件转换成一个hfile文件的两种方式
    2.completebulkload,上面的importtsv命令将普通文件转换成一个hfile文件,但是并没有加载到hbase表中,completebulkload负责将hfile文件加载到hbase表中

<命令>:
     1. yarn jar /export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-server-1.2.0-cdh5.14.0.jar 
        importtsv  -Dimporttsv.columns=a,b,c <tablename> <inputdir> -Dimporttsv.separator=',' 
         -Dimporttsv.bulk.output=/bulkload/output2
     2. yarn jar export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-server-1.2.0-cdh5.14.0.jar 
          completebulkload /bulkload/output2  mrhbase
    
<解释>:
    -Dimporttsv.columns 指定文件中列映射的列簇及列         
        Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:age,info:sex mrhbase /bulkload/input
    -Dimporttsv.separator 指定读取文件中的列分隔符,默认以制表符分隔
    -Dimporttsv.bulk.output 指定生成的HFILE文件所在的hdfs的位置

SQL on Hbase

  • 背景:
    hbase是nosql数据库,有自己的api实现,不支持sql语言,不利于开发和数据分析人员,sql on hbase 解决了这一场景,在hbase上使用sql/jdbc操作

  • 原理:

    1. 基于java api/mapreduce 实现
    2. 基于hbase shell 实现
    3. 搭桥 通过hdfs 实现
  • 实现:

    1. hive集成hbase:
      原理: 通过hive中的hql语句,底层转换为mapreduce操作,在mapreduce操作的同时,也用mapreduce操作hbase表
      实现: 在hive中创建一张与hbase关联的表,操作hive中关联表,实际上是对hbase在操作
    2. phoenix第三方工具:
      原理: 基于hbase构建了二级索引,直接调用hbase的api实现,因此在于hbase集成度和性能是最优选
    3. sqoop第三方工具:
      原理: 底层也是使用mapreduce程序导入数据,从关系型数据库中导入到hdfs,然后使用importtsv命令和completebulkload命令来完成从hdfs上的导入,sqoop可以导入,但是不能导出,因为半结构化数据支持结构化数据存储,结构化数据不支持半结构化数据存储
  • 补充:

    1. 若hbase表已经存在,hive中只能创建外部表,使用key来表示rowkey
    2. 若hbase表不存在,默认以hive表的第一列作为hbase的rowkey,
    3. hbase与hive关联,hive中的关联表加载数据时不能使用load加载,因为load命令底层没有使用mapreduce,因为load命令是使用hdfs的put命令,只能用insert命令

二级索引

  • 概念:基于rowkey再构建一个索引,称为二级索引
  • 意义:
    rowkey是唯一索引,而且rowkey是前缀匹配,若我们不知道前缀,但知道rowkey部分字段,只能全部扫描吗? 二级索引就是解决了rowkey唯一索引这个问题
  • 解决: 构建二级索引
  • 方式:
    1. 创建索引表,将原表中的查询条件作为索引表的rowkey,将原表中的rowkey作为索引表中的value;
      查询是若不指定原表的前缀,就先根据查询条件去查询索引表,找到原表的rowkey,再根据获得的rowkey去查原表

协处理器

  • 背景: 构建二级索引,因为索引表和原表是两张不同的表,如何保证两张表的数据同步?

  • 同步方式:

    1. 手动进行两次插入,在插入原表的同时,也插入索引表
      缺点: 性能较差,操作繁琐,请求数加倍,对服务器负载过高
    2. 构建协处理器,构建类似于mysql中的触发器
    3. 依靠第三方工具,让他们来实现二级索引
      例如: solr,ES 构建索引类型丰富,可以实现自动同步,Phoenix用sql构建索引
  • 概念: Coprocessor,协助开发者构建自定义的二级索引

  • 本质:自定义实现hbase提供对应接口的一段程序

  • 分类:

    1. observer: 观察者的协处理器,类似于监听功能,类似于触发器,一般用于二级索引同步
      功能: 监听原表,只看客户端往原表中插入一条数据,协处理器自动往索引表中插入一条数据
    2. endpoint: 终端者协处理器,类似于存储过程,或java中达到一个方法,一般用来做分布式聚合统计
      功能: 监听一张表,这张表的每个region都会计算自己的rowkey个数,当客户端调用时,就会返回每个region的个数
  • 补充: 如何快速统计一张表的rowkey个数

    1. 通过编写mapreduce方法,最慢的最蠢的方式
    2. 使用hbase自带的count命令
    3. 开发endpoint协处理,最快最有效的方式
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容