当前位置: 首页 > news >正文

你好,HBase

Author:  Fang, Chen, Ma,Guolai

现代的互联网应用引发了对极大规模数据进行快速处理的需求,大数据带来的信息风暴正在变革我们的生活、工作甚至思维方式。如果你对“大数据”尚感陌生的话,那么建议可以先读一读维克托的《大数据时代》。

当然,作为一名地地道道的“程序猿”,不断革新的技术才是最令人身心颤动的。在大数据时代下,Hadoop获得的成功我想已无需赘述。但俗话说:“每个成功的男人背后,都有一个伟大的女人。”如果做个不太恰当的比喻,HBase应该就是那个背后的“女人”。那么HBase到底有何魅力?它和传统的关系型数据库又有何区别?

请允许作为初级观察员的我抛砖引玉,为你们叩开通往HBase的大门,嗅一嗅属于它的独特芬芳。

HBase是什么?

HBase是一种数据库,Hadoop数据库。它依托于Hadoop的HDFS作为最基本存储基础单元,通过使用Hadoop的DFS工具就可以看到这些这些数据存储文件夹的结构,还可以通过Map/Reduce框架对HBase进行操作,其结构如下图所示:

HBase不同于你可能已经习惯的关系型数据库,它不用SQL语言,也不强调数据之间的关系。它是一个适合于非结构化数据存储的数据库,所谓非结构化数据存储就是说HBase是基于列的而不是基于行的模式,这样方便读写你的大数据内容。

HBase不允许跨行的事务,你可以在一行的某一列存储一个整数而在另一行的同一列存储字符串。故而,用户可以给行定义各种不同的列,对于这样的功能在大项目中非常实用,可以简化设计和升级的成本。

基于列存储的另一个巨大优势,就是表是疏松存储的,这样一种模式可以保证最大程度节省存储的空间。

总结一下的话,HBase就是一个开源的分布式的非关系型的,起源于Google “Big Table”的数据库。

HBase使用场景

有时候了解软件产品的最好方法是看看它是怎么用的,它可以解决什么问题和这些解决方案如何适用于大型应用架构,这些能够告诉你很多。

HBase在国内外互联网公司中的成功案例数不胜数,淘宝指数,Facebook短信系统以及eBay的Nous都可谓是HBase的极大受益者。

一般来说,HBase适用于以下场景:

  1. 大数据量 (100TB级数据)且有快速随机访问的需求。传统的关系型数据库无法承受的高速插入,大量读取。
  2. eBay的交易历史记录。数据量的巨大无容置疑,面向普通用户的请求必然要即时响应。
  3. 容量的优雅扩展。

大数据的驱使,动态扩展系统容量的必须的。例如:webpage DB。

  1. 业务场景简单,不需要关系数据库中很多特性(例如join,多级索引,表关系复杂的数据模型等)。

一言以蔽之,当你想要随机地实时地读写海量数据,那么HBase是一个不错的选择。

HBase基础知识

数据模型

Table(表)

HBase用表来组织数据。表名是String(字符串),由可以在文件系统路径里使用的字符组成。

Row(行)

在表里,数据按照行存储。行有唯一的标示符,叫做rowkey(行键)。其他部分用来存储HBase表里的数据,但rowkey是第一重要的。就像关系型数据库的主键,HBase表中每行的rowkey都是不同的。每次table的访问都是从rowkey开始,所以对于一张表而言,rowkey的设计是会直接影响到HBase的访问效率。

Column Family(列族)

HBase中的列组成列族。由于column family会影响到HBase数据的物理存放,因此它们必须事先定义并不轻易修改。

Column Qualifier(列限定符)

column family里的数据通过column qualifier或column来定位,但是column qualifier不必事先定义。

Version(时间版本)

每次你在cell上执行操作,HBase都实时地存储一个新时间版本。cell的新建、修改和删除都会同样处理,它们都会留下新时间版本。HBase默认值存储3个version。

Cell(单元)

由rowkey,column family,column qualifier以及version组成的四维坐标可以确定唯一的一个单元。存储在单元里的数据称为value(单元值)。

实例学习

马克思列宁主义告诉我们,“实践是检验真理的唯一标准”。那么,接下来就让我们通过一个实际case来验证HBase的神奇之处。

首先,来看一个有关twitter的逻辑模型。

Logical model for Twitter

 

Info

Activity

Rowkey

name

age

password

follow1

follow2

cfang@gmail.com

Fortune

 

111111/222222

Forest

 

guoma@gmail.com

Mike

23

333333

 

 

 

这是一张存储了twitter相关信息的table,让我们来看看HBase是怎么来帮助我们管理这些信息的。

table里一共有两条数据,rowkey分别是fortune和mike的邮箱地址(这里把email作为唯一标示符);column family是Info和Activity。其中,Info有三个column qualifier——email,age和password;Info有两个column qualifier——follow1和follow2。

显而易见,这是一张稀疏的table。对于Fortune而言,age信息是缺失的;而对于Mike,他没有follow任何人。

同时,我们还可以看到version信息。对于fortune而言,他修改过一次密码,最新的是“111111”,而上一次是“222222”。默认情况下会返回给用户最新的那条version信息。

接着,让我们看下这张table的物理存储。

Physical model for Twitter

key

value

cfang@gmail.com+info+name+version

Fortune

cfang@gmail.com+info+password+version1

222222

cfang@gmail.com+info+password+version2

111111

cfang@gmail.com+activity+follow1

