韶关钢琴调律师付 發表於 2018-3-29 11:34:00

HBase学习之路 (一)HBase基础介绍

<h2>产生背景</h2>
<p>自 1970 年以来,关系数据库用于数据存储和维护有关问题的解决方案。大数据的出现后, 好多公司实现处理大数据并从中受益,并开始选择像 Hadoop 的解决方案。Hadoop 使用分 布式文件系统,用于存储大数据,并使用 MapReduce 来处理。Hadoop 擅长于存储各种格式 的庞大的数据,任意的格式甚至非结构化的处理。</p>
<p>Hadoop 的限制</p>
<p>Hadoop 只能执行批量处理,并且只以顺序方式访问数据。这意味着必须搜索整个数据集, 即使是最简单的搜索工作。 当处理结果在另一个庞大的数据集,也是按顺序处理一个巨大的数据集。在这一点上,一个 新的解决方案,需要访问数据中的任何点(随机访问)单元。</p>
<p>Hadoop 随机存取数据库</p>
<p>应用程序,如 HBase,Cassandra,CouchDB,Dynamo 和 MongoDB 都是一些存储大量数据和 以随机方式访问数据的数据库。</p>
<p>总结:</p>
<p>(1)海量数据量存储成为瓶颈,单台机器无法负载大量数据</p>
<p>(2)单台机器 IO 读写请求成为海量数据存储时候高并发大规模请求的瓶颈</p>
<p>(3)随着数据规模越来越大,大量业务场景开始考虑数据存储横向水平扩展,使得存储服 务可以增加/删除,而目前的关系型数据库更专注于一台机器</p>
<h2>HBase简介</h2>
<p><strong><span style="color: rgba(255, 0, 0, 1)">HBase 是 BigTable 的开源(源码使用 Java 编写)版本。是 Apache Hadoop 的数据库,是建 立在 HDFS 之上,被设计用来提供高可靠性、高性能、列存储、可伸缩、多版本的 NoSQL 的分布式数据存储系统,实现对大型数据的实时、随机的读写访问。 </span></strong></p>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>HBase 依赖于 HDFS 做底层的数据存储,BigTable 依赖 Google GFS 做数据存储 </strong></span></p>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>HBase 依赖于 MapReduce 做数据计算,BigTable 依赖 Google MapReduce 做数据计算 </strong></span></p>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>HBase 依赖于 ZooKeeper 做服务协调,BigTable 依赖 Google Chubby 做服务协调</strong></span></p>
<p>NoSQL = NO SQL</p>
<p>NoSQL = Not Only SQL:会有一些把 NoSQL 数据的原生查询语句封装成 SQL,比如 HBase 就有 Phoenix 工具</p>
<h3>关系型数据库 和 非关系型数据库的典型代表</h3>
<p>NoSQL:hbase, redis, mongodb</p>
<p>RDBMS:mysql,oracle,sql server,db2</p>
<h3>HBase 这个 NoSQL <span style="color: rgba(255, 0, 0, 1)">数据库</span>的要点</h3>
<p>① 它介于 NoSQL 和 RDBMS 之间,<strong><span style="color: rgba(255, 0, 0, 1)">仅能通过主键(rowkey)和主键的 range 来检索数据 </span></strong></p>
<p>② HBase 查询数据功能很简单,<strong><span style="color: rgba(255, 0, 0, 1)">不支持 join 等复杂操作 </span></strong></p>
<p>③ 不支持复杂的事务,<strong><span style="color: rgba(255, 0, 0, 1)">只支持行级事务</span></strong>(可通过 hive 支持来实现多表 join 等复杂操作)。</p>
<p>④ <strong><span style="color: rgba(255, 0, 0, 1)">HBase 中支持的数据类型:byte[](底层所有数据的存储都是字节数组) </span></strong></p>
<p>⑤ <strong><span style="color: rgba(255, 0, 0, 1)">主要用来存储结构化和半结构化的松散数据。</span></strong></p>
<h3>结构化、半结构化和非结构化</h3>
<p><strong><span style="color: rgba(255, 0, 0, 1)">结构化</span></strong>:数据结构字段含义确定,清晰,典型的如数据库中的表结构</p>
<p><strong><span style="color: rgba(255, 0, 0, 1)">半结构化</span></strong>:具有一定结构,但语义不够确定,典型的如 HTML 网页,有些字段是确定的(title), 有些不确定(table)</p>
<p><strong><span style="color: rgba(255, 0, 0, 1)">非结构化</span></strong>:杂乱无章的数据,很难按照一个概念去进行抽取,无规律性</p>
<p>与 Hadoop 一样,HBase 目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加 计算和存储能力。</p>
<h3>HBase 中的<span style="color: rgba(255, 0, 0, 1)">表</span>特点</h3>
<p>1、<strong><span style="color: rgba(255, 0, 0, 1)">大</span></strong>:一个表可以有上十亿行,上百万列</p>
<p>2、<strong><span style="color: rgba(255, 0, 0, 1)">面向列</span></strong>:面向列(族)的存储和权限控制,列(簇)独立检索。</p>
<p>3、<strong><span style="color: rgba(255, 0, 0, 1)">稀疏</span></strong>:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。</p>
<p>4、<strong><span style="color: rgba(255, 0, 0, 1)">无模式</span></strong>:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一 张表中不同的行可以有截然不同的列</p>
<p><img src="https://images2018.cnblogs.com/blog/1228818/201803/1228818-20180328184005972-1939218640.png" alt=""></p>
<p>&nbsp;</p>
<h2>&nbsp;HBase表结构逻辑视图</h2>
<p>初次接触HBase,可能看到以下描述会懵:<strong><span style="color: rgba(255, 0, 0, 1)">“基于列存储”,“稀疏MAP”,“RowKey”,“ColumnFamily”。</span></strong></p>
<p>其实没那么高深,我们需要分两步来理解HBase, 就能够理解为什么HBase能够“快速地”“分布式地”处理“大量数据”了。</p>
<p>  <strong><span style="color: rgba(255, 0, 0, 1)">1.内存结构</span></strong></p>
<p><strong><span style="color: rgba(255, 0, 0, 1)">  2.文件存储结构</span></strong></p>
<h3>&nbsp;<strong>名词概念</strong></h3>
<p>加入我们有如下一张表</p>
<p><img src="https://images2018.cnblogs.com/blog/1228818/201803/1228818-20180328185514080-1540820263.png" alt=""></p>
<h4>Rowkey的概念</h4>
<div>
<p><strong><span style="color: rgba(255, 0, 0, 1)">Rowkey的概念和mysql中的主键是完全一样的,Hbase使用Rowkey来唯一的区分某一行的数据。</span></strong></p>
<p>由于Hbase只支持3中查询方式:</p>
<p>1、基于Rowkey的单行查询</p>
<p>2、基于Rowkey的范围扫描</p>
<p>3、全表扫描</p>
<p>因此,Rowkey对Hbase的性能影响非常大,Rowkey的设计就显得尤为的重要。设计的时候要兼顾基于Rowkey的单行查询也要键入Rowkey的范围扫描。具体Rowkey要如何设计后续会整理相关的文章做进一步的描述。这里大家只要有一个概念就是Rowkey的设计极为重要。</p>
<p>rowkey 行键可以是任意字符串(最大长度是 <strong><span style="color: rgba(255, 0, 0, 1)">64KB</span></strong>,实际应用中长度一般为 10-100bytes),最好是 16。在 HBase 内部,rowkey 保存为字节数组。<strong><span style="color: rgba(255, 0, 0, 1)">HBase 会对表中的数据按照 rowkey 排序 (字典顺序)</span></strong></p>
<h4><strong>Column的概念</strong></h4>
<p>列,可理解成MySQL列。</p>
<h4>ColumnFamily的概念</h4>
<p>列族, HBase引入的概念。</p>
<p>Hbase通过列族划分数据的存储,列族下面可以包含任意多的列,实现灵活的数据存取。就像是家族的概念,我们知道一个家族是由于很多个的家庭组成的。列族也类似,列族是由一个一个的列组成(任意多)。</p>
<p>Hbase表的创建的时候就必须指定列族。就像关系型数据库创建的时候必须指定具体的列是一样的。</p>
<p>Hbase的列族不是越多越好,官方推荐的是列族最好小于或者等于3。我们使用的场景一般是1个列族。</p>
</div>
<h4>TimeStamp的概念</h4>
<div>
<div>
<p>TimeStamp对Hbase来说至关重要,因为它是实现Hbase多版本的关键。在Hbase中使用不同的timestame来标识相同rowkey行对应的不通版本的数据。</p>
<p>HBase 中通过 rowkey 和 columns 确定的为一个存储单元称为 cell。每个 cell 都保存着同一份 数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64 位整型。时间戳可以由 hbase(在数据写入时</p>
<p>自动)赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由 客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。 每个 cell 中,不同版本的数据按照时间</p>
<p>倒序排序,即最新的数据排在最前面。</p>
</div>
为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase 提供了两种数据版 本回收方式:</div>
<div>  <strong><span style="color: rgba(255, 0, 0, 1)">保存数据的最后 n 个版本 </span></strong></div>
<div><strong><span style="color: rgba(255, 0, 0, 1)">  保存最近一段时间内的版本(设置数据的生命周期 TTL)。</span></strong></div>
<div>用户可以针对每个列簇进行设置。
<h4>单元格(Cell)</h4>
由{rowkey, column( = + ), version} 唯一确定的单元。 Cell 中的数据是没有类型的,全部是字节码形式存贮。</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/qingyunzong/p/8665698.html
頁: [1]
查看完整版本: HBase学习之路 (一)HBase基础介绍