桥下の民 - HBase
type: channel
link: https://www.wordplay.work/index.php/category/HBase
items: Phoenix命令大全
items: Hbase Rowkey 详解
items: HBase scan
items: HBase Shell 命令大全
items: DataGrip 连接 Phoenix
items: HBase 与 Hive 的集成
items: Phoenix
items: HBase 进阶&优化
items: HBase 简介&入门

Phoenix命令大全
type: item
date: 2022-10-12T04:39:00+00:00
description: Phoenix的几种方法调用： 批处理方式 命令行方式 GUI方式 JDBC调用方式 一、批处理方式 1、创建user_phoenix.sql文件 内容如下 CREATE TABLE IF NOT EXISTS user_phoenix ( state CHAR(2) NOT NULL, city VARCHAR NOT NULL, population BIGINT CONSTRAINT my_pk PRIMARY KEY (state, city) ); 2、创建user_phoenix.csv数据文件 NY,New York,8143197 CA,Los Angeles,3844829 IL,Chicago,2842518 TX,Houston,2016582 PA,Philadelphia,1463281 AZ,Phoenix,1461575 TX,San Antonio,1256509 CA,San Diego,1255540 TX,Dallas,1213825 CA,San Jose,912332 3、创建user_phoenix_query.sql文件 SELECT state as "State",count(city) as "City Count",sum(population) as "Population Sum" FROM user_phoenix GROUP BY state ORDER BY sum(population) DESC; 4、执行 python /export/servers/phoenix-4.14.0-cdh5.14.2/bin/psql.py node01:2181 user_phoenix.sql user_phoenix.csv user_phoenix_query.sql 这条命令同时做了三件事：创建表、插入数据、查询结果。 用Hbase shell 看下会发现多出来一个 USER_PHOENIX 表，用scan 命令查看一下这个表的数据 hbase(main):002:0> scan 'USER_PHOENIX' 结论： 1、之前定义的Primary key 为state,city, 于是Phoenix就把输入的state，city的值拼起来成为rowkey。 2、其他的字段还是按照列名去保存，默认的列族为0。 3、还有一个0:_0这个列是没有值的，这个是Phoenix处于性能方面考虑增加的一个列，不用管这个列。 二、命令行方式 1、执行命令 ./sqlline.py node01:2181 可以进入到命令行模式 2、相关命令 开头需要一个感叹号 使用help可以打印出所有命令 !all Execute the specified SQL against all the current connections !appconfig Set custom application configuration class name !autocommit Set autocommit mode on or off !batch Start or execute a batch of statements !brief Set verbose mode off !call Execute a callable statement !close Close the current connection to the database !closeall Close all current open connections !columns List all the columns for the specified table !commandhandler Add a command handler !commit Commit the current transaction (if autocommit is off) !connect Open a new connection to the database !dbinfo Give metadata information about the database !describe Describe a table !dropall Drop all tables in the current database !exportedkeys List all the exported keys for the specified table !go Select the current connection !help Print a summary of command usage !history Display the…

