背景

由于公司业务场景的需要,我们需要开发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。在此过程中,会产生两个问题:

  1. 数据往一个region上写,会有写热点问题。
  2. region split会消耗宝贵的集群I/O资源。

基于此可以控制在建表的时候,创建多个空region,并确定每个region的起始和终止rowkey,这样只要我们的rowkey设计能均匀的命中各个region,就不会存在写热点问题。自然split的几率也会大大降低。当然随着数据量的不断增长,该split的还是要进行split。像这样预先创建hbase表分区的方式,称之为预分区.

预分区的实现,参考HBase的shell脚本实现.

相关代码:

  1. Configuration configuration = conn.getConfiguration();
  2. RegionSplitter.SplitAlgorithm hexStringSplit = RegionSplitter.newSplitAlgoInstance(configuration, splitaLgo);
  3. splits = hexStringSplit.split(numRegions);

指定分割算法以及预分区的数目

分割算法主要三种:

  • HexStringSplit: rowkey是十六进制的字符串作为前缀的
  • DecimalStringSplit: rowkey是10进制数字字符串作为前缀的
  • UniformSplit: rowkey前缀完全随机

其他配置:

  1. HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
  2. //指定版本,设置成一个即可
  3. hColumnDescriptor.setMaxVersions(1);
  4. //指定列族过期时间,界面配置最小单位天,HBase TTL时间单位为秒
  5. Long ttl = TimeUnit.DAYS.toSeconds(expireDays);
  6. hColumnDescriptor.setTimeToLive(ttl.intValue());
  7. //启用压缩算法
  8. hColumnDescriptor.setCompressionType(Compression.Algorithm.SNAPPY);
  9. //进行compaction的时候使用压缩算法
  10. hColumnDescriptor.setCompactionCompressionType(Compression.Algorithm.SNAPPY);
  11. //让数据块缓存在LRU缓存里面有更高的优先级
  12. hColumnDescriptor.setInMemory(true);
  13. //bloom过滤器,过滤加速
  14. hColumnDescriptor.setBloomFilterType(BloomType.ROW);
  15. descriptor.addFamily(hColumnDescriptor);

最终调用 admin.createTable进行建表

建表的时候,注意要检测命名空间存在,不存在进行创建命名空间,还有建表的时候自动给相应的业务组进行授权。

表结构查看、数据预览、表删除等功能通过HBase java API 就可以实现, 这里不介绍了.

授权管理

先说HBase如何实现鉴权?

我们采用HBase ACL 鉴权机制,具体配置如下:

  1. <property>
  2. <name>hbase.superuser</name>
  3. <value>admin</value>
  4. </property>
  5. <property>
  6. <name>hbase.coprocessor.region.classes</name>
  7. <value>org.apache.hadoop.hbase.security.access.AccessController</value>
  8. </property>
  9. <property>
  10. <name>hbase.coprocessor.master.classes</name>
  11. <value>org.apache.hadoop.hbase.security.access.AccessController</value>
  12. </property>
  13. <property>
  14. <name>hbase.security.authorization</name>
  15. <value>true</value>
  16. </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节点执行命令

  1. 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中。

  1. sudo -u hbase hbase hbck -fixMeta "aaa:user_test"
  2. sudo -u hbase hbase hbck -fixAssignments "aaa:user_test"

(3)验证数据:

  1. scan 'aaa:user_test' ,{LIMIT=>10}

(4) 旧集群表删除:

  1. #!/bin/bash
  2. exec sudo -u admin hbase shell <<EOF
  3. disable 'aaa:user_test'
  4. drop 'aaa:user_test'
  5. EOF

为了迁移方便,可以将上述命令封装成一个Shell脚本,如:

  1. #! /bin/bash
  2. for i in `cat /home/hadoop/hbase/tbl`
  3. do
  4. echo $i
  5. hadoop distcp -Dmapreduce.job.queue.name=queue_0001_01 -update -skipcrccheck -m 100 hdfs://old_hbase:9000/hbase/data/$i /hbase/data/$i
  6. done
  7. hbase hbck -repairHoles

总结

本文主要对HBase平台建设的实践总结,主要包括创建HBase表相关属性配置的实现,以及认证鉴权的多租户设计思路介绍,同时对HBase跨集群表元信息及数据迁移实践进行总结.