Forest

guoma@gmail.com+info+name

Mike

guoma@gmail.com+info+age

23

guoma@gmail.com+info+password

333333

物理模型中,所有的数据都是以key/value形式存储。key是由rowkey,column family,column qualifier以及version这4个元素组合形成的,而value是对应cell里的值。

可以看到,rowkey被重复存储了多次。记得之前有“过来人”告诉我,“把rowkey设计的短一些,可以节省不少存储空间”。这个说法看来是挺靠谱的。

数据访问

HBase中最常用的数据访问方式有三种:Put,Get和Scan。

1.Put

为了往表里存储数据,你只需要创建Put实例。一个Put实例可以向HBase插入一条数据。比如要为table添加一条新纪录可以这样实现:

这样就往表里添加了一条email为“lisu@gmail.com”,name为“Forest”,age为“35”,password为“777777”的记录。

2.Get

从HBase读取数据和写入数据一样简单。创建Get实例,然后告诉它你感兴趣的单元。一个Get可以从HBase读取一条数据。比如你想知道Mike的密码,可以这样实现:

3.Scan

使用 Scan (扫描)命令可以读出表的某些部分,然后再使用 filter (过滤器)来得到有关记录。由于HBase中的数据存储是按照rowkey排序的,所以可想而知,scan返回的记录也是排好序的。如果想获得rowkey是以字母c开头的用户信息可以这样实现:

小窍门

如果你正准备涉足HBase,那么作为“过来人”的我还需要给你一些小建议。

  1. 最重要的事情就是设计rowkey,完美的rowkey设计往往能带来完美的性能体验。
  2. dimension的组合放入rowkey就是一种很不错的选择。因为如此的话,一旦dimension被确定,那么即使在海量数据中,定位到所需的metrics也只是弹指间的功夫。
  3. 数据在存储的时候是按照rowkey的ASCII码排序的,小心且善加利用你会有意想不到的收获。当然,使用不当也会导致“两败俱伤”。
  4. 为了达到最佳的性能,在设计HBase的时候应当更多地考虑“如何使用数据”而不是“数据本身”。试着把查询请求转换为查询rowkey的请求你会离成功更进一步。
  5. 设计列和列族时,名字越短越好,因为这样可以节省不少存储空间。
  6. 如果不想scan整张表,记得加上start rowkey和stop rowkey。不然scan的时间足够你享用一份精致的下午茶了。
  7. 如果insert的速度已经成为瓶颈,那么最好不要把时间作为rowkey的head部分。这样会导致每次新插入的数据(按照ASCII码)排序最大,最终都集中在一个hot region上,大大降低了HBase访问的并行度。
  8. 如果已经明确知道要访问数据的rowkey,那就是用Get来获取数据吧,这样可以确保返回的数据集是最少的。

如果你是一个对技术充满激情的人,那么,看完这篇文章后,一定会有种热血沸腾的感觉的。那还犹豫什么呢?去搭建一个属于自己的HBase,玩转大数据只是小菜一碟:)

 

* 本文版权和/或知识产权归eBay Inc所有。如需引述,请和联系我们DL-eBay-CCOE-Tech@ebay.com。本文旨在进行学术探讨交流,如您认为某些信息侵犯您的合法权益,请联系我们DL-eBay-CCOE-Tech@ebay.com,并在通知中列明国家法律法规要求的必要信息,我们在收到您的通知后将根据国家法律法规尽快采取措施。

相关文章:

  • Maven Build Tracking
  • 分布式文件系统概述
  • 调试Oracle 之一 基础篇
  • 基于Apache Mesos 构建高可靠,高可用的Jenkins CI
  • Kepler性能分析之M2E调优
  • Ebay开源 Pulsar:实时大数据分析平台
  • JS组件化验证检测
  • 基于云技术的集成测试代码覆盖率收集的一站式解决方案
  • 使用github pages + issues + api建立个人博客
  • MapReduce的详细过程
  • 基于Jmeter和Jenkins的自动化性能测试的一站式解决方案
  • jQuery动态载入JS文件研究
  • SolrCloud之分布式索引及与Zookeeper的集成
  • Kafka的分布式架构设计与High Availability机制
  • JS方法代理
  • CSS3 变换
  • ES学习笔记(12)--Symbol
  • Java教程_软件开发基础
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • PHP 7 修改了什么呢 -- 2
  • Wamp集成环境 添加PHP的新版本
  • yii2权限控制rbac之rule详细讲解
  • Zepto.js源码学习之二
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 构建工具 - 收藏集 - 掘金
  • 力扣(LeetCode)21
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 微信小程序:实现悬浮返回和分享按钮
  • 新书推荐|Windows黑客编程技术详解
  • 中文输入法与React文本输入框的问题与解决方案
  • 追踪解析 FutureTask 源码
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • # .NET Framework中使用命名管道进行进程间通信
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (09)Hive——CTE 公共表达式
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (一)UDP基本编程步骤
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (已解决)什么是vue导航守卫
  • (转)ObjectiveC 深浅拷贝学习
  • (转)大型网站架构演变和知识体系
  • (转)可以带来幸福的一本书
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET 4.0中的泛型协变和反变
  • .net Application的目录
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net mvc 获取url中controller和action
  • .NET 材料检测系统崩溃分析
  • .NET 使用配置文件
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .Net(C#)自定义WinForm控件之小结篇
  • .net反混淆脱壳工具de4dot的使用