大数据学习--之--HBASE理论基础

Apache HBase简介

Apache HBase(Hadoop DataBase)是一个高可靠行、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可以在廉价的PC上搭建起大规模结构化存储集群。

HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用Chubby作为协同服务,HBase利用Zookeeper作为对应。

HBase是一种"NoSQL"数据库,"NoSQL"是一个通用词表示数据库不是RDBMS,后者支持SQL作为主要访问手段。有许多种NoSQL数据库,比如:BerkeleyDB是本地NoSQL数据库例子,而HBase是大型分布式数据库。从技术上来说,HBase更像是"Data Store(数据存储)"多于"Data Base(数据库)",因为HBase缺少很多RDBMS的特性,如列类型、第二索引、触发器、高级查询语言等。

然而HBase有许多特征同时支持多元化和模块化扩充。HBase集群通过增加RegionServer进行扩展,而且只需要将它可以放到普通的服务器中即可。例如:如果集群从10扩充到20个RegionServer,存储空间和处理容量都同时翻倍。RDBMS也能进行扩充,但是仅针对某个点---特别是对一个单独数据库服务器的带下---同时,为了更好的性能,需要依赖特殊的硬件和存储设备,而HBase并不需要这些。

HBase有如下特性:

---强一致性读写:HBase不是"eventually consistent(最终一致性)"数据存储,这让它很适合高速计数聚合类任务;

---自动分片(Automatic sharding):HBase表通过Region分布在集群中,数据增长时,Region会自动分配并重新分布;

---RegionServer自动故障移除;

---Hadoop/HDFS集成:HBase支持开箱即用地支持HDFS作为他的分布式文件系统;

---MapReduce:HBase通过MapReduce支持大并发处理;

---Java客户端API:HBase支持易于使用的JavaAPI进行编程访问;

---Thrift/REST API:HBase支持Thirft和REST作为非Java前端的访问;

---Block Cache和BloomFilter:对于大容量查询优化,HBase支持Block Cache和 Bloom Filter;

---运维管理:HBase支持JMX通过内置网页用于运维。

HBase的应用场景

首先,HBase不适合所有的场景。

1.确保有足够多的数据,如果有上亿或者上千亿行数据,HBase是很好的备选。如果只有上千行或者上百万行,则用传统的RDBMS可能是更好的选择。因为所有数据可以在一两个节点保存,集群其他节点可能闲置。

2.确定可以不依赖左右RDBMS的额外特性(如:列数据类型、第二索引、事务、高级查询语言等)。

3.确定有足够的硬件,因为HDFS在小于5个数据节点时,基本上体现不出它的优势。

注:HBase能在单独的笔记本上运行良好,到那时这应仅当成开发阶段的配置。

HBase的数据模型比较简单,数据按照rowkey排序存放,适合HBase存储的数据总结如下:

===以实体为中心的数据

===以事件为中心的数据

这些数据有的是结构化数据,有的是半结构或非结构化数据。HBase的“稀疏矩阵”设计,使其对应非结构化数据存储时能够得心应手,但在外面的实际应用场景中,结构化数据存储已然占据了比较重的比例。由于HBase仅提供了基于rowkey的单维度索引能力,在应对一些具体场景时,已然还需要基于哈色之上构建一些专业的能力。

HBase的优缺点

优点:

---列可以动态增加,并且列为空就不存储数据,节省存储空间

---自动切分数据,使得数据存储自动具有水平扩展

---可以提供高并发读写操作

---与Hadoop MapReduce相结合有利于数据分析

---容错性好

---非常灵活的模式设计(没有固定模式的限制)

---可以跟Hive集成,使用累SQL查询

---自动故障转移

---客户端接口易于适应

---行级别原子性,即:PUT操作一定是完全成功或者完全失败

---版权免费

缺点:

---不能支持条件查询,只支持按照rowkey来查询

---容易产生单点故障(在只是用一个HMaster的时候)

---不支持事务

---JOIN不是数据库层支持的,而需要用MapReduce

---稚嫩在主键上索引和排序

---没有内置的身份和权限认证

HBase与Hadoop/HDFS的差异

