喜欢简单幸福的小女人 發表於 2023-6-30 00:00:00

Hbase列式存储入门教程

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>
        1、逻辑结构</li><li>
        2、物理结构</li><li>
        3、增删改查</li><li>
        4、应用场景</li><li>
        5、参考资料</li></ul></div><div id="navcategory">
        <h5 class="catalogue">
                目录</h5>
        <ul class="first_class_ul">
<li>
                        1、逻辑结构
</li>
                <li>
                        2、物理结构
</li>
                <li>
                        3、增删改查
</li>
                <li>
                        4、应用场景
</li>
                <li>
                        5、参考资料
</li>
        </ul>
</div>
<p>
        hbase是一种分布式、可扩展、支持海量数据存储的nosql数据库。分布式是因为hbase底层使用hdfs存储数据,可扩展也是基于hdfs的横向扩展能力,作为大数据的存储当然支持海量数据的存储,nosql非关系型数据库表结构和关系型数据库(如mysql)的逻辑结构、物理结构很不一样,性质特点、应用场景也不一样。</p>
<p class="maodian">
        </p>
<p class="maodian"></p><h2>
        1、逻辑结构</h2>
<p>
        <img title="Hbase列式存储入门教程" alt="Hbase列式存储入门教程" src="https://zhuji.jb51.net/uploads/img/202305/9e9bb5d57af393ee20837256d45b87c4.jpg"></p>
<p>
        <strong>1)name space</strong></p>
<p>
        命名空间,类似于关系型数据库的 databbase 概念,每个命名空间下有多个表。hbase有两个自带的命名空间,分别是 hbase 和 default,hbase 中存放的是 hbase 内置的表,default 表是用户默认使用的命名空间。</p>
<p>
        <strong>2)region</strong></p>
<p>
        类似于关系型数据库的表概念。不同的是,hbase 定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往 hbase 写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,hbase 能够轻松应对字段变更的场景。</p>
<p>
        <strong>3)row</strong></p>
<p>
        hbase 表中的每行数据都由一个 <strong>rowkey</strong> 和多个 <strong>column</strong>(列)组成,数据是按照 rowkey的字典顺序存储的,并且查询数据时只能根据 rowkey 进行检索,所以 rowkey 的设计十分重要。</p>
<p>
        <strong>4)column</strong></p>
<p>
        hbase 中的每个列都由 column family(列族)和 column qualifier(列限定符)进行限定,例如 info:name,info:age。建表时,只需指明列族,而列限定符无需预先定义。</p>
<p>
        <strong>5)time stamp</strong></p>
<p>
        用于标识数据的不同版本(version),每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入 hbase 的时间。</p>
<p>
        <strong>6)cell</strong></p>
<p>
        由{rowkey, column family:column qualifier, time stamp} 唯一确定的单元。cell 中的数据是没有类型的,全部是字节码形式存贮。</p>
<p class="maodian">
        </p>
<p class="maodian"></p><h2>
        2、物理结构</h2>
<p>
        <img title="Hbase列式存储入门教程" alt="Hbase列式存储入门教程" src="https://zhuji.jb51.net/uploads/img/202305/3b06942a474510901a1ccfd35d7784b9.jpg"></p>
<p>
        <strong>1)region server</strong></p>
<p>
        region server 为 region 的管理者,其实现类为 hregionserver,主要作用如下:对于数据的操作:get, put, delete;对于 region 的操作:splitregion、compactregion。</p>
<p>
        <strong>2)master</strong></p>
<p>
        master 是所有 region server 的管理者,其实现类为 hmaster,主要作用如下:对于表的操作:create, delete, alter对于 regionserver的操作:分配 regions到每个regionserver,监控每个 regionserver的状态,负载均衡和故障转移。</p>
<p>
        <strong>3)zookeeper</strong></p>
<p>
        hbase 通过 zookeeper 来做 master 的高可用、regionserver 的监控、元数据的入口以及集群配置的维护等工作。</p>
<p>
        <strong>4)hdfs</strong></p>
<p>
        hdfs 为 hbase 提供最终的底层数据存储服务,同时为 hbase 提供高可用的支持。</p>
<p class="maodian">
        </p>
<p class="maodian"></p><h2>
        3、增删改查</h2>
<p>
        初学或者测试阶段对hbase操作可以使用<code>hbase shell</code>。增删改查等基本命令如下:</p>
<p>
        (1)创建表</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_828410">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">create</code> <code class="sql string">'test'</code><code class="sql plain">,</code><code class="sql string">'cf'</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        test是表名,cf是列族名,你会发现hbase的表在新建的时候并没有地方让你定义列(和关系型数据库很不一样吧)。这是因为hbase中的列全部都是灵活的,可以随便定义的。列只有在你插入第一条数据的时候才会生成。那么表的属性在哪里定义呢?其实hbase的所有数据属性都是定义在列族上的。</p>
<p>
        (2)查看表属性</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_248949">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">describe </code><code class="sql string">'test'</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        输出:</p>
