[平台建设] HBase平台建设实践
背景
由于公司业务场景的需要,我们需要开发HBase平台,主要需要以下功能:
- 建表管理
- 授权管理
- SDK实现
- 与公司内部系统打通
我们使用的HBase 版本:
HBase 1.2.0-cdh5.16.2
Hadoop: 2.6.0-cdh5.16.2
目前主要应用场景:
- 实时计算如商品、商家等维度表
- 去重逻辑
- 中间件服务等监控数据
- 用户画像
平台建设
建表管理
1.指定命名空间
HBase系统默认定义了两个缺省的namespace:
- hbase:系统内建表,包括namespace和meta表
- default:用户建表时未指定namespace的表都创建在此
我们需要根据业务组进行定义命名空间,方便维护管理
2.支持多集群,不同业务组根据需要选择相应集群
3.指定表名
4.指定列族
因为列族在创建表的时候是确定的,列名以列族作为前缀,按需可动态加入,如: cf:name, cf:age
cf 就是列族, name, age 就是列名
5.设置生存时间TTL
一旦达到过期时间,HBase将自动删除行
6.支持预分区
HBase默认建表时有一个region,这个region的rowkey是没有边界的,即没有startkey和endkey,在数据写入时,所有数据都会写入这个默认的region,随着数据量的不断增加,此region已经不能承受不断增长的数据量,会进行split,分成2个region。在此过程中,会产生两个问题:
- 数据往一个region上写,会有写热点问题。
- region split会消耗宝贵的集群I/O资源。
基于此可以控制在建表的时候,创建多个空region,并确定每个region的起始和终止rowkey,这样只要我们的rowkey设计能均匀的命中各个region,就不会存在写热点问题。自然split的几率也会大大降低。当然随着数据量的不断增长,该split的还是要进行split。像这样预先创建hbase表分区的方式,称之为预分区.
预分区的实现,参考HBase的shell脚本实现.
相关代码:
Configuration configuration = conn.getConfiguration();
RegionSplitter.SplitAlgorithm hexStringSplit = RegionSplitter.newSplitAlgoInstance(configuration, splitaLgo);
splits = hexStringSplit.split(numRegions);
指定分割算法以及预分区的数目
分割算法主要三种:
- HexStringSplit: rowkey是十六进制的字符串作为前缀的
- DecimalStringSplit: rowkey是10进制数字字符串作为前缀的
- UniformSplit: rowkey前缀完全随机
其他配置:
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
//指定版本,设置成一个即可
hColumnDescriptor.setMaxVersions(1);
//指定列族过期时间,界面配置最小单位天,HBase TTL时间单位为秒
Long ttl = TimeUnit.DAYS.toSeconds(expireDays);
hColumnDescriptor.setTimeToLive(ttl.intValue());
//启用压缩算法
hColumnDescriptor.setCompressionType(Compression.Algorithm.SNAPPY);
//进行compaction的时候使用压缩算法
hColumnDescriptor.setCompactionCompressionType(Compression.Algorithm.SNAPPY);
//让数据块缓存在LRU缓存里面有更高的优先级
hColumnDescriptor.setInMemory(true);
//bloom过滤器,过滤加速
hColumnDescriptor.setBloomFilterType(BloomType.ROW);
descriptor.addFamily(hColumnDescriptor);
最终调用 admin.createTable进行建表
建表的时候,注意要检测命名空间存在,不存在进行创建命名空间,还有建表的时候自动给相应的业务组进行授权。
表结构查看、数据预览、表删除等功能通过HBase java API 就可以实现, 这里不介绍了.
授权管理
先说HBase如何实现鉴权?
我们采用HBase ACL 鉴权机制,具体配置如下:
<property>
<name>hbase.superuser</name>
<value>admin</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
给其他业务组授权都采用超级账户进行
下面是权限对照表:

授权流程:

用户如何进行HBase操作以及平台如何进行认证和鉴权?
我们开发了一个很简单的SDK
SDK 实现
SDK 主要的功能就是进行认证和授权、以及获取相关集群的连接信息的操作。
整体流程:

与公司内部系统打通
主要工作就是开发平台使用HBase任务如何打通认证鉴权等,因为都是基于业务组提交任务,所以很容易实现满足需求
针对外部服务在容器内使用HBase, 在主机名没有做DNS 正反向解析之前,需要在容器内配置hosts。
集群数据迁移
主要场景是我们需要将老集群的数据迁移到新集群,要实现跨集群迁移。
老集群版本: HBase: 1.2.0-cdh5.12.0 Hadoop: 2.6.0-cdh5.12.0
新集群版本: HBase: 1.2.0-cdh5.16.2 Hadoop: 2.6.0-cdh5.16.2
使用Distcp方案来进行,一般选择业务低峰期去做, ,需要保证HBase集群中的表是静态数据,需要停止业务表的写入
具体步骤
(1) 在新集群中HDFS 用户下执行distcp命令
在新集群的NameNode节点执行命令
hadoop distcp -Dmapreduce.job.queue.name=default -pug -update -skipcrccheck -m 100 hdfs://ip:8020/hbase/data/aaa/user_test /hbase/data/aaa/user_test
(2) 执行HBase命令来修复HBase表的元数据,如表名、表结构等内容,会重新注册到新集群的Zookeeper中。
sudo -u hbase hbase hbck -fixMeta "aaa:user_test"
sudo -u hbase hbase hbck -fixAssignments "aaa:user_test"
(3)验证数据:
scan 'aaa:user_test' ,{LIMIT=>10}
(4) 旧集群表删除:
#!/bin/bash
exec sudo -u admin hbase shell <<EOF
disable 'aaa:user_test'
drop 'aaa:user_test'
EOF
为了迁移方便,可以将上述命令封装成一个Shell脚本,如:
#! /bin/bash
for i in `cat /home/hadoop/hbase/tbl`
do
echo $i
hadoop distcp -Dmapreduce.job.queue.name=queue_0001_01 -update -skipcrccheck -m 100 hdfs://old_hbase:9000/hbase/data/$i /hbase/data/$i
done
hbase hbck -repairHoles
总结
本文主要对HBase平台建设的实践总结,主要包括创建HBase表相关属性配置的实现,以及认证鉴权的多租户设计思路介绍,同时对HBase跨集群表元信息及数据迁移实践进行总结.
[平台建设] HBase平台建设实践的更多相关文章
- AI场景存储优化:云知声超算平台基于 JuiceFS 的存储实践
云知声是一家专注于语音及语言处理的技术公司.Atlas 超级计算平台是云知声的计算底层基础架构,为云知声在 AI 各个领域(如语音.自然语言处理.视觉等)的模型迭代提供训练加速等基础计算能力.Atla ...
- 开源|性能优化利器:数据库审核平台Themis的选型与实践
作者:韩锋 出处:DBAplus社群分享:来源:宜信技术学院 Themis开源地址:https://github.com/CreditEaseDBA 一.面临的挑战 1.运维规模及种类 我相信,这也是 ...
- SNF快速开发平台2019-权限管理模型实践-权限都在这里
其它权限实践系列文章: 1.角色.权限.账户的概念理解-非常全的理论讲解权限控制 https://www.cnblogs.com/spring_wang/p/10954370.html 2.权限管理模 ...
- 涂鸦基于OAuth2在开发者平台上的探索与实践
前言 开发授权(OAuth2)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资料(如照片.视频.联系人列表),而无需将用户名和密码提供给第三方应用. OAuth2允许用户提供一 ...
- SNF快速开发平台2019-权限管理模型-平台服务(多平台\多组织\SAAS\多系统)
1.1 不同组织机构 通俗的讲,就是一个集团公司,划分几个区域,每个区域都有什么分公司,每个分公司都有哪些部门一样,哪些部门又有那些子部门等. 当然也可以是外贸公司的全球性客户.合作伙伴的分布情 ...
- Atitit 找人软福利建设 技术团队建设大概流程
Atitit 找人软福利建设 技术团队建设大概流程 火车公司有免费车座,餐馆有免费饭吃.. 软件公司嘛,就是软件资源,知识了...技术... 培训体系 大概的知识库体系..让他知道来到我们团队有着很高 ...
- .NET CORE 2.0小白笔记(三):数字化平台之微信平台策略
当下,互联网技术正在深刻地重构我们的社会,各大企事业单位——大到万人集团公司,小到图文复印店——都在争先恐后地从所谓的“传统行业”中脱胎换骨一番以完成数字化转型. 在这个过程中,“企业即IT”.“科技 ...
- flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台(总结感悟篇)
前言: 在前进中去发现自己的不足,在学习中去丰富自己的能力,在放弃时想想自己最初的目的,在困难面前想想怎么踏过去.在不断成长中去磨炼自己. 正文: 时间轴 flask + Python3 实现的的AP ...
- x86平台转x64平台关于内联汇编不再支持的解决
x86平台转x64平台关于内联汇编不再支持的解决 2011/08/25 把自己碰到的问题以及解决方法给记录下来,留着备用! 工具:VS2005 编译器:cl.exe(X86 C/C+ ...
随机推荐
- 每日自动健康打卡(Python+腾讯云服务器)
每日自动健康打卡(Python+腾讯云服务器) 1.配置需要 python3.7,Chrome或者Edeg浏览器,Chrome驱动或者Edge驱动 #需要配置selenium库,baidu-aip库, ...
- C#表格,表格信息、GridView使用。
page: <%@ Control Language="C#" AutoEventWireup="true" CodeFile="test1.a ...
- 《手把手教你》系列技巧篇(四十七)-java+ selenium自动化测试-判断元素是否显示(详解教程)
1.简介 webdriver有三种判断元素状态的方法,分别是isEnabled,isSelected 和 isDisplayed,其中isSelected在前面的内容中已经简单的介绍了,isSelec ...
- Navicat连接Linux系统下的Mysql数据库
1 . 进入Linux机器 , 登录并进入mysql如果没有安装mysql,参照 https://blog.csdn.net/weixin_35353187/article/details/81712 ...
- 学习java的第二十天
一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...
- SimpleNVR如何把安防监控画面推流到微信公众号直播
背景需求 进入移动互联网时代以来,微信已成为许多企业除官网以外必备的宣传渠道,当3.2亿直播用户与九亿微信用户的势能增加,在微信上开启直播已成为越来越多企业的不二选择. 需求分析 微信公众号作为平台来 ...
- addict, address, adequate
addict Addiction is a biopsychosocial disorder characterized by repeated use of drugs, or repetitive ...
- 网卡命令ifconfig
• ifconfig • service network restart • ifdown eth0 • ifdown eth0 #linux下run networkexport USER=lizhe ...
- mybatis错误 Mapped Statements collection does not contain value for
java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for 在unit里测试 ...
- Spring(2):依赖注入DI
依赖注入DI 当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例.但在Spring里,创建被 ...