0


第1关:HBase Shell 操作:分区压缩

任务描述

本关任务:在

HBase Shell

中使用分区压缩命令并将查看到的命令结果复制到指定的文件中。

相关知识

为了完成本关任务,你需要掌握:

1.数据分区压缩的概念;

2.数据分区压缩的原因;

3.数据分区压缩的过程;

4.数据分区压缩的触发时机;

5.数据分区压缩的详解。

数据分区压缩的概念

数据分区压缩的概念如下所述:

Hbase 中 MemStore 中不断进行 flush 刷写操作,就会产生多个 storeFile 的文件,当 storeFile 文件达到一定阈值后,Hbase 就会将 Region 中的 Store 中的一些 HFile 进行合并。

数据分区压缩的原因

数据分区压缩的原因如下所述:

HBase 不停的刷写,导致存储目录中有过多的数据文件,文件太多会导致维护困难、降低数据查询性能和效率。对一堆的文件进行 I/O 操作,耗时太多。所以 HBase 定期会对这些琐碎的文件进行整理,即合并 Compaction。

数据分区压缩的过程

数据分区压缩的过程分为以下几步:

排序文件、合并文件、代替原文件服务。HBase 首先从待合并的文件中读出 HFile 中的

key-value

,再按照由小到大的顺序写入一个新文件(storeFile)中。这个新文件将代替所有之前的文件,对外提供服务。

数据分区压缩的触发时机

数据分区压缩的触发时机有如下几点:

  1. MEMStore Flush

内存中的数据 Flush 刷写到硬盘上以后,会对当前 Store 中的文件进行判断,当数量达到阈值,则会触发 Compaction。 Compaction 是以 Store 为单位进行合并的。当 Flush 刷写完成后,整个 Region 的所有 Store 都会执行 Flush。

  1. 后台线程周期性的检查
Compaction Checker

线程定期检查是否触发

Compaction Checker

会优先检查文件数量是否大于阈值,再判断是否满足

Major Compaction

的条件的时间范围内,如果满足,则触发一次大合并

Major Compaction

  1. 手动触发
  • 由于很多业务担心 MajorCompaction 影响读写性能,所以选择在低峰期手动触发合并。
  • 当用户修改表结构后,希望立刻生效,则手动触发合并。
  • 运维人员发现硬盘空间不够,则会手动触发合并,因为删除了过期数据,腾出空间。
数据分区压缩的详解

数据分区压缩的分为以下两类:

Minor Compaction(小合并):小合并是指将相邻的 StoreFile 合并为更大的 StoreFile(默认 HFile 达到 3 个及以上)。

Major Compaction(大合并):大合并是将多个 StoreFile 合并为一个 StoreFile(默认超过 7 天触发)。

这两种 Compaction 方式的区别是:

  1. Minor 操作只用来做部分文件的合并操作以及包括minVersion=0并且设置 TTL 的过期版本清理,不做任何删除数据、多版本数据的清理工作。
  2. Major 操作是对 Region 下的 HStore 下的所有 StoreFile 执行合并操作,最终的结果是整理合并出一个文件。

两种 Compaction 的使用语法为:

在 HBase Shell 上操作:

  1. major_compact/Minor_compact 'table_name'

在 Java API 上配置:

  1. import org.apache.hadoop.conf.Configuration;
  2. import org.apache.hadoop.hbase.HBaseConfiguration;
  3. import org.apache.hadoop.hbase.TableName;
  4. import org.apache.hadoop.hbase.client.Admin;
  5. import org.apache.hadoop.hbase.client.Connection;
  6. import org.apache.hadoop.hbase.client.ConnectionFactory;
  7. import java.io.IOException;
  8. /**
  9. * majorCompact
  10. */
  11. public class MajorCompact {
  12. public static void main(String[] args) throws IOException {
  13. String[] tableList = {"tablename1","tablename2"};
  14. Configuration conf = HBaseConfiguration.create();
  15. conf.set("hbase.zookeeper.quorum", "hadoop101,hadoop102,hadoop103");
  16. Connection connection = ConnectionFactory.createConnection(conf);
  17. Admin admin = connection.getAdmin();
  18. for (String table : tableList) {
  19. TableName table_name = TableName.valueOf(table);
  20. if (admin.tableExists(table_name)) {
  21. admin.majorCompact(table_name);
  22. }
  23. }
  24. admin.close();
  25. connection.close();
  26. }
  27. }

编程要求