<blockquote>
        <p>
                hbase(main):002:0&gt; desc 'test'<br>
                table test is enabled<br>
                test, {table_attributes =&gt; {durability =&gt; 'use_default', metadata =&gt; {'is_root'<br>
                =&gt; 'false', 'lindorm_table_attrs' =&gt; '\x00\x08\x00\x00\x00\x16wal_edit_with_full<br>
                _row\x05false\x00\x00\x00\x0bconsistency\x08eventual\x00\x00\x00\x16leader_balan<br>
                ce_enabled\x01\xff\x00\x00\x00\x1ffull_row_edit_carry_latest_data\x04true\x00\x0<br>
                0\x00\x0fdynamic_columns\x04true\x00\x00\x00\x0fallow_filtering\x01\x00\x00\x00\<br>
                x00\x13leader_balance_type\x06single\x00\x00\x00\x12deferred_log_flush\x05false'<br>
                , 'tablemetaversion' =&gt; '`\xe4n\x0f'}}<br>
                column families description<br>
                {name =&gt; 'cf', versions =&gt; '1', evict_blocks_on_close =&gt; 'false', new_version_be<br>
                havior =&gt; 'false', keep_deleted_cells =&gt; 'false', cache_data_on_write =&gt; 'false'<br>
                , data_block_encoding =&gt; 'diff', ttl =&gt; 'forever', min_versions =&gt; '0', replicat<br>
                ion_scope =&gt; '0', bloomfilter =&gt; 'row', cache_index_on_write =&gt; 'false', in_memo<br>
                ry =&gt; 'false', cache_blooms_on_write =&gt; 'false', prefetch_blocks_on_open =&gt; 'fal<br>
                se', compression =&gt; 'zstd', blockcache =&gt; 'true', blocksize =&gt; '65536', metadata<br>
                 =&gt; {'storage_policy' =&gt; 'default', 'compress_tags' =&gt; 'true', 'dfs_replication'<br>
                 =&gt; '2', 'chs_promote_on_major' =&gt; 'true'}}<br>
                1 row(s)<br>
                took 0.2150 seconds</p>
</blockquote>
<p>
        可以看出对表的描述不多,大量的是对列族的描述,列族更像是传统关系数据库中的表,而表本身反倒变成只是存放列族的空壳了。</p>
<p>
        (3)查看表</p>
<blockquote>
        <p>
                list</p>
</blockquote>
<p>
        输出:</p>
<blockquote>
        <p>
                hbase(main):001:0&gt; list<br>
                table<br>
                test<br>
                test1<br>
                test2<br>
                test_ls<br>
                4 row(s)<br>
                took 0.6370 seconds<br>
                =&gt; ["test", "test1", "test2", "test_ls"]</p>
</blockquote>
<p>
        (4)插入数据</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_40257">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">put </code><code class="sql string">'test'</code><code class="sql plain">,</code><code class="sql string">'row1'</code><code class="sql plain">,</code><code class="sql string">'cf:name'</code><code class="sql plain">,</code><code class="sql string">'jack'</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        这条语句的意思就是:往test表插入一个单元格。这个单元格的rowkey为row1,也就是说它是属于row1这个行中的一个列。该单元格的列族为cf。该单元格的列名为name。数据值为jack。可见列是在插入数据的时候产生的,hbase中列可以自由扩展。表的结构中某一行可能没有某个列,但数据并不以null替代,而是压根没有该单元格。这样以稀疏k-v方式存储数据可以大大压缩数据存储容量。</p>
<p>
        <img title="Hbase列式存储入门教程" alt="Hbase列式存储入门教程" src="https://zhuji.jb51.net/uploads/img/202305/414a938c7874a4eebb59fe5607387749.jpg"></p>
<p>
        (5)扫描数据</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_97678">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">scan </code><code class="sql string">'test'</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        输出:</p>
<blockquote>
        <p>
                hbase(main):011:0&gt; scan 'test'<br>
                row                   column+cell<br>
                 row1                 column=cf:name, timestamp=1625911358767, value=jack<br>
                1 row(s)<br>
                took 0.5670 seconds</p>
</blockquote>
<p>
        scan命令类似于mysql中的<code>select * from test</code>。</p>
<p>
        (6)查看数据</p>
<p>
        scan命令是批量读取数据,查询某个单元格的数据可以用get命令,</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_233722">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">get </code><code class="sql string">'test'</code><code class="sql plain">,</code><code class="sql string">'row1'</code><code class="sql plain">,</code><code class="sql string">'cf:name'</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        由于hbase底层使用键值对存储数据,查询一个单元格的数据非常快,这和mysql也完全不同。</p>
<p>
        (7)删除数据</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_557866">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">delete</code> <code class="sql string">'test'</code><code class="sql plain">,</code><code class="sql string">'row1'</code><code class="sql plain">,</code><code class="sql string">'cf:name'</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        hbase删除记录并不是真的删除了数据,而是放置了一个墓碑标记(tombstone marker),把这个版本连同之前的版本都标记为不可见了。</p>
<p>
        (8)停用表</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_503594">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">disable </code><code class="sql string">'test'</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        表删除之前要停用表</p>
<p>
        (9)删除表</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_952853">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">drop</code> <code class="sql string">'test'</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p class="maodian">
        </p>
<p class="maodian"></p><h2>
        4、应用场景</h2>
<p>
        hbase采用的是key/value的存储方式,这意味着,即使随着数据量增大,也几乎不会导致查询的性能下降。凡事都不可能只有优点而没有缺点。数据分析是hbase的弱项,因为对于hbase乃至整个nosql生态圈来说,基本上都是不支持表关联的。</p>
<p>
        不适用的场景:主要需求是数据分析,比如做报表。单表数据量不超过千万。建议使用mysql或者oracle数据库。</p>
<p>
        适用的场景:单表数据量超千万,而且并发还挺高。数据分析需求较弱,或者不需要那么灵活或者实时。</p>
<p class="maodian">
        </p>
<p class="maodian"></p><h2>
        5、参考资料</h2>
<p>
        《hbase不睡觉书》</p>
<p>
        《hbase原理与实践》</p>
<p>
        b站视频《尚硅谷hbase教程(hbase框架快速入门)》</p>
<p>
        到此这篇关于hbase列式存储入门的文章就介绍到这了,更多相关hbase列式存储内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!</p>
<p>
        原文链接:https://blog.csdn.net/Andytl/article/details/118638776</p>
頁: [1]
查看完整版本: Hbase列式存储入门教程