最近做项目接触到了HDFS、mapreduce以及Hbase,有了实战机会,今天打算将这些知识好好总结下,以备不时之需。首先从Hbase开始吧。

  Hbase是建立在HDFS上的分布式数据库,下图是Hbase表的模型:

Hbase这个数据库其实和传统关系数据库还是有很多类似之处,而不是像mongodb,memcached以及redis完全脱离了表的概念,只不过hbase是以列为中心的数据库,而传统关系数据库则是以行为中心的数据库。不过hbase这个列并非我们传统意义的列,而是列族。列族是hbase最小的存储单位,换句话说hbase底层数据都是以列族来进行组织的。

学习hbase我最大的收获我个人觉得是对数据库的一种新的认识,数据库作用还是快速的检索出我们想要数据,也就是数据库的主要作用还是为了实时查询,如果一个存储数据的系统检索数据的速度很慢,那么这个系统应该称之为数据仓库,hbase是一种数据库,是一种用来弥补传统关系数据库在海量数据中快速检索数据的能力不足。不过受制于持久存储系统的检索数据的速度以及海量数据存储是分散到各个服务器上,因此解决海量数据实时检索的方式只有根据实际的业务场景重新组织数据存储的模型,并且加上合理的索引来解决的。那么hbase是如何解决这个问题的呢?

Hbase首先打破关系数据库里的避免数据冗余的机制,将经常需要一起查询的记录聚集在一起存储,例如商户的订单信息,这里我们用order代表订单信息,orderId为订单号,spId为商品订单号,spNm为商品名字,num为数量其他字段就略去,在hbase里我们可以把order定义为一个列族,orderId这些字段就是列的名字,在底层存储系统里我们将order这个列族下所有的列数据聚集在一起存储,那么当我们查询订单信息就可以直接找到这些聚集在一起的存储订单信息,那么就可以快速查询出订单信息。这一点相比关系数据库,关系数据库很难将一些经常查询出来的信息聚集在一起存储,这也就是hbase对于关系数据库的一大优势。这也就是为什么hbase是围绕列族的数据库,因为列族就是将一些经常会被一起查询出来的数据的逻辑抽象,所以底层物理存储机制都是围绕列族进行,这也就是hbase里的hfile了,hfile是hbase物理存储的最小单位,而hfile都是按照列族聚集在一起的。

前面我说道想要在海量数据下做到实时查询数据,一个要解决的问题就是如何将经常查询的数据聚集在一起存储,另一个就是建立索引了,下面我就要讲讲hbase的索引是如何设计。Hbase的索引是靠rowkey完成,也就是行主键,还是以商户订单为例,我们通过设计列族将这些数据聚集在一起存储,但是实际查询里我们经常会根据不同商户,或者不同商品查询订单信息,那么我们就得要有手段能快速从聚集的订单信息里查询出所需要查询的订单信息,那么这时候就靠rowkey的作用了,在hbase物理存储里最小存储单位是hfile,hfile之上则是region,每个region里聚集很多hfile(当然实际hbase底层存储比这个复杂,还有memstore,这是根据LSM存储原理设计,不过本文就以hfile代表整个列族存储),而region则是根据rowkey来进行构建和拆分的,换个说法就是region的名字或者代号就是rowkey,现在我们回到订单的例子,我们可以在rowkey的设计时候加入商户号,当用户查询时候可以根据商户号快速定位到region,然后再在region里进一步查找具体的列族信息,这样就完成了一个快速检索数据的目的。

最近学习hbase一直有个问题困惑我,那就是为何hbase的rowkey要按照字典顺序设计,而不是按顺序设计,这个疑惑的源头是很多hbase资料里说hbase是一个有利于顺序查询的数据库,那么rowkey设计为顺序格式不是更好吗?