请根据左侧知识点的描述,在右侧图形化界面中的终端中使用

HBase Shell

(在使用 HBase Shell 之前别忘了开启 Hadoop 集群和 Zookeeper 集群)的分区压缩命令并将结果按要求复制到

/opt/answer

(answer 文件需要自己创建)文件下。

具体自动拆分配置要求如下所述:

要求创建的表名为:

stu

;

要求创建的列族为:

info

;

要求使用的分区压缩命令为:

major_compact

HBase Shell 中操作示例步骤如下:

  1. 创建表:
  2. create 'test','f1'
  3. 每 put 一条数据 flush 刷写一次:
  4. put 'test','12154646','f1:sex','w'
  5. flush 'test'
  6. 最后执行命令:
  7. major_compact 'test'

使用合并时考虑数据一致性,不会马上删掉数据,可以在使用压缩命令之前在 Linux 命令行使用

hdfs dfs -ls

来查看以下的目录:

  1. hdfs dfs -ls /hbase/data/default/表名/xxxxxxxxxx(一长串数字)/列族名

可以查看到如下图所示:

Kafka logo

使用 major_compact 命令一段时间后可以看到如下图所示:

Kafka logo

对于最后结果复制具体操作为在 Linux 命令行中输入以下命令:

  1. 进入 HBase 安装目录:
  2. cd /app/hbase
  3. 查看 Hdfs 上合并之后的具体内容可以使用 HFile 命令,并将结果输入到/opt/answer:
  4. bin/hbase org.apache.hadoop.hbase.io.hfile.HFile -p -f /hbase/data/default/stu/xxxxxxxxxx(一长串数字)/info/xxxxxxxxxx(一长串数字) > /opt/answer

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,达到编程要求即会通过。


开始你的任务吧,祝你成功!

命令行:
root@educoder:~# start-all.sh

root@educoder:~# zkServer.sh start

root@educoder:~# cd /opt
root@educoder:/opt# touch answer
root@educoder:/opt# cd
root@educoder:~# start-hbase.sh

root@educoder:~# hbase shell

hbase(main):001:0> create 'stu','info'
0 row(s) in 2.5330 seconds

=> Hbase::Table - stu

///因为测试要求是Scanned kv count -> 4 显示4个键值对 所以创建4个

hbase(main):002:0> put 'stu','1','info:a','a'
0 row(s) in 0.0750 seconds

hbase(main):003:0> put 'stu','2','info:b','b'
0 row(s) in 0.0080 seconds

hbase(main):004:0> put 'stu','3','info:c','c'
0 row(s) in 0.0080 seconds

hbase(main):005:0> put 'stu','4','info:d','d'
0 row(s) in 0.0080 seconds

hbase(main):006:0> flush 'stu'
0 row(s) in 0.2920 seconds

hbase(main):007:0> major_compact 'stu'
0 row(s) in 0.0330 seconds

root@educoder:~# hdfs dfs -ls /hbase/data/default/stu

Found 3 items
drwxr-xr-x   - root supergroup          0 2024-03-26 13:48 /hbase/data/default/stu/.tabledesc
drwxr-xr-x   - root supergroup          0 2024-03-26 13:48 /hbase/data/default/stu/.tmp
drwxr-xr-x   - root supergroup          0 2024-03-26 13:51 /hbase/data/default/stu/8bd07c6adfb5b889ef0db31758b8a86c

stu后面这里显示的是我自己的 不要复制我的

///寻找另一个长数字

root@educoder:~# hdfs dfs -ls /hbase/data/default/stu/8bd07c6adfb5b889ef0db31758b8a86c/info

Found 1 items
-rw-r--r--   1 root supergroup       5043 2024-03-26 13:51 /hbase/data/default/stu/8bd07c6adfb5b889ef0db31758b8a86c/info/adbadaf001c749a494f9c5a6df369740
///两个长段数字都找到了

root@educoder:~# cd /app/hbase
root@educoder:/app/hbase# bin/hbase org.apache.hadoop.hbase.io.hfile.HFile -p -f /hbase/data/default/stu/8bd07c6adfb5b889ef0db31758b8a86c/info/adbadaf001c749a494f9c5a6df369740 > /opt/answer

本文转载自: https://blog.csdn.net/Yanysykkk/article/details/137059188
版权归原作者 dream colorful 所有, 如有侵权,请联系我们删除。

“第1关:HBase Shell 操作:分区压缩”的评论:

还没有评论