HDFS是分布式文件系统,适合保存大文件,官方宣称它并非普通用途的文件系统,不提供文件的个别记录和快速查询。另一方面,HBase基于HDFS,并能够提供大表的记录快速查找和更新。这有时可能会引起概念混乱:HBase内部将数据放到索引好的"StoreFiles"存储文件中,以便提供高速查询,而存储文件位于HDFS中。

问1:HBase中的数据为何不直接存在HDFS上?

===HBase中存储的海量数据记录,通常在几百bytes到kb级别,如果将这些数据直接存储到HDFS上,会导致大量的小文件产生,为HDFS的元数据管理节点(NameNode)带来沉重的压力。

问2:文件能否直接存储于HBase里面?

===如果是几Mb的文件,其实也可以直接存储于HBase中,我们暂且将这类文件称之为小文件,HBase提供了一个名为MOB的特性来应对这类小文件的存储。如果是更大的文件,强烈不建议用HBase来存储。

HBase的基本概念

关于Apache HBase官方定义是:Apache HBase is the Hadoop database, a distributed, scalable, big data store.

即:HBase是基于Hadoop构建的一个分布式的、可伸缩的、海量数据存储系统。

在HBase的数据被存储在表中,具有行和列。这和关系型数据库(RDBMS)中的术语重叠,但是在概念上它们不是一类。相反,应该将HBase的表党委是一个多维的map结构,来方便理解。

1.术语

---Table(表):HBase table由多个row组成

---Row(行):每一row代表着一个数据对象,每一row都是以一个rowkey和一个或多个column组成。rowkey是每个数据对象的唯一标识,按字母顺序排列,即row也是按照这个顺序来进行存储的。所以rowkey的设计相当重要。一个重要的原则是:相关的row要存储在接近的位置。

---Column(列):column由column family和column qualifier组成,由冒号进行间隔。如:family:qualifier。

---Column Family(列族):在HBase,column family是一些column的集合。一个column family所有的column成员是有着相同的前缀的。比如,courses:history和courses:math都是courses的成员。冒号(:)是column family的分隔符,用来区分前缀和列名。column前缀必须是可打印的字符,剩下的部分列名可以是任意字节数组,column family必须在table建立时声明。column随时可以新建。在物理上,一个的column family成员在文件系统上都是存储在一起的。因为存储优化都是针对column family级别的,这就意味着,一个column family的所有成员都是用相同的方式访问的。

---Column Qualifier(列限定符):column family中的数据通过column qualifier来进行映射。column qualifier也没有特定的数据类型,以二进制字节来存储。虽然column family是在table创建时就固定了,但column qualifier是可变的,可能在不同的row之间有很大的不同。

---Cell(单元格):cell是row、column family和column qualifier的组合,包含了一个值和一个timestamp,用于标识值得版本。

---TimeStamp(时间戳):每个值都会有一个timestamp,作为该值特定版本的标识。默认情况下,timestamp代表了数据被写入RegionServer的时间,但你也可以在把数据放到cell时,指定不同的timestamp。

2.map

HBase/BigTable的核心数据结构是map,不同的编程语言针对 map 有不同的术语,比如 associative array(PHP)、associative array(Python),Hash(Ruby)或 Object (JavaScript)。

简单来说,map 就是 key-value 对集合。下面是一个用 JSON 格式来表达 map 的例子:

{
"zzzzz" : "woot",
"xyz" : "hello",
"aaaab" : "world",
"1" : "x",
"aaaaa" : "y"
}

3.分布式

HBase/Bigtable 都是建立在分布式系统上的,HBase 基于 Hadoop Distributed File System (HDFS) 或者 Amazon’s Simple Storage Service(S3),而 Bigtable 使用 Google File System(GFS)。它们要解决的一个问题就是数据的同步。这里不讨论如何做到数据同步。 HBase/Bigtable 可以部署在成千上万的机器上来分散访问压力。

4.排序

和一般的 map 实现有所区别,HBase/Bigtable 中的 map 是按字母顺序严格排序的。这就是说,对于 row key 是“aaaaa”的旁边 row key 应该是 “aaaab”,而与 row key 是“zzzzz”离得较远。

还是以上面的 JSON 为例,一个排好序的例子如下:

