--- HBase学习笔记 (叁)- HBase进阶

news/2023/12/1 7:49:24

文章目录

    • Hbase概念
      • Hbase数据存储过程·
      • compaction分两种:
      • compact促发条件:
    • Hbase优化策略
      • hbase优化
      • HBase优化策略一:服务端优化策略
      • HBase优化策略二:常用优化策略
      • HBase优化策略三:读写优化策略
  • HBase协处理器简介
  • HBase实战:开发RegionObserver协处理器
  • HBase实战:HBase协处理器加载

什么导致hbase性能下降?

  • jvm内存分配与gc回收策略
  • 与hbase运行机制相关的部分配置不合理
  • 表结构设计及用户使用方式不合理

Hbase概念

Hbase数据存储过程·

  • Hbase写入时当memstore达到一定的大小会flush到磁盘保存成 HFile, 当hfile小文件太多会执行compact操作进行合并。(当一个hstore里只包含一个hfile时;查询效率才是最大化。因为hfile小文件过多会影响查询时长,合并后才可以提高查询效率。)
  • 当region的大小达到某一阈值之后, 会执行split操作

compaction分两种:

  • Minor compaction: 选取一些小的 、 相邻的storefile将他们合并成一个更大的storefile
  • Major compaction: 将所有的storefile合并成一个storefile, 清理无意义数据、被删除的数据、ttl过期数据 、 版本号超过设定版本号的数据;资源消耗最大。
  • Split: 当一个region达到一定的大小就会自动split成两个region

compact促发条件:

  • Memstore被flush到磁盘,
  • 用户执行shell命令compact, Major_compact 或者调用了相应的api
  • Hbase后台线程周期性触发检查

Hbase优化策略

hbase优化

  • 常见服务端配置优化
  • 常用优化策略 (以实际需求为主)
  • Hbase读/写性能优化