对于这个问题我其实还没完全理解清楚,不过字典顺序也是一种顺序,在字典顺序之上还是可以很好设计出按照数字顺序的rowkey,不过hbase的rowkey是有别于关系数据库的主键,关系数据库下,一个行的主键只能查询出一条数据,而hbase一个rowkey能查询出许多数据,因此对于实时查询而言rowkey的数字顺序相比关系数据库的行意义小的多。这两个原因有点不痛不痒了,下面原因是个很重要的原因了,hbase里的region是hbase对客户端提供相关操作的单位,而rowkey是按照数字顺序排序,那么region则会根据顺序进行拆分,如果这个rowkey包含了时间因素,那么当大量客户端只做最近时间查询,就会导致时间最近那个region负载压力很大,为了达到负载均衡能力,我们最好将客户端的查询分布在各个不同的region上,那么我们最好让不同的region存储的数据应对查询是分布均衡的,而这个就是要靠rowkey设计实现的。不管怎么说hbase的使用里hbase的作用很关键。

时间匆忙今天写道这里,希望自己研究完后能好好系统写几篇关系hbase的文章了。

Hbase学习笔记01的更多相关文章

  1. 软件测试之loadrunner学习笔记-01事务

    loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...

  2. HBase学习笔记之HBase的安装和配置

    HBase学习笔记之HBase的安装和配置 我是为了调研和验证hbase的bulkload功能,才安装hbase,学习hbase的.为了快速的验证bulkload功能,我安装了一个节点的hadoop集 ...

  3. HBASE学习笔记(四)

    这两天把要前几天的知识点回顾一下,接下来我会用自己对知识点的理解来写一些东西 一.知识点回顾 1.hbase集群启动:$>start-hbase.sh ===>hbase-daemon.s ...

  4. C++ GUI Qt4学习笔记01

    C++ GUI Qt4学习笔记01   qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...

  5. SaToken学习笔记-01

    SaToken学习笔记-01 SaToken版本为1.18 如果有排版方面的错误,请查看:传送门 springboot集成 根据官网步骤maven导入依赖 <dependency> < ...

  6. Redis:学习笔记-01

    Redis:学习笔记-01 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 1. Redis入门 2.1 ...

  7. PHP 学习笔记 01

    例子: 为什么要学PHP 主观原因: 前段时间在学校处理了毕业的一些事情,回到上海后开始了找工作的旅程.意向工作是WPF开发或者ASP.NET 作为后端的WEB开发. 陆陆续续一直在面试,其中有一家公 ...

  8. vue.js 2.0 官方文档学习笔记 —— 01. vue 介绍

    这是我的vue.js 2.0的学习笔记,采取了将官方文档中的代码集中到一个文件的形式.目的是保存下来,方便自己查阅. !官方文档:https://cn.vuejs.org/v2/guide/ 01. ...

  9. xml基础学习笔记01

    注意:刚刚看了网上对于XML中的标签,节点和元素?到底应该怎么表述?起初我也有这个疑惑,现在我的想法是:下面出现node的应称作节点,节点对象.element应称作元素,毕竟这更符合英文的本意.至于标 ...

随机推荐

  1. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  2. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  3. Hbase的伪分布式安装

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

  4. 使用C/C++写Python模块

    最近看开源项目时学习了一下用C/C++写python模块,顺便把学习进行一下总结,废话少说直接开始: 环境:windows.python2.78.VS2010或MingW 1 创建VC工程 (1) 打 ...

  5. gulp初学

    原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js  配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...

  6. JAVA FreeMarker工具类

    FreeMarkerUtil.java package pers.kangxu.datautils.utils; import java.io.File; import java.io.StringW ...

  7. css知多少之绝对定位小记

    一.position定位常见属性 对于属性position来说,属性值有static/relative/absolute/fixed/inherit以下只对绝对定位position:absolute详 ...

  8. ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写

    主要更新: 1:增加AR.Global.GetUser() 方法返回当前登陆者的用户信息. 2:重写AR.Combobox 支持下拉树. 3:调整及扩展Input下拉的配置参数. 4:优化及新增AR. ...

  9. 数据库设计中的Soft Delete模式

    最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...

  10. ABP源码分析六:依赖注入的实现

    ABP的依赖注入的实现有一个本质两个途径:1.本质上是依赖于Castle这个老牌依赖注入的框架.2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入 ...