背景

由于公司业务场景的需要,我们需要开发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脚本实现.

相关代码:

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平台建设实践的更多相关文章

  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. 关于JSONObject的性能问题

    现有一段代码: private JSONObject override(User user, UserVO vo) { String json = JSON.toJSONString(vo); JSO ...

  2. flink-----实时项目---day06-------1. 获取窗口迟到的数据 2.双流join(inner join和left join(有点小问题)) 3 订单Join案例(订单数据接入到kafka,订单数据的join实现,订单数据和迟到数据join的实现)

    1. 获取窗口迟到的数据 主要流程就是给迟到的数据打上标签,然后使用相应窗口流的实例调用sideOutputLateData(lateDataTag),从而获得窗口迟到的数据,进而进行相关的计算,具体 ...

  3. 零基础学习java------day1------计算机基础以及java的一些简单了解

    一. java的简单了解 Java是一门面向对象编程语言,不仅吸收了C++的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态 ...

  4. 手淘lib-flexible布局适配方案

    前置知识:什么是rem CSS3新增的一个相对单位rem(root em,根em).rem是相对于根节点(或者是html节点).如果根节点设置了font-size:10px;那么font-size:1 ...

  5. ArrayList删除特定元素的方法

    最朴实的方法,使用下标的方式: ArrayList<String> al = new ArrayList<String>(); al.add("a"); a ...

  6. MySQL(5):安装MySQL

    下载地址 下载地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip 安装步骤 第一步:下载得到压缩包,并解压 ...

  7. 编译安装haproxy2.0

    先解决lua环境,(因为centos自带的版本不符合haproxy要求的最低版本(5.3)先安装Lua依赖的包 [root@slave-master lua-5.3.5]# yum install  ...

  8. 【Java基础】Java 注解详解

    对于Java注解,我之前的印象是很模糊的,总觉得这个东西经常听说,也经常用,但是具体是怎么回事,好像没有仔细学习过,说到注解,立马想到@Controller,仅此而已. 对于Java注解,我咨询过一些 ...

  9. Centos 的常用命令总结

    设置静态IP和DNS vim /etc/sysconfig/network-scripts/ifcfg-[网卡名称] 修改 BOOTPROTO=static 添加 IPADDR=192.168.1.1 ...

  10. Java线程安全性-原子性工具对比

    synchronized 不可中断锁,适合竞争不激烈的场景,可读性好,竞争激烈时性能下降很快 Lock 可中断锁,多样化同步,竞争激烈时能维持常态 Atomic 竞争激烈时能维持常态,比Lock性能还 ...