Hbase 的三个应用

Hbase 的三个应用

  1. 分布式自旋锁。
  2. 分布式的唯一序列号
  3. 分布式系统黑名单

分布式自旋锁是一种在分布式系统中用于实现并发控制的锁机制。它通过自旋操作来等待锁的释放,并尝试获取锁,以保证共享资源的访问的一致性和正确性。

以下是一个简单的伪代码示例,用于演示分布式自旋锁的使用:

# 定义一个全局变量,用于表示锁的状态
lock_status = "unlocked"# 尝试获取锁的函数
def acquire_lock():global lock_statuswhile True:if lock_status == "unlocked":# 将锁的状态设置为"locked"lock_status = "locked"return# 释放锁的函数
def release_lock():global lock_statuslock_status = "unlocked"# 在多个节点中同时运行以下代码# 尝试获取锁
acquire_lock()# 执行共享资源的操作
# ...# 释放锁
release_lock()

在上述伪代码中,acquire_lock函数通过自旋操作来等待锁的释放,并在锁可用时获取锁。release_lock函数用于释放锁,将锁状态设置为可用。在多个节点同时运行这段代码时,只有一个节点能够成功获取锁,其他节点会在获取锁失败后进行自旋操作等待。这样就可以保证共享资源的并发访问的一致性。

分布式的唯一序列号是一个在分布式系统中生成全局唯一标识符(GUID)或序列号的机制。它用于确保在分布式环境下生成的标识符是唯一的,以避免冲突和重复。

以下是一个简单的Java伪代码示例,用于演示如何在分布式系统中生成唯一序列号:


// 生成唯一序列号的函数
public static String generateUniqueSequence() {// 使用UUID库生成唯一标识符String uniqueId = distributeUUID.sequence();return uniqueId;
}// 在多个节点中同时运行以下代码// 生成唯一序列号
String uniqueSequence = generateUniqueSequence();// 输出唯一序列号
System.out.println(uniqueSequence);

在上述Java伪代码中,generateUniqueSequence函数使用UUID类来生成一个唯一的标识符,该标识符是基于时间和计算机的唯一性。在多个节点同时运行这段代码时,每个节点都可以生成一个唯一的序列号,以确保生成的序列号在整个分布式系统中是唯一的。

分布式系统黑名单是指在分布式系统中对某些IP地址、用户或其他实体进行限制或拒绝访问的机制。它用于阻止恶意用户或恶意行为对系统的攻击或滥用。

以下是一个简单的使用HBase的checkAndMutate实现分布式系统黑名单功能的伪代码示例:


public void checkAndupdate(String custId){
}

在 checkAndupdate 是一个原子性的,当 custId 存在于 黑名单中,则返回 false , 否则返回 true ,并将 custId 插入到黑名单中。

代码

分布式自旋锁。


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;
import java.util.Scanner;
import java.util.function.Function;/*** @className: DistributeCAS* @Description:* @Author: wangyifei* @Date: 2023/12/31 12:48* get 'distribute_app:hbase_test', 'global_cas'**/
public class DistributeCAS {private static Logger logger = LoggerFactory.getLogger(DistributeCAS.class);private Configuration configuration = HBaseConfiguration.create();private Connection connection;{configuration.set("hbase.master", "server1:16000");try {connection = ConnectionFactory.createConnection(configuration);} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {new DistributeCAS().acquire(new Function<Integer,Integer>(){@Overridepublic Integer apply(Integer integer) {System.out.println("get lock");return 1;}},1);}public void acquire(Function<Integer,Integer> action , Integer input){byte[] tableName = Bytes.toBytes("distribute_app:hbase_test");try {byte[] rowKey = Bytes.toBytes("global_cas");byte[] family = Bytes.toBytes("f1");byte[] qualifier = Bytes.toBytes("cas");byte[] wanted = Bytes.toBytes("0");Table table = connection.getTable(TableName.valueOf(tableName));boolean retry = true ;while(retry){retry = !table.checkAndMutate(rowKey, family).qualifier(qualifier).ifEquals(wanted).thenPut(new Put(rowKey).addColumn(family , qualifier , Bytes.toBytes("1")));logger.info("{} , do not get lock , try again" , Thread.currentThread().getName());}action.apply(input);Scanner scanner = new Scanner(String.valueOf(System.in.read()));table.put(new Put(rowKey).addColumn(family , qualifier, Bytes.toBytes("0")));table.close();} catch (IOException e) {e.printStackTrace();}}
}

上面的代码是一个分布式CAS(CompareAndSet)锁的实现示例。它使用HBase的checkAndMutate方法来实现锁的获取和释放。

概括地描述代码逻辑如下:

  1. 创建HBase的连接和配置对象。
  2. main方法中,创建DistributeCAS对象,并调用acquire方法来获取锁。
  3. acquire方法接收一个函数和一个输入参数,表示锁获取后需要执行的动作和该动作所需的输入。
  4. acquire方法中,设置HBase表的相关信息。
  5. 通过循环使用checkAndMutate方法来尝试获取锁,如果获取失败,则继续循环。
  6. 获取锁后,执行传入的函数。
  7. 锁释放后,用户输入任意字符,然后将锁的状态设置为可用,并关闭HBase的连接。

这段代码的总结如下:

这段代码实现了基于HBase的分布式CAS锁获取和释放的功能。它通过checkAndMutate方法来实现原子操作,确保在并发情况下只有一个线程可以获取到锁。它的主要思路是通过循环尝试获取锁,直到成功获取为止。在获取到锁之后,执行用户指定的函数,然后通过用户输入来释放锁的状态。

注意:上述代码中的表名、列族、列限定符等信息需要根据实际情况进行调整和修改。此外,代码中没有处理连接关闭的异常情况,实际应用中应该加入适当的异常处理代码来确保资源的正确关闭。

分布式的唯一序列号

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;/*** @className: GlobalIDGenerator* @Description:* @Author: wangyifei* @Date: 2023/12/31 12:42*/
public class GlobalIDGenerator {private static Logger logger = LoggerFactory.getLogger(GlobalIDGenerator.class);public static void main(String[] args) {new GlobalIDGenerator().IDGenerator();}public void IDGenerator(){Configuration configuration = HBaseConfiguration.create();configuration.set("hbase.master", "server1:16000");try {Connection connection = ConnectionFactory.createConnection(configuration);TableName blacklist = TableName.valueOf("distribute_app:hbase_test");byte[] rowKey = Bytes.toBytes("id_generator");byte[] family = Bytes.toBytes("f1");byte[] quailifier = Bytes.toBytes("id");Table table = connection.getTable(blacklist);Increment increment = new Increment(rowKey);increment.addColumn(family , quailifier , 1L);Result result = table.increment(increment);for (Cell cell : result.rawCells()) {logger.info("quailifier:{} , value:{}", Bytes.toString(CellUtil.cloneQualifier(cell))// 下面的就是这个自动生成的 ID, Bytes.toLong(CellUtil.cloneValue(cell)));}table.close();connection.close();} catch (IOException e) {e.printStackTrace();}}
}

上述代码是一个使用HBase实现全局唯一ID生成器的示例。

这段代码的总结如下:

这段代码实现了使用HBase作为后端存储的全局唯一ID生成器。它利用了 HBase 的 increment 功能,生成一个全局递增的原子操作。

分布式系统黑名单


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;/*** @className: Testmain* @Description:* @Author: wangyifei* @Date: 2023/12/29 21:13** Hbase table ddl*  create 'distribute_app:hbase_test', {NAME => 'f1', VERSIONS => 5}****/
public class TesBlacklist {private static Logger logger = LoggerFactory.getLogger(DistributeCAS.class);public static void main(String[] args) {new TesBlacklist().testBlacklist(args);}public void testBlacklist(String[] args){Configuration configuration = HBaseConfiguration.create();
//        configuration.set("hbase.zookeeper.quorum", "192.168.175.113");
//        configuration.set("hbase.zookeeper.quorum", "server1");
//        configuration.set("hbase.zookeeper.property.clientPort", "2181");configuration.set("hbase.master", "server1:16000");try {Connection connection = ConnectionFactory.createConnection(configuration);TableName blacklist = TableName.valueOf("distribute_app:hbase_test");byte[] rowKey = Bytes.toBytes(args[0]);byte[] family = Bytes.toBytes("f1");byte[] quailifier = Bytes.toBytes("exits");byte[] value = Bytes.toBytes(args[0]);Table table = connection.getTable(blacklist);boolean b = table.checkAndMutate(rowKey, family).qualifier(quailifier).ifNotExists().thenPut(new Put(rowKey).addColumn(family, quailifier, value));logger.info("b:{}",b);logger.info("cust_001 is {} in blacklist", b?" not " : "");table.close();connection.close();} catch (IOException e) {e.printStackTrace();}}
}

上述代码利用了 Hbase 的 checkAndMutate 功能,先检查 cust 是否存在,如果存在则返回 true ,用户需要被屏蔽,如果不存在,则返回 false ,并将用户插入到 Hbase table 中,整个过程是原子性的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/587846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript弱引用

1.使用场景 弱引用&#xff08;WeakRef&#xff09;在以下情况下可以很有用&#xff1a; 缓存&#xff1a;当你需要缓存对象&#xff0c;但又不想因为缓存的存在而阻止对象被垃圾回收时&#xff0c;可以使用弱引用。通过将对象存储在弱引用中&#xff0c;即使没有其他对该对象…

线段树基础(上)

普通线段树 线段树原理 &#xff08;证明&#xff09; 线段树是一种维护序列操作的二叉树数据结构。 线段树存在以下五个操作&#xff1a; build&#xff1a;创建一颗线段树push_up&#xff1a;根据子节点计算父节点的信息push_down&#xff1a;根据父节点的修改标记去更新…

深度学习框架Pytorch学习笔记

由于工作原因&#xff0c;需要使用到深度学习pytorch框架&#xff0c;所以&#xff0c;跟随视频学习了深度学习框架的使用方法 1、安装pytorch 在windows下使用pytorch&#xff0c;首先找到anaconda官网&#xff0c;安装64位windows版本&#xff0c;然后使用清华的源替换掉an…

基于SSM的学生信息管理系统

基于SSM的学生信息管理系统资源-CSDN文库 项目介绍 学生管理系统是我从自己学校的综合信息平台得到灵感&#xff0c;于是使用学习过的Spring、SpringMVC、Mybatis框架LayUI完成了这么一套系统。 项目整体难度不大&#xff0c;部署简单&#xff0c;界面友好&#xff0c;代码结…

C语言易错知识点十(指针(the final))

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 许久不见&#xff0c;甚是想念&#xff0c;真的是时间时间&#xff0c;你慢些吧&#xff0c;不能再让头发变秃…

面试官:为什么不推荐使用 uuid 作为 mysql 主键?

我个人始终觉得&#xff0c;大多数技术是没有优劣之分的&#xff0c;在适合的地方使用&#xff0c;它就是最好的&#xff01; 面试官&#xff1a;为什么不推荐使用 uuid 作为 mysql 主键? 如果你面试遇到这个问题&#xff08;面试官并没有给出对应的场景&#xff0c;那么这家…

阿里员工:本月收入489325元,开心过年

阿里员工&#xff1a;本月收入489325元&#xff0c;开心过年 近日&#xff0c;一名阿里员工在社交媒体上爆料自己的本月收入&#xff0c;竟然高达48.9万&#xff0c;真是让人目瞪口呆。 震惊之余&#xff0c;大家都很好奇这么高收入是怎么来的&#xff0c;再仔细看工资单&…

C语言-破解密码

题目描述 密码是我们生活中非常重要的东东&#xff0c;我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码&#xff0c;虽然简单但也安全。 假设老王原来一个BBS上的密码为zvbo941987,为了方便记忆&#xff0c;他通过一种算法把这个密码变换…

vue3 ts面试题 常问面试题(连更中.......有错 欢迎提出)

Vue2 和 vue3 区别 Api&#xff1f; 升级v3是因为 v2有一些基础bug 例如数据丢失等 但是 v3就解决了这个问题 v3利用了双向数据绑定 数值变化页面就该变 v2 和 v3 的 api 不一样 v2的api是选择式的 v3是组合式的 例如 setup就是组合的 v2 和 v3 的生命周期也不太一样 v2 和 v3 …

力扣LeetCode第80题 删除有序数组中的重复项 II

一、题目 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次&#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示…

excel数据使用xlsx读取转换成JSON

一般读取excel的工作都由后端完成&#xff0c;比如java使用poi插件。如果存在少量非敏感数据&#xff0c;比如日志、模板数据&#xff0c;可以直接由前端搞定。 使用xlsx插件 在线json格式化、excel转json测试 一、安装 可以安装以下版本&#xff0c;不会出现问题 yarn ad…

Mysql 中子查询时order by与group by合用无效的解决办法

存在一个需求&#xff1a; 需要获取某些条件下&#xff0c;在分组后&#xff0c;取最新的记录。 比如有张学生分数表&#xff0c;里面包含了学生一年的所有考试的语数外成绩&#xff0c;我想要获取同学A的最后一次考试成绩。 select * from ( select * from student_score wh…

HC-05蓝牙模块--------手机与STM32通信(代码编写)(上位机配置)保姆级教程

⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩因为之前无论是电赛还是做项目&#xff0c;都用到了蓝牙模块&#xff0c;如&#xff1a;手机和stm32的通信&#xff0c;电赛中的双车通信&#xff0c;还是遥感小车的…

R语言【stats】——处理R对象中的缺省值:na.fail(), na.omit(), na.exclude(), na.pass()

Package stats version 4.3.2 Parameters na.fail(object, ...)na.omit(object, ...)na.exclude(object, ...)na.pass(object, ...) 参数【object】&#xff1a;R 对象&#xff0c;通常是一个数据帧。 参数【...】&#xff1a;特殊方法可能需要的其他参数。 目前&#xff0…

X-AnyLabeling 图像标注工具及模型自动标注;json2yolo格式转换、yolo训练数据集划分

一、X-AnyLabeling 图像标注工具及模型自动标注 参考:https://github.com/CVHub520/X-AnyLabeling 1、下载 直接https://github.com/CVHub520/X-AnyLabeling/releases/tag/下载对应版本 软件打开: 2、自定义标注模型yaml构建 这里自定义模型自动标注加载预训练的yolov8…

LeetCode994腐烂的橘子(相关话题:矩阵dfs和bfs)

题目描述 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单…

【C#与Redis】--实践案例--案例 3:使用 Redis 实现排行榜

实现一个基本的排行榜系统通常涉及到对分数进行排序&#xff0c;而 Redis 的 Sorted Set 数据结构非常适合这种用途。以下是一个使用 StackExchange.Redis 库在 C# 中实现排行榜的简单案例&#xff1a; 安装 StackExchange.Redis 库&#xff1a; Install-Package StackExchan…

Unity坦克大战开发全流程——游戏场景——敌人——移动的敌人

游戏场景——敌人——移动的敌人 制作预制体 将坦克拖拽至场景中进行设置 写代码 让坦克在两点之间不停移动 随机坐标函数 然后在start()中调用即可 坦克要一直盯着玩家 当小于一定距离时&#xff0c;攻击玩家 重写开火逻辑 注意还要将其tag改成Monster&#xff01; 当敌人死…

虚拟化分类和实现原理

6、虚拟化分类 &#xff08;1&#xff09;完全虚拟化 直接将Hypervisor跑在0环内核态&#xff0c;客户机os跑在1环&#xff0c;一旦触发敏感指令&#xff0c;由0环的VMM进行捕获翻译&#xff0c;从而模 拟这些指令。而运行在1环的GuestOS永远都不知道自己是个虚拟机。是完全…

【Transformer】深入理解Transformer模型2——深入认识理解(上)

前言 Transformer模型出自论文&#xff1a;《Attention is All You Need》 2017年 近年来&#xff0c;在自然语言处理领域和图像处理领域&#xff0c;Transformer模型都受到了极为广泛的关注&#xff0c;很多模型中都用到了Transformer或者是Transformer模型的变体&#xff0…