{
"1" : "x",
"aaaaa" : "y",
"aaaab" : "world",
"xyz" : "hello",
"zzzzz" : "woot"
}

在一个大数据量的系统里面,排序很重要,特别是 row key 的设置策略决定了查询的性能。比如网站的域名,row key 就是域名,在设计时要将域名反转(例如,org.apache.www、org.apache.mail、org.apache.jira)。

5.多维

多维 map,即 map 里面嵌套 map。例如:

 1 {
 2   "1" : {
 3     "A" : "x",
 4     "B" : "z"
 5   },
 6   "aaaaa" : {
 7     "A" : "y",
 8     "B" : "w"
 9   },
10   "aaaab" : {
11     "A" : "world",
12     "B" : "ocean"
13   },
14   "xyz" : {
15     "A" : "hello",
16     "B" : "there"
17   },
18   "zzzzz" : {
19     "A" : "woot",
20     "B" : "1337"
21   }
22 }

6.时间版本

在查询中不指定时间,返回的将是最近的一个时间的版本。如果给出 timestamp,返回的将是早于这个时间的数值。例如: 查询 row/column 是“aaaaa”/“A:foo”的,将返回 y;查询 row/column/timestamp 是“aaaaa”/“A:foo”/10的,将返回 m;查询 row/column/timestamp 是“aaaaa”/“A:foo”/2的,将返回 null。

 1 {
 2   // ...
 3   "aaaaa" : {
 4     "A" : {
 5       "foo" : {
 6         15 : "y",
 7         4 : "m"
 8       },
 9       "bar" : {
10         15 : "d",
11       }
12     },
13     "B" : {
14       "" : {
15         6 : "w"
16         3 : "o"
17         1 : "w"
18       }
19     }
20   },
21 // ...
22 }

7.概念视图

下面表格是一个名为 webtable 的 table ,包含了两个 row(com.cnn.www 和 com.example.www)和三个 column family(contents、 anchor和people)。第一个 row(com.cnn.www)中,anchor 包含了两个 column(anchor:cssnsi.com和 anchor:my.look.ca),contents包含了一个 column(contents:html)。在这个例子里面,row key 是com.cnn.www的 row 包含了5个版本,而 row key 是com.example.www的 row 包含了1个版本。column qualifier 为 contents:html包含了给定网站的完整的 HTML。column family 是anchor的每个 qualifier 包含了网站的链接。人们列族代表与网站相关的人。column family 是people关联的是网站的人物资料。

Row Key Timestamp ColumnFamily contents ColumnFamily anchor ColumnFamily people
“com.cnn.www” t9   anchor:cnnsi.com = “CNN”  
“com.cnn.www” t8   anchor:my.look.ca = “CNN.com  
“com.cnn.www” t6 contents:html = “…”    
“com.cnn.www” t5 contents:html = “…”    
“com.cnn.www” t3 contents:html = “…”    

在这个表中显示为空的 cell 不占用空间,这使得 HBase 变得“稀疏”。除了表格方式来展现数据试图,也使用使用多维 map,如下:

 1 {
 2     "com.cnn.www": {
 3         contents: {
 4         t6: contents:html: "<html>..."
 5       t5: contents:html: "<html>..."
 6       t3: contents:html: "<html>..."
 7     }
 8     anchor: {
 9       t9: anchor:cnnsi.com = "CNN"
10       t8: anchor:my.look.ca = "CNN.com"
11     }
12     people: {}
13   }
14   "com.example.www": {
15     contents: {
16       t5: contents:html: "<html>..."
17     }
18     anchor: {}
19     people: {
20       t5: people:author: "John Doe"
21        }
22     }
23 }            

在这个表中显示为空的 cell 不占用空间,这使得 HBase 变得“稀疏”。除了表格方式来展现数据试图,也使用使用多维 map,如下:

 1 {
 2   "com.cnn.www": {
 3       contents: {
 4         t6: contents:html: "<html>..."
 5         t5: contents:html: "<html>..."
 6         t3: contents:html: "<html>..."
 7       }
 8       anchor: {
 9         t9: anchor:cnnsi.com = "CNN"
10         t8: anchor:my.look.ca = "CNN.com"
11       }
12       people: {}
13   }
14   "com.example.www": {
15       contents: {
16         t5: contents:html: "<html>..."
17       }
18       anchor: {}
19       people: {
20         t5: people:author: "John Doe"
21       }
22   }
23 }