[平台建设] HBase平台建设实践的更多相关文章

  1. AI场景存储优化:云知声超算平台基于 JuiceFS 的存储实践

    云知声是一家专注于语音及语言处理的技术公司.Atlas 超级计算平台是云知声的计算底层基础架构,为云知声在 AI 各个领域(如语音.自然语言处理.视觉等)的模型迭代提供训练加速等基础计算能力.Atla ...

  2. 开源|性能优化利器:数据库审核平台Themis的选型与实践

    作者:韩锋 出处:DBAplus社群分享:来源:宜信技术学院 Themis开源地址:https://github.com/CreditEaseDBA 一.面临的挑战 1.运维规模及种类 我相信,这也是 ...

  3. SNF快速开发平台2019-权限管理模型实践-权限都在这里

    其它权限实践系列文章: 1.角色.权限.账户的概念理解-非常全的理论讲解权限控制 https://www.cnblogs.com/spring_wang/p/10954370.html 2.权限管理模 ...

  4. 涂鸦基于OAuth2在开发者平台上的探索与实践

    前言 开发授权(OAuth2)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资料(如照片.视频.联系人列表),而无需将用户名和密码提供给第三方应用. OAuth2允许用户提供一 ...

  5. SNF快速开发平台2019-权限管理模型-平台服务(多平台\多组织\SAAS\多系统)

    1.1    不同组织机构 通俗的讲,就是一个集团公司,划分几个区域,每个区域都有什么分公司,每个分公司都有哪些部门一样,哪些部门又有那些子部门等. 当然也可以是外贸公司的全球性客户.合作伙伴的分布情 ...

  6. Atitit 找人软福利建设 技术团队建设大概流程

    Atitit 找人软福利建设 技术团队建设大概流程 火车公司有免费车座,餐馆有免费饭吃.. 软件公司嘛,就是软件资源,知识了...技术... 培训体系 大概的知识库体系..让他知道来到我们团队有着很高 ...

  7. .NET CORE 2.0小白笔记(三):数字化平台之微信平台策略

    当下,互联网技术正在深刻地重构我们的社会,各大企事业单位——大到万人集团公司,小到图文复印店——都在争先恐后地从所谓的“传统行业”中脱胎换骨一番以完成数字化转型. 在这个过程中,“企业即IT”.“科技 ...

  8. flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台(总结感悟篇)

    前言: 在前进中去发现自己的不足,在学习中去丰富自己的能力,在放弃时想想自己最初的目的,在困难面前想想怎么踏过去.在不断成长中去磨炼自己. 正文: 时间轴 flask + Python3 实现的的AP ...

  9. x86平台转x64平台关于内联汇编不再支持的解决

    x86平台转x64平台关于内联汇编不再支持的解决     2011/08/25   把自己碰到的问题以及解决方法给记录下来,留着备用!   工具:VS2005  编译器:cl.exe(X86 C/C+ ...

随机推荐

  1. UE4之Slate: App启动与最外层Runtime结构

    UE4版本:4.24.3源码编译: Windows10 + VS开发环境 Slate为一套自定义UI框架,其绘制直接依赖的是OpenGL.DirectX这样的硬件加速AIP;可以理解为一个单独的2D图 ...

  2. mybatis项目中,使用useSSL=true却报错

    今天在玩儿mybatis的时候遇到一个蛮有东西的事情:抛了一个让我折腾几个小时的错误,所以记录一下 这个错误有意思的地方就在于这里: 当使用useSSL安全连接时,抛出了上述的错误把useSSL改为f ...

  3. Elasticsearch中关于transform的一个问题?

    背景:现在有一个业务,派件业务,业务员今天去派件(扫描产生一条派件记录),派件可能会有重复派件的情况,第二天再派送(记录被更新,以最新的派件操作为准).现在需要分业务员按天统计每天的派件数量.es版本 ...

  4. 容器之分类与各种测试(四)——multimap

    multiset和multimap的具体区别在于,前者的key值就是自己存储的value,后者的key与value是分开的不相关的. 例程 #include<stdexcept> #inc ...

  5. Linux系统根目录下各文件夹介绍

    参考自:[1]Linux 系统根目录下各个文件夹的作用 https://www.cnblogs.com/jiangfeilong/p/10538795.html[2]了解Linux根目录"/ ...

  6. go recover让崩溃的程序继续执行

    package main import ( "fmt" "log" ) func de() { //recover() //可以打印panic的错误信息 //f ...

  7. Linux学习 - 文件系统常用命令

    一.文件系统查看命令df df [选项] [挂载点] -a 查看所有文件系统信息,包括特殊文件系统 -h 使用习惯单位显示容量 -T 显示文件系统类型 -m 以MB为单位显示容量 -k 以KB为单位显 ...

  8. 在隐藏导航栏的控制器中,调用UIIMagePickerController,出现导航栏变透明的问题

    在隐藏导航栏的控制器中,调用UIIMagePickerController,出现导航栏变透明的问题 解决办法 #pragma mark - UIImagePickerController Delega ...

  9. Handler与多线程

    1.Handler介绍 在Android开发中,我们常会使用单独的线程来完成某些操作,比如用一个线程来完成从网络上下的图片,然后显示在一个ImageView上,在多线程操作时,Android中必须保证 ...

  10. 神器Tampermonkey的安装使用

    Tampermonkey是一款基于浏览器的神奇插件,在国内称为油猴,开发者可以在上面开发满足自己需求的各类浏览器应用脚本.不过经过全球各地无数开发者数年的积累现在其官网已经有一大把的优秀的现成脚本,完 ...