HBase优化策略一:服务端优化策略

  • Jvm设置与gc设置
  • hbase-site. xml 部分属性配置
    max.filesize默认10G;
    majorcompaction默认1天建议0,通过手动合并,因为需要用到很长时间;
    min默认3;
    在这里插入图片描述
    cache.size在偏向读的业务当中可以适当调大一些。
    flush.size可以设置大一点;
    block.multiplier建议设置成5;如果太大会有内存溢出的危险。
    在这里插入图片描述
    (hbase.hstore.blockingStoreFiles:默认为7,如果任何一个store(非.META.表里的store)的storefile的文件数大于该值,则在flush memstore前先进行split或者compact,同时把该region添加到flushQueue,延时刷新,这期间会阻塞写操作直到compact完成或者超过hbase.hstore.blockingWaitTime(默认90s)配置的时间,可以设置为30,避免memstore不及时flush。当regionserver运行日志中出现大量的“Region <regionName> has too many store files; delaying flush up to 90000ms"时,说明这个值需要调整了)

HBase优化策略二:常用优化策略

HBase常优用化
-预先分区 -RowKey优化 -Column优化 -Schema优化

  • 预先分区
    • 创建hbase表的时候会自动创建一个region分区(hbase默认建一个regionserver上建region;后期数据大会分为两个region)
    • 创建hbase表的时候预先创建一些空的regions(减少io操作;通过预先分区;解决数据倾斜问题;将频繁访问的数据放到多个region中;将不常访问的分区放到一个或几个region中)
  • Rowkey优化
    • 利用hbase默认排序特点, 将一起访问的数据放到一起
    • 防止热点问题(大量的client集中访问一个节点), 避免使用时序或者单调的递增递减等
  • Column优化
    • 列族的名称和列的描述命名尽量简短(过长会占据内存空间)
    • 同一张表中columnfamily的数量不要超过 3 个
  • Schema优化
    • 宽表: 一种 “列多行少” 的设计(事物性能好;hbase的事物建立在行的基础上的;行少插入的时候可以有很好的保障)
    • 高表: 一种 “列少行多” 的设计(查询性能好;查询的条件放入rowkey中我们可以缓存更多的行;元数据来讲开销大因为行多rowkey多)
      hbase主要在于不必苛刻设计于哪种;主要取决于业务。

HBase优化策略三:读写优化策略

  • Hbase写优化策略
    • 同步批量提交or异步批量提交
    • WAL优化, 是否必须, 持久化等级

默认时同步提交数据的;异步提交是可能丢失一些数据的;在业允许的情况下可以开启。

WAL默认是开启的;一方面确保数据缓存丢失了也可以数据恢复;另一方面是为了集群间的异步复制;更关注写入的吞吐量的时候可以关闭WAL或者采用异步写入。

  • Hbase读优化策略
    • 客户端: Scan缓存设置, 批量获取
    • 服务端: blockcache配置是否合理, Hfile是否过多
    • 表结构的设计问题

在设置scan检索的时候可以设置scan的cache;scan在检索的时候不会一次将数据加载到本地;而是多次rpc请求加载(防止影响其他业务或者数据量大造成内存溢出);cache默认100条大小设置的大一点可以减少rpc的请求数据次数。

查询数据的时候blockcache如果不能命中;还要去Hfile里拉取数据。
Hfile不能过多;过多会导致查询缓慢;需要compact合并。

HBase协处理器简介

  • HBase coprocessor
    • Hbase协处理器受bigtable协处理器的启发, 为用户提供类库和运行时环境, 使得代码能够在hbase regionserver和master上处理
    • 系统协处理器and表协处理器(coprocessor分为两类协处理器)
    • Observer and Endpoint(HBase 提供的coprocessor插件)
    • 系统协处理器: 全局加载到regionserver托管的所有表和region上(针对整个集群)
    • 表协处理器: 用户可以指定一张表使用协处理器(针对单张表)
    • 观察者 (Observer): 类似于关系数据库的触发器
    • 终端 (Endpoint): 动态的终端有点像存储过程
  • Observer
    • Regionobserver: 提供客户端的数据操纵事件钩子: Get, Put,Delete, Scan等
    • Masterobserver: 提供DDL类型的操作钩子。如创建、删除修改数据表等
    • Walobserver: 提供wal相关操作钩子
  • Observer应用场景
    • 安全性: 例如执行get或put操作前, 通过preget或preput方法检查, 是否允许该操作
    • 引用完整性约束: hbase并不支持关系型数据库中的引用完整性约束概念, 即通常所说的外键;我们可以使用协处理器增强这种约束
  • Endpoint
    • endpoint是动态rpc插件的接口, 它的实现代码被安装在服务器端, 从而能够通过hbase Rpc唤醒
    • 调用接口, 它们的实现代码会被目标regionserver远程执行·
    • 典型的案例: 一个大table有几百个region, 需要计算某列的平均值或者总和

HBase实战:开发RegionObserver协处理器

◆实现一个endpoint类型的协处理器

  • 待整理

◆实现一个regionobserver类型的协处理器

package com.kun.hbase;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CoprocessorEnvironment;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Durability;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver;
import org.apache.hadoop.hbase.coprocessor.ObserverContext;
import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
import org.apache.hadoop.hbase.util.Bytes;



/**
 * Created by jixin on 18-2-25.
 */
public class RegionObserverTest extends BaseRegionObserver {

  private byte[] columnFamily = Bytes.toBytes("cf");
  private byte[] countCol = Bytes.toBytes("countCol");
  private byte[] unDeleteCol = Bytes.toBytes("unDeleteCol");
  private RegionCoprocessorEnvironment environment;

  //regionserver 打开region前执行
  @Override
  public void start(CoprocessorEnvironment e) throws IOException {
    environment = (RegionCoprocessorEnvironment) e;
  }

  //RegionServer关闭region前调用
  @Override
  public void stop(CoprocessorEnvironment e) throws IOException {

  }

  /**
   * 需求一
   * 1. cf:countCol 进行累加操作。 每次插入的时候都要与之前的值进行相加
   * 需要重载prePut方法
   */

  @Override
  public void prePut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit,
      Durability durability) throws IOException {
    if (put.has(columnFamily, countCol)) {//获取old countcol value
      Result rs = e.getEnvironment().getRegion().get(new Get(put.getRow()));
      int oldNum = 0;
      for (Cell cell : rs.rawCells()) {
        if (CellUtil.matchingColumn(cell, columnFamily, countCol)) {
          oldNum = Integer.valueOf(Bytes.toString(CellUtil.cloneValue(cell)));
        }
      }

      //获取new countcol value
      List<Cell> cells = put.get(columnFamily, countCol);
      int newNum = 0;
      for (Cell cell : cells) {
        if (CellUtil.matchingColumn(cell, columnFamily, countCol)) {
          newNum = Integer.valueOf(Bytes.toString(CellUtil.cloneValue(cell)));
        }
      }

      //sum AND update Put实例
      put.addColumn(columnFamily, countCol, Bytes.toBytes(String.valueOf(oldNum + newNum)));
    }
  }

  /**
   * 需求二
   * 2. 不能直接删除unDeleteCol    删除countCol的时候将unDeleteCol一同删除
   * 需要重载preDelete方法
   */
  @Override
  public void preDelete(ObserverContext<RegionCoprocessorEnvironment> e, Delete delete,
      WALEdit edit,
      Durability durability) throws IOException {
    //判断是否操作删除了cf列族
    List<Cell> cells = delete.getFamilyCellMap().get(columnFamily);
    if (cells == null || cells.size() == 0) {
      return;
    }

    boolean deleteFlag = false;
    for (Cell cell : cells) {
      byte[] qualifier = CellUtil.cloneQualifier(cell);

      if (Arrays.equals(qualifier, unDeleteCol)) {
        throw new IOException("can not delete unDel column");
      }

      if (Arrays.equals(qualifier, countCol)) {
        deleteFlag = true;
      }
    }

    if (deleteFlag) {
      delete.addColumn(columnFamily, unDeleteCol);
    }
  }

}

