作家
登录

大数据查询——HBase 读写设计与实践

作者: 来源: 2017-12-20 16:04:59 阅读 我要评论

【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞?

背景介绍

本项目重要解决 check 和 opinion2 张汗青数据表(汗青数据是指当营业产生过程中的完全中心流程和结不雅数据)的在线萌芽。原实现基于 Oracle 供给存储萌芽办事,跟着数据量的赓续增长,在写入和攫取过程中面对机能问题,且汗青数据仅供营业萌芽参考,并不影响实际流程,大年夜体系构造上来说,放安营业链条上游比较重。本项目将其置于下流数据处理 Hadoop 分布式平台来实现此需求。下面列一些具体的需求指标:

  1. 数据量:今朝 check 表的累计数据量为 5000w+ 行,11GB;opinion 表的累计数据量为 3 亿 +,约 100GB。每日增量约为每张表 50 万 + 行,只做 insert,不做 update。
  2. 萌芽请求:check 表的主键为 id(Oracle 全局 id),萌芽键为 check_id,一个 check_id 对应多笔记录,所以需返回对应记录的 list; opinion 表的主键也是 id,萌芽键是 bussiness_no 和 buss_type,同理返回 list。单笔萌芽返回 List 大年夜小约 50 条以下,萌芽频率为 100 笔 / 皇帝右,萌芽响应时光 2s。

大年夜数据量及萌芽请求来看,分布式平台上具备大年夜数据量存储,且供给及时萌芽才能的组件首选 HBase。根据需求做了初步的调研和评估后,大年夜致肯定 HBase 作为重要存储组件。将需求拆解为写入和攫取 HBase 两部分。

技巧选型

攫取 HBase 相对来说筹划比较肯定,根本根据需求设计 RowKey,然后根据 HBase 供给的丰富 API(get,scan 等)来攫取数据,知足机能请求即可。

写入 HBase 的办法大年夜致有以下几种:

  1. Java 调用 HBase 原生 API,HTable.add(List(Put))。
  2. MapReduce 功课,应用 TableOutputFormat 作为输出。
  3. Bulk Load,先将数据按照 HBase 的内部数据格局生成持久化的 HFile 文件,然后复制到合适的地位并通知 RegionServer ,即完成海量数据的入库。个中生成 Hfile 这一步可以选择 MapReduce 或 Spark。

本文采取第 3 种方法,Spark + Bulk Load 写入 HBase。该办法相对其他 2 种方法有以下优势:

  1. BulkLoad 不会写 WAL,也不会产生 flush 以及 split。
  2. 如不雅我们大年夜量调用 PUT 接口才入数据,可能会导致大年夜量的 GC 操作。除了影响机能之外,严重时甚至可能会对 HBase 节点的稳定性造成影响,采取 BulkLoad 无此挂念。
  3. 过程中没有大年夜量的接口调用消费机能。
  4. 可以应用 Spark 强大年夜的计算才能。

图示如下:

设计

情况信息

热点问题

  1. Hadoop 2.5-2.7
  2. HBase 0.98.6
  3. Spark 2.0.0-2.1.1
  4. Sqoop 1.4.6 

表设计

本段的重点在于评论辩论 HBase 表的设计,个中 RowKey 是最重要的部分。为了便利解释问题,我们先来看看数据格局。以下以 check 举例,opinion 同理。

2、序列化

check 表(原表字段有 18 个,为便利描述,本文截选 5 个字段示意)

如上图所示,主键为 id,32 位字母和数字随机构成,营业萌芽字段 check_id 为不定长字段(不跨越 32 位),字母和数字构成,同一 check_id 可能对应多笔记录,其他为相干营业字段。众所周知,HBase 是基于 RowKey 供给萌芽,且请求 RowKey 是独一的。RowKey 的设计重要推敲的是数据将如何被拜访。初步来看,我们有 2 种设计办法。

  1. 拆成 2 张表,一张表 id 作为 RowKey,列为 check 表对应的各列;另一张表为索引表,RowKey 为 check_id,每一列对应一个 id。萌芽时,先找到 check_id 对应的 id list,然后根据 id 找到对应的记录。均为 HBase 的 get 操作。
  2. 将本需求可算作是一个范围萌芽,而不是单条萌芽。将 check_id 作为 RowKey 的前缀,后面跟 id。萌芽时设置 Scan 的 startRow 和 stopRow,找到对应的记录 list。

第一种办法长处是表构造简单,RowKey 轻易设计,缺点为 1)数据写入时,一行原始数据须要写入到 2 张表,且索引表写入前须要先扫描该 RowKey 是否存在,如不雅存在,则参加一列,不然新建一行,2)攫取的时刻,即就是采取 List, 也至少须要攫取 2 次表。第二种设计办法,RowKey 设计较为复杂,然则写入和攫取都是一次性的。综合推敲,我们采取第二种设计办法。

RowKey 设计

HBase 中的行是以 RowKey 的字典序排序的,其热点问题平日产生在大年夜量的客户端直接拜访集群的一个或极少数节点。默认情况下,在开端建表时,表只会有一个 region,并跟着 region 增大年夜而拆分成更多的 region,这些 region 才能分布在多个 regionserver 上大年夜而使负载均分。对于我们的营业需求,存量数据已经较大年夜,是以有须要在一开端就将 HBase 的负载均派到每个 regionserver,即做 pre-split。常见的防治热点的办法为加盐,hash 散列,自增部分(如时光戳)翻转等。

解决办法一:

RowKey 设计

Step1:肯定预分区数量,创建 HBase Table


  推荐阅读

  Ryzen 5大战八代酷睿i5 你最关心的我都测了

【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞?岁终已至,更多的商家都捋臂将拳竞相推出更多的促销,力争在硬件市场获得年关的收官之战中取得好成就。并且《绝地求生:大>>>详细阅读


本文标题:大数据查询——HBase 读写设计与实践

地址:http://www.17bianji.com/lsqh/39994.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)