Hbase Rowkey 详解
type: item
date: 2022-10-12T02:49:00+00:00
description: 一、前言 HBase 由于它存储和读写的高性能，在 OLAP 即时分析中发挥着重要的作用。而 RowKey 作为 HBase 的核心知识点，其设计势必会影响到数据在 HBase 中的分布，还会影响我们查询效率，可以说 RowKey 的设计质量关乎了 HBase 的质量。 对于关系型数据库，数据定位可以理解为“二维坐标”；但在 HBase 中，定位一条数据（即一个 Cell）我们需要 4 个维度的限定：行键（RowKey）、列族（Column Family）、列限定符（Column Qualifier）、时间戳（Timestamp）。其中，RowKey 是最容易出现问题的。除了根据业务和查询需求来设计之外，还有很多地方需要我们注意。 二、RowKey 概念 HBase 中 RowKey 可以唯一标识一行记录，在 HBase 查询的时候有以下几种方式： 通过 get 方式，指定 RowKey 获取唯一一条记录。 通过 scan 方式，设置 startRow 和 stopRow 参数进行范围匹配。 全表扫描，即直接扫描整张表中所有行记录。 从字面意思来看，RowKey 就是行键的意思，在曾删改查的过程中充当了主键的作用。它可以是任意字符串，在 HBase 内部 RowKey 保存为字节数组。 HBase 中的数据是按照 Rowkey 的 ASCII 字典顺序进行全局排序的，有伙伴可能对 ASCII 字典序印象不够深刻，下面举例说明： 假如有 5 个 Rowkey："012", "0", "123", "234", "3"，按 ASCII 字典排序后的结果为："0", "012","123", "234", "3"。 因此设计 RowKey 时，需要充分利用排序存储这个特性，将经常一起读取的行存储放到一起，要避免做全表扫描，因为效率特别低。 三、什么是数据热点？ 3.1、热点现象产生 HBase 中的行是按照 Rowkey 的字典顺序排序的，这种设计优化了 scan 操作，可以将相关的行以及会被一起读取的行存取在临近位置，便于 scan。 然而糟糕的 Rowkey 设计是热点的源头。 热点发生在大量的 client 直接访问集群的一个或极少数个节点（访问可能是读，写或者其他操作）。 大量访问会使热点 region 所在的单个机器超出自身承受能力，引起性能下降甚至 region 不可用，这也会影响同一个 RegionServer 上的其他 region，由于主机无法服务其他 region 的请求，这样就造成数据热点现象。 （这一点其实和数据倾斜类似） 所以在向 HBase 中插入数据的时候，应优化 RowKey 的设计，使数据被写入集群的多个 region，而不是一个。尽量均衡地把记录分散到不同的 Region 中去，平衡每个 Region 的压力。 3.2、避免数据热点的方法 在日常使用中，主要有 3 个方法来避免热点现象，分别是反转，加盐和哈希，下面逐个举例分析： 3.2.1、反转（Reversing） 第一种咱们要分析的方法是反转，顾名思义它就是把固定长度或者数字格式的 RowKey 进行反转，反转分为一般数据反转和时间戳反转，其中以时间戳反转较常见。 反转固定格式的数值以手机号为例，手机号的前缀变化比较少（如152、185等），但后半部分变化很多。如果将它反转过来，可以有效地避免热点。不过其缺点就是失去了有序性。 反转时间这个操作严格来讲不算“打散”，但可以调整数据的时间排序。如果将时间按照字典序排列，最近产生的数据会排在旧数据后面。如果用一个大值减去时间（比如用 99999999 减去 yyyyMMdd，或者 Long.MAX_VALUE 减去 时间戳），最新的数据就可以排在前面了。 3.2.2、加盐（Salting） 这里的“加盐”与密码学中的“加盐”不是一回事。它是指在 RowKey 的前面增加一些前缀，加盐的前缀种类越多，RowKey 就被打得越散。 需要注意的是分配的随机前缀的种类数量应该和我们想把数据分散到的那些 region 的数量一致。只有这样，加盐之后的 rowkey 才会根据随机生成的前缀分散到各个 region 中，避免了热点现象。 3.2.3、哈希（Hashing） 其实哈希和加盐的使用场景类似，但前缀不可以是随机的，因为必须要让客户端能够完整地重构 RowKey。所以一般会拿原 RowKey 或其一部分计算 Hash 值，然后再对 Hash 值做运算作为前缀。 四、RowKey 的设计原则 通过前面的分析应该知道了 HBase 中 RowKey 设计的重要性了，为了帮助我们设计出完美的 RowKey，HBase 提出了 RowKey 的设计原则主要有以下四点：长度原则、唯一原则、排序原则、散列原则。 4…