HBase实战:HBase协处理器加载

  • 待整理

  • 配置文件加载: 即通过hbase-site. Xml文件配置加载, 一般这样的协处理器是系统级别的.
    在这里插入图片描述
    在这里插入图片描述

  • Shell加载: 可以通过alter命令来对表进行schema修改来加载协处理器

  • shell加载;jar包|全类名|优先级(会自动分配)|协处理器相关参数
    在这里插入图片描述
    首先对regionobserver进行编译 mvn clean install
    上传到hdfs集群中
    测试协处理器
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 通过api代码加载: 即通过api的方式来加载协处理器
    配置文件加载

Hbase卸载/更新协处理器

  • 重复加载的第二个coprocessor实例不会发挥作用
  • 要完成卸载/更新就需要重启JVM, 也就是重启regionserver

http://www.niftyadmin.cn/n/4039445.html

相关文章

一款非混淆软件 for .net 保护

早就知道 remotesoft 公司开发混淆,反编译,和非混淆保护器可惜从来就没有试用版,不知道效果怎样.WebGrid.net 是用 remotesoft.protector 进行保护的.它和MaxtoCode有点类似的是,都需要一个dll作为运行环境.从原理来说,不太一样。兼容性也说不清楚好不好&#xff0c;毕竟没多少…

c# 子窗体向父窗体传值

//父类代码 Form2 frm2 new Form2(); frm2.Owner this; frm2.Show(); //或 frm2.Show(this); //或 frm2.ShowDialog(this); //子类代码 Form1 frm1 (Form1)this.Owner; frm1.textBox1.Text "aaa"; 子窗体关闭时调用父窗体方法: //父类代码 //将子窗口关闭…

SQL SERVER 2005 T_SQL新的特性以及解决并发

一.修改语句的增强UPDATEtest SETtname.WRITE(one hundred and two, 9, 3) WHEREtid 102在2005中增强了update方法&#xff0c;这是修改test表的列tname WRITE方法是把tname这个列中从字符串9开始 把3个长的字符串改为one hundred andtwo二、异常的捕获可以捕获过去会导致批处理…

4种常用Java线程锁的特点,性能比较、使用场景

文章目录多线程的缘由多线程并发面临的问题4种Java线程锁(线程同步)Java线程锁总结多线程的缘由 在出现了进程之后&#xff0c;操作系统的性能得到了大大的提升。虽然进程的出现解决了操作系统的并发问题&#xff0c;但是人们仍然不满足&#xff0c;人们逐渐对实时性有了要求。…

wpf datagrid简单显示数据

1.在XAML代码中写出固定列,绑定数据名称 前台代码: <DataGrid x:Name"DataGrid1" HorizontalAlignment"Left" Margin"10,10,0,0" VerticalAlignment"Top" Height"249" Width"507"><DataGrid.Columns&g…

C# WinForm 程序退出的方法

