欢迎光临
第1关:HBase Shell 操作:分区压缩
   

第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(一长串数字)/列族名

    可以查看到如下图所示:

    第1关:HBase Shell 操作:分区压缩,Kafka logo,第1张

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

    第1关:HBase Shell 操作:分区压缩,Kafka logo,第2张

    对于最后结果复制具体操作为在 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
    
     
打赏
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《第1关:HBase Shell 操作:分区压缩》
文章链接:https://goodmancom.com/wl/175929.html