HBase scan
type: item
date: 2022-10-11T16:28:00+00:00
description: 一、简介 HBase scan 命令用来查询全表数据，使用时只需指定表名即可。 例如对于上面的 Student 表，使用下面的写法即可查询数据： scan 'Student' 同样地，还可以指定列族和列的名称，或指定输出行数，甚至指定输出行键范围。 scan 指定条件输出时，需要使用大括号将参数包含起来。 注意指定列族和列名称使用 COLUMN 限定符；指定输出行键范围使用 STARTROW 和 ENDROW 限定符，此时输出行不包括 ENDROW 行。例如，上图中 ENDROW=>0003，只会输出行键为 0002 的记录，不会输出 0003 记录。 上述限定条件也可以联合使用，中间用逗号隔开即可。 在 HBase 中，具有相同行键的单元格，无论其属于哪个列族，都可以将整体看作一个逻辑行， 使用 count 命令可以计算表的逻辑行数。 在关系型数据库中，有多少条记录就有多少行，表中的行数很容易统计。而在 HBase 里，计算逻辑行需要扫描全表的内容，重复的行键是不纳入计数的，且标记为 tombstone 的删除数据也不纳入计数。 执行 count 命令其实是一个开销较大的进程，特别是应用在大数据场景时，可能需要持续很长时间，因此，用户一般会结合 Hadoop 的 MapReduce 架构来进行分布式的扫描计数。 二、详解 hbase 中 scan 命令是经常使用到的，而 filter 的作用尤其强大。这里简要的介绍下 scan 下 filter 命令的使用。 2.1、插入 scan 命令需要的数据 这里模拟了部分微博评论的数据，然后使用代码插入数据到 hbase。 public class Comment { //1-->普通文章，2--->热点文章 Integer articleType; //文章id String articleId; String userId; long timestamp; //comment content,暂时只考虑文本 String commentContent; } hbase 的表名称为 zy_comment，列簇info下有 articleType 以及 commentInfo 两个列。commentInfo 的 value 为上面Comment 类的 json 字符串，插入的数据如下所示。 2.2、HBase数据顺序 HBase是三维有序存储的，是指 rowkey（行键），column key（column family和qualifier）和 TimeStamp（时间戳）这个三个维度是依照 ASCII 码表排序的。（比如A排在a前面）。 1、先 rowkey 升序排序， 2、rowkey 相同则 column key 升序排序 3、rowkey、column key 相同则 timestamp 降序排序 2.3、支持的Filter scan 命令经常会大量使用 Filter，hbase shell 提供的 filter 都可以在 hbase client 包中找到对应的类，它们都是 Filter 的子类，很多命令都是通过 filter 来进行实现的。 使用 show_filters 命令查看 shell 中定义了哪些 filter 常量，如果想要使用 shell 中未定义的常量，在使用的时候必须手动 import filter 的全路径。 2.4、scan 的用法 使用 help 'scan' 命令可以查看 scan 的语法以及用法，关于 scan 命令中 filter 的使用规则如下: scan 'tableName',{FILTER=>"FilterName(param1,param2,...,paramN)"} {}中的语法是 ruby 的 map 的语法，FILTER 必须大写，filter 的参数是根据构造方法来的，也就是相当于 java 中的 new Filter(‘param1’,‘param2’) 等，这里只是省略了 new 参数而已。 当然同样可以使用 ruby 中 new 对象的方式，只是那样就必须使用全限定名称。后面会举一个全限定名称的例子。 在使用Filter的过程中部分filter会用到比较器 CompareOperator.java 以及运算比较符 ByteArrayComparable.java。 @Public public enum CompareOperator { LESS, // < LESS_OR_EQUAL, // <= EQUAL, // = NOT_EQUAL, // <> GREATER_OR_EQUAL, // >= GREATER, // > NO_OP; // 没有任何操作 private CompareOperator() …

HBase Shell 命令大全
type: item
date: 2022-10-01T13:10:00+00:00
description: 一、简介 HBase 的名字的来源于 Hadoop database，即 hadoop 数据库，不同于一般的关系数据库，它是非结构化数据存储的数据库，而且它是基于列的而不是基于行的模式。 HBase 是一个分布式的、面向列的、基于 Google Bigtable 的开源实现。 利用 Hadoop HDFS 作为其文件存储系统，利用 Hadoop MapReduce 来处理HBase中的海量数据，利用Zookeeper作为协同服务。 二、HBase重要概念 HBase 的表结构 HBase 以表的形式存储数据。表有行和列组成。列划分为若干个列族/列簇(column family)，每个列族/列簇下面可以有多个普通列。 表 Table HBase 是用表来存储数据的。 命名空间 namespace namespace 命名空间指对一组表的逻辑分组，类似 RDBMS 中的 database，方便对表在业务上划分。 HBase 系统默认定义了两个缺省的 namespace： hbase：系统内建表，包含 namespace 和 meta 表。 default：用户建表时未指定 namespace 的表都创建在此。 行键 Row Key 行键，每一行的主键列，每行的行键要唯一，行键的值为任意字符串(最大长度是 64KB，实际应用中长度一般为 10-100bytes)，在 HBase 内部，rowKey 保存为字节数组 byte[]。行的一次读写是原子操作 (不论一次读写多少列)。 区域 Region Table在行的方向上分割为多个Region。 Region是按大小分割的，每个表开始只有一个region，随着数据的增多，region不断增大，当增大到一个阀值的时候，region就会等分为两个新的region,之后会有越来越多的region。 Region是HBase中分布式存储和负载均衡的最小单元。不同的Region分布到不同的RegionServer上。 Region由一个或者多个Store组成, 每个Store保存一个column family, 每个Store又由一个MemStore(存储在内存中)和0到多个StoreFile(存储在HDFS上)组成。 列族 column family 列族是每个子列的父级，每个子列都属于一个列族，一个列族包含一个或者多个相关列，创建表的时候需要指定列族，而列不需要必须指定。通过 列族名:列名 来表示某个具体的子列。HBase 中的 Schema 就是 TableName + Column Family Name。 列限定符 就是列族下的每个子列名称，或者称为相关列，或者称为限定符，只是翻译不同。 通过 columnFamily:column 来定位某个子列。 存储单元 cell 外观看到的每个单元格其实都对应着多个存储单元，默认情况下一个单元格对应着一个存储单元，一个存储单元可以存储一份数据，如果一个单元格有多个存储单元就表示一个单元格可以存储多个值。可以通过 version 来设置存储单元个数。可以通过 rowKey + columnFamily + column + timestamp来唯一确定一个存储单元。cell 中的数据是没有类型的，全部是字节码形式存贮。 hbase 按照时间戳降序排列各时间版本，其他映射建按照升序排序。 时间戳版本号 timestamp 每个 cell 都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由 hbase(在数据写入时自动 )赋值，此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突，就必须自己生成具有唯一性的时间戳。每个 cell 中，不同版本的数据按照时间倒序排序，即最新的数据排在最前面。 为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担，hbase提供了两种数据版本回收方式。一是保存数据的最后 n 个版本，二是保存最近一段时间内的版本（比如最近七天）。用户可以针对每个列族进行设置。 三、HBase Shell help 查看命令的使用描述，help ‘命令名’ whoami 我是谁，whoami version 返回 hbase 版本信息，version status 返回 hbase 集群的状态信息，status table_help 查看如何操作表，table_help create 创建表，create ‘表名’, ‘列族名1’, ‘列族名2’, ‘列族名N’ alter 修改列族，添加一个列族：alter ‘表名’, ‘列族名’ 删除列族：alter ‘表名’, {NAME=> ‘列族名’, METHOD=> ‘delete’} describ…

DataGrip 连接 Phoenix
type: item
date: 2022-09-09T14:03:00+00:00
description: 1、DataGrip新建驱动 2、新建数据源

HBase 与 Hive 的集成
type: item
date: 2022-02-27T13:52:00+00:00
description: 一、使用场景 如果大量的数据已经存放在 HBase 上面，需要对已经存在的数据进行数据分析处理，那么 Phoenix 并不适合做特别复杂的 SQL 处理，此时可以使用 hive 映射 HBase 的表格，之后写 HQL 进行分析处理。 二、HBase 与 Hive 集成使用 在 hive-site.xml 中添加 zookeeper 的属性，如下： <property> <name>hive.zookeeper.quorum</name> <value>hadoop102,hadoop103,hadoop104</value> </property> <property> <name>hive.zookeeper.client.port</name> <value>2181</value> </property> 2.1、案例一 目标：建立 Hive 表，关联 HBase 表，插入数据到 Hive 表的同时能够影响 HBase 表。 分步实现： （1）在 Hive 中创建表同时关联 HBase。 CREATE TABLE hive_hbase_emp_table( empno int, ename string, job string, mgr int, hiredate string, sal double, comm double, deptno int ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:co mm,info:deptno") TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table"); 提示：完成之后，可以分别进入 Hive 和 HBase 查看，都生成了对应的表。 （2）在 Hive 中创建临时中间表，用于 load 文件中的数据。 提示：不能将数据直接 load 进 Hive 所关联 HBase 的那张表中。 CREATE TABLE emp( empno int, ename string, job string, mgr int, hiredate string, sal double, comm double, deptno int ) row format delimited fields terminated by '\t'; （3）向 Hive 中间表中 load 数据。 hive> load data local inpath '/opt/software/emp.txt' into table emp; （4）通过 insert 命令将中间表中的数据导入到 Hive 关联 Hbase 的那张表中。 hive> insert into table hive_hbase_emp_table select * from emp; （5）查看 Hive 以及关联的 HBase 表中是否已经成功的同步插入了数据。 Hive： hive> select * from hive_hbase_emp_table; HBase： Hbase> scan 'hbase_emp_table' 2.2、案例二 目标：在 HBase 中已经存储了某一张表 hbase_emp_table，然后在 Hive 中创建一个外部表来关联 HBase 中的 hbase_emp_table 这张表，使之可以借助 Hive 来分析 HBase 这张表中的数据。 注：该案例 2 紧跟案例 1 的脚步，所以完成此案例前，请先完成案例 1。 分步实现： （1）在 Hive 中创建外部表。 CREATE EXTERNAL TABLE relevance_hbase_emp( empno int, ename string, job string, mgr int, hiredate string, sal double, comm double, deptno int ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:co mm,info:deptno") TBLPROPERTIES ("hbase.…

Phoenix
type: item
date: 2022-02-27T10:19:00+00:00
description: 六、整合Phoenix 6.1、Phoenix 简介 6.1.1、Phoenix 定义 Phoenix 是 HBase 的开源 SQL 皮肤。可以使用标准 JDBC API 代替 HBase 客户端 API来创建表，插入数据和查询 HBase 数据。 6.1.2、为什么使用 Phoenix 官方给的解释为：在 Client 和 HBase 之间放一个 Phoenix 中间层不会减慢速度，因为用户编写的数据处理代码和 Phoenix 编写的没有区别（更不用说你写的垃圾的多），不仅如此Phoenix 对于用户输入的 SQL 同样会有大量的优化手段（就像 hive 自带 sql 优化器一样）。 Phoenix 在 5.0 版本默认提供有两种客户端使用瘦客户端和胖客户端，在 5.1.2 版本安装包中删除了瘦客户端，本文也不再使用瘦客户端。而胖客户端和用户自己写 HBase 的 API 代码读取数据之后进行数据处理是完全一样的。 6.2、Phoenix 快速入门 6.2.1、安装 1）官网地址 http://phoenix.apache.org/ 2）Phoenix 部署 （1）上传并解压 tar 包 [atguigu@hadoop102 software]$ tar -zxvf phoenix-hbase-2.4-5.1.2-bin.tar.gz -C /opt/module/ [atguigu@hadoop102 module]$ mv phoenix-hbase-2.4-5.1.2-bin/ phoenix （2）复制 server 包并拷贝到各个节点的 hbase/lib [atguigu@hadoop102 module]$ cd /opt/module/phoenix/ [atguigu@hadoop102 phoenix]$ cp phoenix-server-hbase-2.4-5.1.2.jar /opt/module/hbase/lib/ [atguigu@hadoop102 phoenix]$ xsync /opt/module/hbase/lib/ phoenixserver-hbase-2.4-5.1.2.jar （3）配置环境变量 sudo vim /etc/profile.d/my_env.sh #phoenix export PHOENIX_HOME=/opt/module/phoenix export PHOENIX_CLASSPATH=$PHOENIX_HOME export PATH=$PATH:$PHOENIX_HOME/bin source /etc/profile.d/my_env.sh （4）重启 HBase [atguigu@hadoop102 ~]$ stop-hbase.sh [atguigu@hadoop102 ~]$ start-hbase.sh （5）连接 Phoenix [atguigu@hadoop101 phoenix]$ /opt/module/phoenix/bin/sqlline.py hadoop102,hadoop103,hadoop104:2181 （6）错误解决 出现下面错误的原因是之前使用过 phoenix，建议删除之前的记录 警告: Failed to load history java.lang.IllegalArgumentException: Bad history file syntax! The history file /home/atguigu/.sqlline/history may be an older history: please remove it or use a different history file. 解决方法：在 /home/atguigu 目录下删除.sqlline文件夹 [atguigu@hadoop102 ~]$ rm -rf .sqlline/ 6.2.2、Phoenix Shell 操作 6.2.2.1、table 关于 Phoenix 的语法建议使用时直接查看官网： https://phoenix.apache.org/language/index.html 1）显示所有表 !table 或 !tables 2）创建表 直接指定单个列作为 RowKey CREATE TABLE IF NOT EXISTS student( id VARCHAR primary key, name VARCHAR, age BIGINT, addr VARCHAR); 在 phoenix 中，表名等会自动转换为大写，若要小写，使用双引号，如"us_population"。 指定多个列的联合作为 RowKey CREATE …

HBase 进阶&优化
type: item
date: 2022-02-27T09:47:00+00:00
description: 四、HBase进阶 4.1、Master 架构 Master 主要进程，具体实现类为 HMaster，通常部署在 namenode 上。 1）Meta 表格介绍：(警告：不要去改这个表) 全称 hbase:meta，只是在 list 命令中被过滤掉了，本质上和 HBase 的其他表格一样。 RowKey： ([table],[region start key],[region id]) 即表名，region 起始位置和 regionID。 列： info:regioninfo 为 region 信息，存储一个 HRegionInfo 对象。 info:server 当前 region 所处的 RegionServer 信息，包含端口号。 info:serverstartcode 当前 region 被分到 RegionServer 的起始时间。 如果一个表处于切分的过程中，即 region 切分，还会多出两列 info:splitA 和 info:splitB，存储值也是 HRegionInfo 对象，拆分结束后，删除这两列。 注意：在客户端对元数据进行操作的时候才会连接 master，如果对数据进行读写，直接连接 zookeeper 读取目录/hbase/meta-region-server 节点信息，会记录 meta 表格的位置。直接读取即可，不需要访问 master，这样可以减轻 master 的压力，相当于 master 专注 meta 表的写操作，客户端可直接读取 meta 表。 在 HBase 的 2.3 版本更新了一种新模式：Master Registry。客户端可以访问 master 来读取 meta 表信息。加大了 master 的压力，减轻了 zookeeper 的压力。 4.2、RegionServer 架构 主要进程，具体实现类为 HRegionServer。通常部署在 dataNode 上。 除了主要的组件，还会启动多个线程监控一些必要的服务： 1、Region 拆分 2、Region 合并 3、MemStory 刷写 4、WAL 预写日志滚动 1、MemStore 写缓存，由于 HFile 中的数据要求是有序的，所以数据是先存储在 MemStore 中，排好序后，等到达刷写时机才会刷写到 HFile，每次刷写都会形成一个新的 HFile，写入到对应的文件夹 store 中。 2、WAL 由于数据要经 MemStore 排序后才能刷写到 HFile，但把数据保存在内存中会有很高的概率导致数据丢失，为了解决这个问题，数据会先写在一个叫做 Write-Ahead logfile 的文件中，然后再写入 MemStore 中。所以在系统出现故障的时候，数据可以通过这个日志文件重建。 3、BlockCache 读缓存，每次查询出的数据会缓存在 BlockCache 中，方便下次查询。 4.3、写流程 写流程顺序正如 API 编写顺序，首先创建 HBase 的重量级连接。 （1）首先访问 zookeeper，获取 hbase:meta 表位于哪个 Region Server （2）访问对应的 Region Server，获取 hbase:meta 表，将其缓存到连接中，作为连接属性 MetaCache，由于 Meta 表格具有一定的数据量，导致了创建连接比较慢； 之后使用创建的连接获取 Table，这是一个轻量级的连接，只有在第一次创建的时候会检查表格是否存在访问 RegionServer，之后在获取 Table 时不会访问 RegionServer； （3）调用 Table 的 put 方法写入数据，此时还需要解析 RowKey，对照缓存的 MetaCache，查看具体写入的位置有哪个 RegionServer； （4）将数据顺序写入（追加）到 WAL，此处写入是直接落盘的，并设置专门的线程控制 WAL 预写日志的滚动（类似 Flume）； （5）根据写入命令的 RowKey 和 ColumnFamily 查看具体写入到哪个 MemStory，并且在 MemStory 中排序； （6）向客户端发送 ack； （7 ）等达到 MemStore 的刷写时机后，将数据刷写到对应的 story 中。 4.4、MemStore Flush MemStore 刷写由多个线程控制，条件互相独立： 主要的刷写规则是控制刷写文件的大小，在每一个刷写线程中都会进行监控 （1）当某个 memstroe 的大小达到了 hbase.hregion.memstore.flush.size（默认值 128M），其所在 region 的所有 memstore 都会刷写。 当 memstore 的大小达到了 hbase.hregion.mems…

HBase 简介&入门
type: item
date: 2022-02-26T16:52:00+00:00
description: 一、HBase简介 1.1、HBase 定义 Apache HBase 是以 HDFS 为数据存储的，一种分布式、可扩展的 NoSQL 数据库。 1.2、HBase 数据模型 HBase 的设计理念依据 Google 的 BigTable 论文，论文中对于数据模型的首句介绍。 Bigtable 是一个稀疏的、分布式的、持久的多维排序 map。 之后对于映射的解释如下： 该映射由行键、列键和时间戳索引；映射中的每个值都是一个未解释的字节数组。 最终 HBase 关于数据模型和 BigTable 的对应关系如下： HBase 使用与 Bigtable 非常相似的数据模型。用户将数据行存储在带标签的表中。数据行具有可排序的键和任意数量的列。该表存储稀疏，因此如果用户喜欢，同一表中的行可以具有疯狂变化的列。 最终理解 HBase 数据模型的关键在于稀疏、分布式、多维、排序的映射。其中映射 map指代非关系型数据库的 key-Value 结构。 1.2.1、HBase 逻辑结构 HBase 可以用于存储多种结构的数据，以 JSON 为例，存储的数据原貌为： { "row_key1":{ "personal_info":{ "name":"zhangsan", "city":"北京", "phone":"131********" }, "office_info":{ "tel":"010-1111111", "address":"atguigu" } }, "row_key11":{ "personal_info":{ "city":"上海", "phone":"132********" }, "office_info":{ "tel":"010-1111111" } } } HBase 逻辑结构： 存储数据稀疏，数据存储多维，不同的行具有不同的列。 数据存储整体有序，按照 RowKey 的字典序排列，RowKey 为 Byte 数组。 1.2.2、HBase 物理存储结构 物理存储结构即为数据映射关系，而在概念视图的空单元格，底层实际根本不存储。 1.2.3、数据模型 1、Name Space 命名空间，类似于关系型数据库的 database 概念，每个命名空间下有多个表。HBase 两个自带的命名空间，分别是 hbase 和 default，hbase 中存放的是 HBase 内置的表，default 是用户默认使用的命名空间。 2、Table 类似于关系型数据库的表概念。不同的是，HBase 定义表时只需要声明列族即可，不需要声明具体的列。因为数据存储时稀疏的，所有往 HBase 写入数据时，字段可以动态、按需指定。因此，和关系型数据库相比，HBase 能够轻松应对字段变更的场景。 3、Row HBase 表中的每行数据都由一个 RowKey 和多个 Column（列）组成，数据是按照 RowKey 的字典顺序存储的，并且查询数据时只能根据 RowKey 进行检索，所以 RowKey 的设计十分重要。 4、Column HBase 中的每个列都由 Column Family(列族)和 Column Qualifier（列限定符）进行限定，例如 info：name , info：age。建表时，只需指明列族，而列限定符无需预先定义。 5、TimeStamp 用于标识数据的不同版本（version），每条数据写入时，系统会自动为其加上该字段，其值为写入 HBase 的时间。 6、Cell 由{rowkey, column Family：column Qualifier, timestamp} 唯一确定的单元。cell 中的数据全部是字节码形式存贮。 1.3、HBase 基本架构 Master 主要进程，具体实现类为 HMaster，通常部署在namenode上。 功能：负责通过 ZK 监控 RegionServer 进程状态，同时是所有元数据变化的接口。内部启动监控执行 region 的故障转移和拆分的线程。 RegionServer 主要进程，具体实现类为 HRegionServer，部署在datanode上。 功能：主要负责数据 cell 的处理。同时在执行区域的拆分和合并的时候， 由 RegionServer 来实际执行。 架构角色： 1.3.1、Master 实现类为 HMaster，负责监控集群中所有的 RegionServer 实例。主要作用如下： （1）管理元数据表格 hbase:meta，接收用户对表格创建修改删除的命令并执行。 （2）监控 region 是否需要进行负载均衡，故障转移和 region 的拆分。 通过启动多个后台线程监控实现上述功能： 1、LoadBalancer 负载均衡器 周期性监控 region 分…