学习目标 ● 熟悉命名空间操作,能够使用HBaseShel 对命名空间进行创建、查看、删除等操作。 ● 掌握表操作,能够使用HBaseShel 对表进行创建、查看、删除等操作。 ● 掌握数据操作,能够使用HBaseShel 对数据进行插入、查询、删除等操作。 HBase自身提供了Shel 命令行工具HBaseShel,它可以对命名空间(namespace)、表 和数据进行操作。本章以操作完全分布式模式部署的HBase为例,演示如何使用HBase Shel 操作HBase。 3.运行HBaeShel 1s HBaseShel 可以在HBase集群的任意节点运行,默认情况下,只需要进入HBase的安 装目录执行“bin/hbaseshel”命令即可,如果在运行HBaseShel 的节点配置了HBase的系 统环境变量,那么也可以直接在任意目录执行hbaseshel 命令运行HBaseShel 。 接下来以虚拟机HBase01为例演示如何运行HBaseShel 。在虚拟机HBase01执行 hbaseshel 命令运行HBaseShel,成功运行HBaseShel 的效果如图3-1所示。 图3- 1 成功运行HBaseShel 的效果 可以在图3-1的“hbse:0>”位置输入HBasel 提供的命令来操作命名空间、 a001:eSh 第3章 HBase的Shell操作 71 表和数据。如果要关闭HBaseShell,在HBaseShell执行exit命令即可。 3.2 命名空间操作 命名空间的作用是将相关的表组织到一起,方便用户对表进行管理和维护,在HBase 中每个表都必须属于一个命名空间。本节详细介绍如何通过HBaseShell操作HBase的命 名空间。 3.2.1 查看命名空间 HBaseShell提供了list_namespace命令用于查看命名空间,该命令可以列出所有命名 空间,如果想要对查看的命名空间进行筛选,可以在查看命名空间时使用正则表达式匹配命 名空间的名称。查看命名空间的语法格式如下。 list_namespace ['regular'] 上述语法格式中,regular为可选,用于指定正则表达式。为了方便讲解后续知识,接下 来分步骤演示如何查看命名空间,具体步骤如下。 1.启动HBase 根据本书第2章的相关操作,在虚拟机HBase01、HBase02和HBase03启动Hadoop、 ZooKeeper和完全分布式模式部署的HBase。 2.运行HBaseShell 在虚拟机HBase01执行hbaseshell命令运行HBaseShell。 3.查看命名空间 在HBaseShell执行如下命令查看命名空间。 >list_namespace 上述命令的执行效果如图3-2所示。 图3-2 查看命名空间(1) 从图3-2可以看出,HBase默认预留了default和hbase两个命名空间,其中default是 HBase默认的命名空间,如果在创建表时没有指定命名空间,则默认将表创建到命名空间 default。hbase存储了HBase的系统表,系统表是HBase内部使用的表,用于存储HBase HBase基72 础入门 的元数据信息。 注意:命名空间hbase存储了HBase的系统表,为了避免HBase的运行出现异常,建 议用户不要对命名空间hbase进行操作。 多学一招:匹配特定命名空间 在list_namespace命令中,可以通过指定正则表达式来匹配特定的命名空间。例如,通 过正则表达式匹配名称以字母h开头的命名空间,可以在HBaseShell执行如下命令。 >list_namespace 'h.*' 上述命令的执行效果如图3-3所示。 图3-3 匹配特定命名空间 从图3-3可以看出,HBase仅存在一个名称以字母h开头的命名空间hbase。 3.2.2 创建命名空间 HBaseShell提供了create_namespace命令用于创建命名空间,在该命令中可以通过指 定属性来描述或者配置命名空间。命名空间的属性分为自定义属性和预定义属性两种类 型,其中自定义属性的名称和属性值由用户定义,主要用于描述命名空间,如指定命名空间 的描述信息;预定义属性的名称和属性值由HBase定义,主要用于配置命名空间,如限制命 名空间内表的数量。 创建命名空间的语法格式如下。 create_namespace 'ns'[,{'PROPERTY_NAME'=>'PROPERTY_VALUE'},...] 上述语法格式中,ns 用于指定命名空间的名称。{'PROPERTY_NAME' = > 'PROPERTY_VALUE'}为可选,用于指定命名空间的属性(PROPERTY_NAME)和属性 值(PROPERTY_VALUE)。 接下来演示如何创建命名空间itcast,并为命名空间指定自定义属性describe和属性值 Thisismyfirstnamespace,在HBaseShell执行如下命令。 >create_namespace 'itcast',{'describe'=>'This is my first namespace'} 上述命令执行完成后,查看命名空间,如图3-4所示。 从图3-4可以看出,HBase存在名称为itcast的命名空间,说明已成功创建命名空间 第3章 HBase的Shell操作 73 图3-4 查看命名空间(2) itcast。 多学一招:命名空间的预定义属性 HBase定义了多种命名空间的预定义属性,关于命名空间常用的预定义属性如下。 ● hbase.namespace.quota.maxtables:用于限制命名空间内表的数量,默认情况下不做 限制,如限制命名空间内表的数量为2,那么可以指定属性值为2。 ● hbase.namespace.quota.maxregions:用于限制命名空间占用Region的数量,默认情 况下不做限制,如限制命名空间占用Region的数量为10,那么可以指定属性值 为10。 需要说明的是,在创建命名空间时通过上述两个预定义属性限制表和Region的数量 时,需要开启HBase的Quota功能,该功能的开始方式是在HBase集群所有节点的配置文 件hbase-site.xml添加如下内容。 hbase.quota.enabled true 上述内容添加完成后,还需要重新启动HBase使配置内容生效。 3.2.3 查看命名空间属性 HBaseShell提供了describe_namespace命令用于查看命名空间属性,其语法格式 如下。 describe_namespace 'ns' 接下来演示如何查看命名空间itcast的属性,在HBaseShell执行如下命令。 >describe_namespace 'itcast' 上述命令的执行效果如图3-5所示。 从图3-5可以看出,命名空间itcast包含NAME和describe两个属性,其中NAME为 命名空间默认的属性,用于标识命名空间的名称;describe为创建命名空间itcast时指定的 自定义属性。 HBase基74 础入门 图3-5 查看命名空间itcast的属性(1) 3.2.4 修改命名空间 HBaseShell提供了alter_namespace命令用于添加或删除命名空间的属性,具体内容如下。 1.添加属性 为命名空间添加属性的语法格式如下。 alter_namespace 'ns',{METHOD =>'set','PROPERTY_NAME' =>'PROPERTY_VALUE'} 上述语法格式中,METHOD => s' et'表示添加属性。需要说明的是,如果添加的属性 在命名空间已存在,那么会根据指定的属性值来修改该属性的属性值。 接下来演示如何为命名空间itcast添加属性,具体内容如下。 (1)为命名空间itcast添加自定义属性create_user,并指定属性值为bozai,在HBase Shell执行如下命令。 >alter_namespace 'itcast',{METHOD =>'set','create_user' =>'bozai'} 上述命令执行完成后,查看命名空间itcast属性的效果如图3-6所示。 图3-6 查看命名空间itcast的属性(2) 从图3-6可以看出,命名空间itcast包含属性create_user,并且该属性的属性值为 bozai,因此说明已成功为命名空间itcast添加属性。 (2)为命名空间itcast添加自定义属性describe,并指定属性值为Thisnamespaceis modified,在HBaseShell执行如下命令。 >alter_namespace 'itcast',{METHOD =>'set', 'describe' =>'This namespace is modified'} 第3章 HBase的Shell操作 75 上述命令执行完成后,查看命名空间itcast的属性,如图3-7所示。 图3-7 查看命名空间itcast的属性(3) 从图3-7可以看出,由于属性describe已经存在于命名空间itcast,所以在执行上述命 令时,会将该属性的属性值由Thisis myfirstnamespace 修改为Thisnamespaceis modified。因此说明已成功为命名空间itcast添加属性,并且将相同属性的属性值进行了 修改。 2.删除属性 为命名空间删除属性的语法格式如下。 alter_namespace 'ns',{METHOD =>'unset',NAME=>'PROPERTY_NAME'} 上述语法格式中,ns用于指定命名空间的名称。METHOD => 'unset'表示删除属性 的固定语法。PROPERTY_NAME用于指定删除属性的名称,该属性必须已存在。 接下来演示如何删除命名空间itcast的属性describe,在HBaseShell执行如下命令。 >alter_namespace 'itcast',{METHOD =>'unset', NAME =>'describe'} 上述命令执行完成后,查看命名空间itcast的属性,如图3-8所示。 图3-8 查看命名空间itcast的属性(4) 从图3-8可以看出,命名空间itcast的描述信息中已经不存在属性describe。因此说明 已成功删除命名空间itcast的属性。 注意:命名空间默认的属性NAME是不能修改的。 3.2.5 删除命名空间 HBaseShell提供了drop_namespace命令用于删除命名空间,其语法格式如下。 drop_namespace 'ns' HBase基76 础入门 接下来演示如何删除命名空间itcast,在HBaseShell执行如下命令。 >drop_namespace 'itcast' 上述命令执行完成后,查看命名空间,如图3-9所示。 图3-9 查看命名空间(3) 从图3-9可以看出,HBase已经不存在命名空间itcast。因此说明已成功删除命名空间 itcast。 注意:如果命名空间包含表,那么需要将命名空间的表删除之后才能删除命名空间。 3.2.6 查看命名空间的表 HBaseShell提供了list_namespace_tables命令用于查看命名空间的表,其语法格式 如下。 list_namespace_tables 'ns' 接下来演示如何查看命名空间hbase的表,在HBaseShell执行如下命令。 >list_namespace_tables 'hbase' 上述命令的执行效果如图3-10所示。 图3-10 查看命名空间hbase的表 从图3-10可以看出,命名空间hbase包含表meta和namespace,其中,meta用于存储 表的元数据;namespace用于存储命名空间的元数据。 第3章 HBase的Shell操作 77 3.3 表操作 表的作用是将相同类型或者同一业务的数据组织在一起,方便用户对数据进行管理和 维护。本节详细介绍如何通过HBaseShell操作HBase的表。 3.3.1 创建表 在创建表时,必须为表指定至少一个列族,并且可以通过指定属性来配置表和列族。 HBase为表和列族定义了丰富的预定义属性,供用户在创建表时根据实际需求对表和列族 进行配置,关于表和列族常用的预定义属性如表3-1和表3-2所示。 表3-1 表常用的预定义属性 预定义属性含 义示 例 SPLITS_FILE 用于根据用户指定的拆分文件对表进行预拆分SPLITS_FILE => s' plits.txt' SPLITS 用于根据用户指定的数组对表进行预拆分SPLITS=> [1' 0',2' 0',3' 0', 4' 0'] SPLITALGO 用于根据用户指定的拆分算法对表进行预拆分,须 配合预定义属性NUMREGIONS一同使用。支持 的拆分算法有HexStringSplit、DecimalStringSplit 和UniformSplit SPLITALGO => 'HexStringSplit' NUMREGIONS 用于指定预拆分的数量,须配合预定义属性 SPLITALGO 一同使用NUMREGIONS=>15 METADATA 用于根据用户指定的自定义属性和属性值来描述表METADATA => {'mykey1' => 'myvalue1','mykey2' => 'myvalue2'} OWNER 用于指定表的所有者,表默认的所有者为创建该表 的用户OWNER => i'tcast' SPLIT_ ENABLED 用于开启或关闭Region自动拆分,默认为开启。若 该预定义属性的属性值为false表示关闭SPLIT_ENABLED => f'alse' MERGE_ ENABLED 用于开启或关闭Region自动合并,默认为开启。若 该预定义属性的属性值为false表示关闭MERGE_ENABLED => f'alse' READONLY 用于指定表是否为只读模式,当表为只读模式时无 法写入数据,默认为关闭。若该预定义属性的属性 值为true表示开启READONLY => t'rue' 表3-2 列族常用的预定义属性 预定义属性含 义示 例 BLOOMFILTER 用于指定列族中布隆过滤器的工作模式,默认属性值为 ROW(行模式),可选属性值为NONE(关闭)和ROWCOL (行列模式) BLOOMFILTER => 'NONE' IN_MEMORY 用于将列族存储的数据缓存到内存,提高数据的读取效率, 默认属性值为false,表示关闭IN_MEMORY => t'rue' 续表 HBase基78 础入门 预定义属性含 义示 例 VERSIONS 用于指定列族存储数据的最大版本数,若数据的版本数超 出最大版本数,则Region在合并过程中会根据版本的新旧 程度删除相对较旧版本的数据,以确保数据的版本数量不 超出最大版本数。默认属性值为1,即列族只存储最新版 本的数据 VERSIONS=>2 KEEP_ DELETED _CELLS 用于指定是否保存列族中已删除的数据,默认属性值为 false,表示不保存列族中已删除的数据,此时HBase会定 期自动清除已删除的数据。若属性值为true,那么会根据 预定义属性TTL指定的时间来清除已删除的数据 KEEP_DELETED_ CELLS=> t'rue' DATA_BLOCK _ENCODING 用于指定列族中数据的编码方式,默认属性值为NONE, 即不对列族中的数据进行编码处理。可选属性值包括 PREFIX、DIFF、FAST_DIFF和ROW_INDEX_V1 DATA_BLOCK_ ENCODING => 'FAST_DIFF' COMPRESSION 用于指定列族中数据的压缩格式,默认属性值为NONE, 即不对列族中的数据进行压缩。可选属性值包括LZO、 GZ、SNAPPY和LZ4 COMPRESSION=> 'SNAPPY' TTL 用于指定列族中数据的生存时间,时间单位为SECONDS (秒),当数据自写入后超过指定的生存时间时,会被HBase 自动清除。默认属性值为FOREVER,即列族中的数据永 久存在 TTL=> 1' 0SECONDS' MIN _VERSIONS 用于指定列族中数据的最小版本数,主要用于约束属性 TTL,如果指定了列族中数据的生存时间,那么当数据超 过生存时间时,在HBase自动清除数据之前会先判断当前 数据在列族中的版本数是否小于或等于最小版本数,如果 是就放弃清除数据。默认属性值为0 MIN_VERSIONS=>1 BLOCKCACHE 用于设置列族是否开启BlockCache,默认属性值为true,即 开启BlockCache BLOCKCACHE => f'alse' BLOCKSIZE 用于指定HFile 中每个数据块的大小,默认属性值为 65536(64KB) BLOCKSIZE=>131072 REPLICATION _SCOPE 用于定义数据的复制范围,复制类似于HDFS的副本机 制,主要是为了提高数据的可靠性。该参数的可选属性值 为0、1和2,其中0为默认属性值,表示不进行数据复制;1 表示数据只会在同一数据中心进行复制;2表示数据可以 在不同数据中心进行复制 REPLICATION _SCOPE =>1 在表3-1中关于预拆分、Region自动拆分和Region合并的内容会在本书的第6章进行 深入讲解,这里读者仅需了解即可。 在表3-2中,布隆过滤器(Bloomfilter)是一种基于概率的数据结构,在HBase中每个 列族都可以有一个布隆过滤器,布隆过滤器会为列族的数据创建索引,当客户端执行读操作 时,布隆过滤器会先通过索引查询数据是否存在,如果存在则继续查询对应的数据,否则直 接返回不存在。需要说明的是,如果预定义属性的属性值为数字类型,那么可以不使用单引 号进行修饰。 第3章 HBase的Shell操作 79 HBaseShell提供了create命令用于创建表,根据创建表时是否指定列族的属性,可以 将创建表的方式分为两种,具体内容如下。 1.创建表时指定列族的属性 在创建表时,可以通过指定列族的属性,将预定义属性的默认属性值根据实际需求进行 修改,其语法格式如下。 create '[namespace:]table_name', {NAME =>'columnfamily',CF_PROPERTY_NAME=>'CF_PROPERTY_VALUE',...}, {NAME =>'columnfamily',CF_PROPERTY_NAME=>'CF_PROPERTY_VALUE',...},... [,TABLE_PROPERTY_NAME =>'TABLE_PROPERTY_VALUE', TABLE_PROPERTY_NAME =>'TABLE_PROPERTY_VALUE',...] 上述语法格式中,namespace为可选,用于指定表所属的命名空间。如果没有指定命名 空间,那么将使用默认的命名空间default。table_name用于指定表的名称,columnfamily 用于指定列族的名称。 CF_PROPERTY_NAME和CF_PROPERTY_VALUE用于根据HBase为列族定义 的预定义属性来指定列族的属性及其属性值,可以同时指定列族的多个属性。 TABLE_PROPERTY_NAME 和TABLE_PROPERTY_VALUE 为可选,用于根据 HBase为表定义的预定义属性指定表的属性及其属性值,可以同时指定表的多个属性。 接下来演示如何在创建表时指定列族的属性,具体需求如下。 ● 在命名空间school创建表teacher_info,指定表的列族为grade1和grade2。 ● 通过表的预定义属性METADATA,为表指定自定义属性comment和属性值Class of2022TeacherList。 ● 通过表的预定义属性MERGE_ENABLED关闭Region自动合并。 ● 通过列族的预定义属性VERSIONS,将列族grade1存储数据的最大版本数调整 为2。 ● 通过列族的预定义属性IN_MEMORY,将列族grade1存储的数据缓存到内存。 ● 通过列族的预定义属性TTL,将列族grade2中数据的生存时间调整为10秒。 ● 通过列族的预定义属性MIN_VERSIONS,将列族grade2存储数据的最小版本数调 整为1。 根据上述需求,在HBaseShell执行下列命令。 # 创建命名空间school >create_namespace 'school' # 在命名空间school 创建表teacher_info >create 'school:teacher_info',{NAME =>'grade1',VERSIONS =>2, IN_MEMORY =>'true'},{NAME =>'grade2',TTL =>'10 SECONDS', MIN_VERSIONS =>1},MERGE_ENABLED =>'false', METADATA =>{'comment' =>'Class of 2022 Teacher List'} 上述命令执行完成后,查看命名空间school的表,如图3-11所示。 从图3-11可以看出,命名空间school包含表teacher_info。因此说明已成功在命名空 间school创建表teacher_info。 2.创建表时不指定列族的属性 出于便捷性考虑,可以在创建表时不指定列族的属性,使列族直接应用预定义属性默认 HBase基80 础入门 图3-11 查看命名空间school的表 的属性值,其语法格式如下。 create '[namespace:]table_name','columnfamily','columnfamily',... [,'TABLE_PROPERTY_NAME' =>'TABLE_PROPERTY_VALUE',...] 接下来演示如何在创建表时不指定列族的属性。这里在命名空间default创建表user_ info,指定表的列族为person和address,在HBaseShell执行如下命令。 >create 'user_info','person','address' 上述命令执行完成后,查看命名空间default的表,如图3-12所示。 图3-12 查看命名空间default的表 从图3-12可以看出,命名空间default包含表user_info。因此说明已成功在命名空间 default创建表user_info。 多学一招:克隆表 除了通过HBaseShell提供的create命令创建表之外,HBaseShell还提供了clone_ table_schema命令,可以基于已存在的表克隆一个新表,从而实现创建表的目的。新表与被 克隆的表具有相同的元数据,但不包含被克隆表的数据。关于克隆表的语法格式如下。 clone_table_schema '[namespace:]table_name','[namespace:]new_table_name' [,'split_key'] 上述语法格式中,table_name用于指定被克隆的表名;new_table_name用于指定新表 的表名;split_key为可选,用于指定新表是否包含被克隆表的Region拆分信息,默认值为 第3章 HBase的Shell操作 81 true,表示包含。 例如,通过克隆命名空间school的表teacher_info,在命名空间default创建表student_ info,具体命令如下。 >clone_table_schema 'school:teacher_info','student_info' 3.3.2 查看表信息 HBaseShell提供了desc命令用于查看表信息,表信息的内容包含表的状态信息,以及 表和列族的属性信息。关于查看表信息的语法格式如下。 desc '[namespace:]table_name' 接下来演示如何查看命名空间school中表teacher_info的信息,在HBaseShell执行如 下命令。 >desc 'school:teacher_info' 上述命令的执行效果如图3-13所示。 图3-13 查看命名空间school中表teacher_info的信息(1) 在图3-13中,①标注的部分为表的状态信息,其中状态信息中的ENABLED表示表处 于启用状态,若状态信息中出现DISABLE表示表处于停用状态,有关停用和启用表的相关 内容会在3.3.4节进行讲解。②标注的部分为表的属性信息。③标注的部分为列族的属性 信息,其中属性NAME用于标注列族名称,其他属性为HBase为列族定义的预定义属性。 3.3.3 查看表 HBaseShell提供了list命令用于查看表,该命令可以列出用户创建的所有表,也可以 使用正则表达式对用户创建的所有表进行筛选。关于查看表的语法格式如下。 list '[[namespace:]regular]' 上述语法格式中,[[namespace:]regular]为可选,用于通过正则表达式对指定命名空 HBase基82 础入门 间中用户创建的所有表进行筛选,其中namespace为可选,用于指定命名空间,如果不指定 命名空间,那么正则表达式会对用户创建的所有表进行筛选;regular用于指定正则表达式。 需要说明的是,在查看表的结果中,除了属于命名空间default的表之外,其他命名空间 中表的展现形式为“命名空间:表”,例如,命名空间school中表teacher_info的展现形式为 school:teacher_info。 此外,使用正则表达式对用户创建的所有表进行筛选时,只有命名空间default的表是 基于表名与正则表达式进行匹配,而其他命名空间的表则基于“命名空间:表”的形式与正则 表达式进行匹配。 接下来分别演示如何查看用户创建的所有表,以及如何使用正则表达式对用户创建的 表进行筛选,具体内容如下。 (1)查看用户创建的所有表,在HBaseShell执行如下命令。 >list 上述命令的执行效果如图3-14所示。 图3-14 查看表(1) 从图3-14可以看出,用户共创建了3个表,其中表student_info和user_info属于命名 空间default,表teacher_info属于命名空间school。 (2)通过正则表达式“.*:t.*”对用户创建的所有表进行筛选,匹配表名以字母t开头 的表,在HBaseShell执行如下命令。 >list '.*:t.*' 上述命令的执行效果如图3-15所示。 从图3-15可以看出,用户创建了一个表名以字母t开头的表teacher_info,该表属于命 名空间school。 (3)通过正则表达式“u.*”对命名空间default中用户创建的所有表进行筛选,匹配表 名以字母u开头的表,在HBaseShell执行如下命令。 >list 'default:u.*' 上述命令的执行效果如图3-16所示。 从图3-16可以看出,在命名空间default中用户创建了一个表名以字母u开头的表 第3章 HBase的Shell操作 83 图3-15 查看表(2) 图3-16 查看表(3) user_info。 注意:查看表的范围仅限于用户创建的表,并不会涉及HBase的系统表,如属于命名 空间hbase的表。 3.3.4 停用和启用表 HBase中表的状态分为停用和启用,当表处于停用状态时,用户无法访问和操作表中 的数据。默认情况下,用户创建的表为启用状态。HBaseShell提供了相应的命令来停用和 启用表,具体介绍如下。 1.停用表 停用表的主要目的是在进行某些特定操作时,保护表中的数据不受并发访问的干扰,从 而确保数据的一致性和完整性。例如,执行诸如修改表、删除表、数据迁移等操作。 HBaseShell提供了disable命令用于停用表,其语法格式如下。 disable '[namespace:]table_name' 接下来演示如何停用命名空间school的表teacher_info,在HBaseShell执行如下 命令。 >disable 'school:teacher_info' HBase基84 础入门 上述命令执行完成后,查看命名空间school中表teacher_info的信息,如图3-17所示。 图3-17 查看命名空间school中表teacher_info的信息(2) 从图3-17可以看出,命名空间school中表teacher_info的状态信息中出现DISABLED 的内容,因此说明成功停用表。 2.启用表 启用表的主要目的是在完成表的维护或修改操作后,允许用户重新访问和操作表中的 数据。HBaseShell提供了enable命令用于启用表,其语法格式如下。 enable '[namespace:]table_name' 接下来演示如何启用命名空间school的表teacher_info,在HBaseShell执行如下 命令。 >enable 'school:teacher_info' 上述命令执行完成后,查看命名空间school中表teacher_info的信息,如图3-18所示。 图3-18 查看命名空间school中表teacher_info的信息(3) 从图3-18可以看出,命名空间school中表teacher_info的状态信息中出现ENABLED 的内容,因此说明成功启用表。 注意:系统表是无法停用的。 多学一招:停用或启用多个表 当需要停用或启用多个表时,逐个执行disable或enable命令可能会非常耗时。为了 第3章 HBase的Shell操作 85 提高效率,HBaseShell提供了disable_all和enable_all命令,用于一次性停用或启用多个 表。这些命令可以根据指定的正则表达式来匹配表名,并对符合条件的表执行停用或启用 操作。停用或启用多个表的语法格式如下。 # 停用多个表 disable_all '[namespace:]regular' # 启用多个表 enable_all '[namespace:]regular' 上述语法格式中,namespace和regular分别用于指定命名空间和正则表达式,如果不 指定命名空间,那么会根据指定的正则表达式匹配用户创建的所有表。 这里以disable_all命令为例,演示如何使用正则表达式“.*:.*_info$”来匹配表名, 停用用户创建的所有表中表名以字符串_info结尾的表,在HBaseShell执行如下命令。 >disable_all '.*:.*_info$' 上述命令执行完成的效果如图3-19所示。 图3-19 停用多个表 从图3-19可以看出,当执行disable_all命令时,会列出匹配到的所有表,然后询问是否 对这些表执行停用操作,如果确认无误的话可以输入字母y,此时便会停用匹配到的所 有表。使 用enable_all命令启用多个表的方式与disable_all命令相同,这里不再赘述。 3.3.5 判断表 HBaseShell提供了exists命令、is_enabled命令和is_disabled命令用于判断表,具体 内容如下。 1.exists命令 exists命令用于判断表是否存在,当该命令返回结果为true时,表示表存在;若返回结 果为false,则表示表不存在,其语法格式如下。 exists '[namespace:]table_name' HBase基86 础入门 接下来演示如何判断命名空间school是否存在表student_info,在HBaseShell执行如 下命令。 >exists 'school:student_info' 上述命令的执行效果如图3-20所示。 图3-20 判断表是否存在 从图3-20可以看出,exist命令的返回结果为false,因此说明命名空间school不存在表 student_info。 2.is_enabled命令 is_enabled命令用于判断表是否处于启用状态,当该命令返回结果为true时,表示表处 于启用状态;若返回结果为false,则表示表处于停用状态,其语法格式如下。 is_enabled '[namespace:]table_name' 接下来演示如何判断命名空间default的表user_info是否处于启用状态,在HBase Shell执行如下命令。 >is_enabled 'user_info' 上述命令的执行效果如图3-21所示。 图3-21 判断表是否处于启用状态 从图3-21可以看出,is_enabled命令的返回结果为false,因此说明命名空间default的 表user_info处于停用状态。 3.is_disabled命令 is_disabled命令用于判断表是否处于停用状态,当该命令返回结果为true时,表示表 处于停用状态;若返回结果为false,则表示表处于启用状态,其语法格式如下。 第3章 HBase的Shell操作 87 is_disabled '[namespace:]table_name' 接下来演示如何判断命名空间school的表teacher_info是否处于停用状态,在HBase Shell执行如下命令。 >is_disabled 'school:teacher_info' 上述命令的执行效果如图3-22所示。 图3-22 判断表是否处于停用状态 从图3-22可以看出,is_disabled命令的返回结果为true,因此说明命名空间school的 表teacher_info处于停用状态。 3.3.6 修改表 HBaseShell提供了alter命令用于修改表,包括修改表属性和列族,具体内容如下。 1.修改表属性 修改表属性主要涉及对表的属性进行添加或删除的操作,具体内容如下。 1)添加属性 添加属性表示根据表的预定义属性为表添加属性及其属性值,如果添加的属性在表中 已存在,那么可以根据指定的属性值来修改该属性的属性值。关于添加属性的语法格式 如下。 alter '[namespace:]table_name',TABLE_PROPERTY_NAME => 'TABLE_PROPERTY_VALUE'[,TABLE_PROPERTY_NAME =>'TABLE_PROPERTY_VALUE',...] 上述语法格式中,TABLE_PROPERTY_NAME 和TABLE_PROPERTY_VALUE 用于根据表的预定义属性来添加表的属性及其属性值。 接下来演示如何为命名空间school的表teacher_info添加属性,具体需求如下。 ● 添加预定义属性READONLY,并指定属性值为true。 ● 添加预定义属性MERGE_ENABLED,并指定属性值为true。 根据上述需求,在HBaseShell执行如下命令。 >alter 'school:teacher_info',MERGE_ENABLED =>'true',READONLY =>'true' 上述命令执行完成后,查看命名空间school中表teacher_info的信息,如图3-23所示。 通过对比图3-23和图3-13,可以发现命名空间school中表teacher_info的属性信息发 HBase基88 础入门 图3-23 查看命名空间school中表teacher_info的信息(4) 生了变化。首先,预定义属性READONLY 被添加到了表属性中;其次,由于预定义属性 MERGE_ENABLED已经存在,所以它的属性值被修改为true。 2)删除属性 删除属性的语法格式如下。 alter '[namespace:]table_name',METHOD =>'table_att_unset' ,NAME =>'TABLE_PROPERTY_NAME' 上述语法格式中,METHOD = > 'table_att_unset' 表示删除属性,TABLE_ PROPERTY_NAME用于指定属性名。 接下来演示如何删除命名空间school中表teacher_info的自定义属性comment,在 HBaseShell执行如下命令。 >alter 'school:teacher_info',METHOD =>'table_att_unset', NAME =>'comment' 上述命令执行完成后,查看命名空间school中表teacher_info的信息,如图3-24所示。 从图3-24可以看出,命名空间school中表teacher_info的属性信息中已经不存在自定 义属性comment。 2.修改列族 修改列族主要涉及修改表中列族的属性,以及对表中的列族执行添加或删除操作,具体 内容如下。 1)修改列族属性 修改列族属性是指根据列族的预定义属性对列族的属性进行调整,其语法格式如下。 alter '[namespace:]table_name', {NAME =>'columnfamily',CF_PROPERTY_NAME=>'CF_PROPERTY_VALUE' [,CF_PROPERTY_NAME=>'CF_PROPERTY_VALUE',...]} 第3章 HBase的Shell操作 89 图3-24 查看命名空间school中表teacher_info的信息(5) [,{NAME =>'columnfamily',CF_PROPERTY_NAME=>'CF_PROPERTY_VALUE' [,CF_PROPERTY_NAME=>'CF_PROPERTY_VALUE',...]}, ...] 上述语法格式可以同时对多个列族的多个属性进行调整,其中columnfamily用于指定 列族的名称。CF_PROPERTY_NAME和CF_PROPERTY_VALUE用于指定预定义属 性及其对应的属性值。 接下来演示如何对命名空间school的表teacher_info中列族grade1的属性进行修改, 具体需求如下。 ● 通过列族的预定义属性VERSIONS,将列族存储数据的最大版本数调整为3。 ● 通过列族的预定义属性BLOCKSIZE,将列族的HFile中每个数据块的大小调整 为131072。 根据上述需求,在HBaseShell执行如下命令。 >alter 'school:teacher_info',{NAME =>'grade1',VERSIONS =>3, BLOCKSIZE =>131072} 上述命令执行完成后,查看命名空间school中表teacher_info的信息,如图3-25所示。 通过对比图3-25和图3-24,可以观察到,列族grade1的属性信息发生了变化,其中预 定义属性VERSIONS 的属性值变更为3;预定义属性BLOCKSIZE 的属性值变更 为131072。 2)添加列族 添加列族是指在表中添加一个或多个新的列族。在添加列族时,可以根据列族的预定 义属性对其进行相应的配置。 alter '[namespace:]table_name', {NAME =>'columnfamily'[,'CF_PROPERTY_NAME'=>'CF_PROPERTY_VALUE',...]} [,{NAME =>'columnfamily'[,'CF_PROPERTY_NAME'=>'CF_PROPERTY_VALUE',...]} ,...]