8.物理视图

尽管在概念视图里,table 可以被看成是一个稀疏的 row 的集合。但在物理上,它的是按照 column family 存储的。新的 column qualifier (column_family:column_qualifier)可以随时添加进已有的 column family 。

下表是一个 ColumnFamily anchor

Row Key Timestamp Column Family anchor
“com.cnn.www” t9 anchor:cnnsi.com = “CNN”
“com.cnn.www” t8 anchor:my.look.ca = “CNN.com”

下表是一个 ColumnFamily contents

Row Key Timestamp ColumnFamily contents:
“com.cnn.www” t6 contents:html = “…”
“com.cnn.www” t5 contents:html = “…”
“com.cnn.www” t3 contents:html = “…”

值得注意的是在上面的概念视图中空白 cell 在物理上是不存储的,因为根本没有必要存储。因此若一个请求为要获取 t8 时间的contents:html,他的结果就是空。相似的,若请求为获取 t9 时间的anchor:my.look.ca,结果也是空。但是,如果不指明 timestamp,将会返回最新时间的 column。例如,如果请求为获取行键为“com.cnn.www”,没有指明 timestamp 的话,返回的结果是 t6 下的contents:html,t9下的anchor:cnnsi.com和 t8 下anchor:my.look.ca

9.数据模型操作

四个主要的数据模型操作是 Get、Put、Scan 和 Delete。通过 Table 实例进行操作。有关 Table 的 API 可以参见 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Table.html

Get

Get 返回特定 row 的属性。 Get 通过 Table.get 执行。有关 Get 的 API 可以参见 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Get.html

Put

Put 要么向 table 增加新 row(如果 key 是新的)或更新 row(如果 key 已经存在)。 Put 通过 Table.put(writeBuffer)或 Table.batch(非 writeBuffer)执行。有关 Put 的 API 可以参见 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Put.html

Scan

Scan 允许多个 row 特定属性迭代。

下面是一个在 Table 表实例上的 Scan 示例。假设 table 有几行 row key 为“row1”、“row2”、“row3”,还有一些 row key 值为“abc1”、 “abc2” 和“abc3”。下面的示例展示 Scan 实例如何返回“row”打头的 row。

public static final byte[] CF = "cf".getBytes();
public static final byte[] ATTR = "attr".getBytes();
...

Table table = ...      // instantiate a Table instance

Scan scan = new Scan();
scan.addColumn(CF, ATTR);
scan.setRowPrefixFilter(Bytes.toBytes("row"));
ResultScanner rs = table.getScanner(scan);
try {
  for (Result r = rs.next(); r != null; r = rs.next()) {
    // process result...
  }
} finally {
  rs.close();  // always close the ResultScanner!
}

注意,通常最简单的方法来指定用于 scan 停止点是采用 InclusiveStopFilter 类,其 API 可以参见 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/filter/InclusiveStopFilter.html

Delete

Delete 用于从 table 中删除 row。Delete 通过 Table.delete 执行。有关 Delete 的 API 可以参见 http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Delete.html

HBase 没有修改数据的合适方法。所以 delete 通过创建名为 tombstones 的新标志进行处理。这些 tombstones 和死去的值,会在 major compaction 时清除掉。

参考引用

原文地址:https://blog.csdn.net/kkkloveyou/article/details/52518325

***********************

心得之谈:欢迎指正,一起学习。

***********************

原文地址:https://www.cnblogs.com/donsenChen/p/9267449.html

时间: 2024-08-07 18:14:01

大数据学习--之--HBASE理论基础的相关文章

大数据学习之HBase

hbase http://hbase.apache.org/index.html 1.什么是hbase HBASE是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群. HBASE的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据. HBASE是Google Bigtable的开源实现,但是也有很多不同之处.比如:Google Bigtable利用GFS作为其文

大数据学习系列之五 ----- Hive整合HBase图文详解