1.this.Close(); 只是关闭当前窗口&#xff0c;若不是主窗体的话&#xff0c;是无法退出程序的&#xff0c;另外若有托管线程&#xff08;非主线程&#xff09;&#xff0c;也无法干净地退出&#xff1b; 2.Application.Exit(); 强制所有消息中止&#xff0c;退出所有的窗体…

没时间写blog

me:我明天要穿一身黑上班kk:why?me:我心情不好&#xff0c;所以穿深色衣服&#xff0c;电视上不都这么演吗?kk:那不对&#xff0c;心情不好那你更应该穿鲜艳一点的衣服&#xff0c;这样会让自己的心情好一点me:也对哦。于是周一周二两天&#xff0c;我都穿的那两件粉红色的毛…

Linux命令行下如何通过命令查看一个大日志文件中关键字的上下文信息

这是在面试过程中遇到的一个问题&#xff0c;以前总是直接用vi打开文件&#xff0c;然后搜索关键字&#xff0c;这样就能看到上下文信息了&#xff0c;但是这里有明确的规定&#xff0c;大文件&#xff0c;不用VI的情况下如何查看。 一般来说&#xff0c;我们是通过grep命令查…

异步时钟切换电路

两个不相关的时钟频率之间的数字前端异步时钟切换电路异步切换会产生runt脉冲和毛刺使得系统不可靠。下面所示的电路揭示了这些问题的一个解决办法。 当选择&#xff08;SELECT&#xff09;输入稳定的时候&#xff08;或者为高电平或者为低电平&#xff09;&#xff0c;这两个控…

javascript调试经验

在写javascript中总会遇到各种 Error&#xff0c;而且很难调试。chrome 打开console后会自动停止在页面中的javascript异常处。有时候你还是看不到是哪个出现了问题。 最简单的方法就是复制那行代码&#xff0c;在console执行一次就会找到bug所在&#xff01; 转载于:https://w…

小米公司面试题:判断一个单向链表是否有环?

今天去小米面试&#xff0c;面试官最后出了一道算法题&#xff0c;就是判断单向链表中是否有环&#xff1f;如下所示&#xff1a;无环链表和有环链表的区别。 我当时没有想到别的办法&#xff0c;就是说用一个容器HashSet来装遍历的节点&#xff0c;然后判断如果发现容器中包含…

老鼠Atlas之旅(九):Hands-On Lab 5第五个实验,使用数据绑定和模板创建个Atlas应用程序...

这是5系列实验中的最后一个拉&#xff01;&#xff01; 在这个实验里面我们不再使用master&#xff0c;而是做个普通的aspx页面。这是一个标准的aspx页面&#xff0c;我们不需要再在<head>里面包含对客户端脚本库的引用了。这样的一个优势就是使用atlas服务器控件他能够自…

高并发编程系列:NIO、BIO、AIO的区别,及NIO的应用和框架选型

文章目录AIO、BIO、NIO的区别NIO的3个核心概念NIO的应用和框架谈到并发编程就不得不提到NIO&#xff0c;以及相关的Java NIO框架Netty等&#xff0c;并且在很多面试中也经常提到NIO和AIO、同步和异步、阻塞和非阻塞等的区别。我先简短介绍下几个NIO相关的概念&#xff0c;然后再…

sql server获取当前时间到秒级和毫秒级的语句

秒 convert(char(24),getdate(),120) 毫秒 convert(char(24),getdate(),121) 转载于:https://www.cnblogs.com/iamchao/p/3677151.html

protobuf序列化实例(Java实现)

protobuf是google开源的序列化工具&#xff0c;他支持很多语言。这里介绍如何通过protobuf在java中做序列化。首先&#xff0c;我们需要准备protoc编译环境&#xff0c;这个是前提&#xff0c;我们写好了proto文件&#xff0c;当然需要生成对应的java类&#xff0c;这时候&…

MySQL面试50题和答案

1&#xff09;Mysql中有哪几种锁&#xff1f; 1.表级锁&#xff1a;开销小&#xff0c;加锁快&#xff1b;不会出现死锁&#xff1b;锁定粒度大&#xff0c;发生锁冲突的概率最高&#xff0c;并发度最低。 2.行级锁&#xff1a;开销大&#xff0c;加锁慢&#xff1b;会出现死…
最新文章