引言 在上一篇 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机) 和之前的大数据学习系列之二 ----- HBase环境搭建(单机) 中成功搭建了Hive和HBase的环境,并进行了相应的测试.本文主要讲的是如何将Hive和HBase进行整合. Hive和HBase的通信意图 Hive与HBase整合的实现是利用两者本身对外的API接口互相通信来完成的,其具体工作交由Hive的lib目录中的hive-hbase-handler-*.jar工具类来实现,通信原理如下图

大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单机的搭建,是因为作为个人学习的话,单机已足以,好吧,说实话是自己的电脑不行,使用虚拟机实在太卡了... 整个的集群搭建是在公司的测试服务搭建的,在搭建的时候遇到各种各样的坑,当然也收获颇多.在成功搭建大数据集群之后,零零散散的做了写笔记,然后重新将这些笔记整理了下来.于是就有了本篇博文. 其实我在搭

大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集

引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单机的搭建,是因为作为个人学习的话,单机已足以,好吧,说实话是自己的电脑不行,使用虚拟机实在太卡了... 整个的集群搭建是在公司的测试服务搭建的,在搭建的时候遇到各种各样的坑,当然也收获颇多.在成功搭建大数据集群之后,零零散散的做了写笔记,然后重新将这些笔记整理了下来.于是就有了本篇博文. 其实我在搭

大数据学习系列之—HBASE

hadoop生态系统 zookeeper负责协调 hbase必须依赖zookeeper flume 日志工具 sqoop 负责 hdfs dbms 数据转换 数据到关系型数据库转换 大数据学习群119599574 hbase简介 hadoop database 是一个高可靠性.高性能.面向列.可伸缩.实时读写的分布式数据库 利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce 来处理Hbase中的海量数据,利用Zookeeper作为其分布式系统服务 主要用来存储非结

大数据学习一般都学什么

大数据已经成为发展的趋势,大数据的培训学习也就应运而生,可是大数据具体学习什么内容呢,众说纷纭: 那么大数据学习到底应该掌握哪些知识呢,笔者根据自己的经验总结如下: 学习要根据自身情况来定,如果你是零基础,那就必须先从基础java开始学起(大数据支持很多开发语言,但企业用的最多的还是JAVA),接下来学习数据结构.linux系统操作.关系型数据库,夯实基础之后,再进入大数据的学习,具体可以按照如下体系: 第一阶段 CORE JAVA (加**的需重点熟练掌握,其他掌握) Java基础** 数据类

大数据学习应该如何入门

一.整体了解数据分析--5小时 新人们被"大数据"."人工智能"."21世纪是数据分析师的时代"等等信息吸引过来,立志成为一名数据分析师,于是问题来了,数据分析到底是干什么的?数据分析都包含什么内容? 市面上有很多讲数据分析内容的书籍,在此我推荐<深入浅出数据分析>,此书对有基础人士可称消遣读物, 但对新人们还是有一定的作用.阅读时可不求甚解,重点了解数据分析的流程.应用场景.以及书中提到的若干数据分析工具,无需纠结分析模型的实现.5

大数据学习的流程方案

大数据成为了当下发展的一种趋势,很多人去追求大数据的学习,但是苦于无从下手,今天编者根据自己的经验系统总结一下大数据学习的方略: 第一步:感性认识,找准思路 (1)看一些大数据发展及应用,了解市场形势 (2)阅读大数据相关书籍,了解知识架构 对上面基本知识有一个了解过程之后,明确自己的思路,就可以进入下一步学习; 第二步:理论学习,扎实基础 大数据平台学习路径:   预备课程 1. 大数据平台Linux基础 2. 大数据平台Java基础 3. 大数据平台Python基础   基础课程 1.  大

大数据架构-使用HBase和Solr将存储与索引放在不同的机器上

摘要:HBase和Solr可以通过协处理器Coprocessor的方式向Solr发出请求,Solr对于接收到的数据可以做相关的同步:增.删.改索引的操作,这样就可以同时使用HBase存储量大和Solr检索性能高的优点了,更何况HBase和Solr都可以集群.这对海量数据存储.检索提供了一种方式,将存储与索引放在不同的机器上,是大数据架构的必须品. 关键词:HBase, Solr, Coprocessor, 大数据, 架构 正如我的之前的博客“Solr与HBase架构设计”http://http: