2019.1数据通信
Technology Scheme I/
电力大数据平台中
HBase的实时性优化方案
方威胡晓勤(四川大学计算机学院610065)
摘要:近年来,随着大数据场景的兴起,RDBMS由于其自身的扩展性和可用性限制无法满足企业需求。 NoSQUt据库的出现弥补了传统关系型数据库在大数据领域的不足。NoSQL数据库本身具有良好的扩展性、容错 性以及实时访问、存储TB级别数据的特点。
HBase就是以HDFS和MapReduce为基础的开源NoSQL型分布式数据库,它不支持二级索引、事务和批量数 据处理时延长等⑴。本文以HBase和Spark为基础,增加插件使HBase支持SQL语句和二级索引,通过修改Spark 源码,提升对HBase数据的本地化计算级别。插件对HBase无侵入、低輕合,支持用户输入SQL语句,把输入字段 转化为HBase的列族和列限定符,根据不同的场景选取不同的执行方案。MapReduce计算框架具有计算效率低, 无法利用HBase的读写缓存的缺陷[1],原始Spark框架不能感知HBase数据分片。本文改进Spark能感知HBase 数据分片,对HBase中数据进行高级别本地化计算。最终,将本文设计的系统与业内常用的Hive +HBase方案对 比常用SQL消耗的时延[3]。通过实验得出,本文构建的优化方案在没有缺失HBase的优良特性的基础上加强了 部分应用场景的实时性。
关键词:HBase Coprocessor; Spark;二级索引
1绪论
电力系统的设备采集数据具有稀疏和写多读少的
RDBMS中麟的SQL语句、二^索引和事务。这些缺 失限制了 NoSQL数据库的实用性和部分使用场景的实 时性。HBase是目前最常用的NoSQL型数据库,其底 层文件系统是HDFS,能有效避免单点故障,同时辟 读写响应快、扩展性高等优点[2],可以满足大部分大数 据场景下的业务需求。但HBase也没有避免NoSQL 的常见贿。1.2研究内容
本文的研究目标:对HBase和Spark进行深入研 究。设计并实现一个HBase插件,将SQL语句按不同 场景转化为HBase的API、非主键索引或Spark Job,提 升HBase的实用性和实时性;设计并实现一^ Spark算 子,使其感知HBase的Region分区,充分利用 RegionServer的读缓存和写缓存,对HBase集群中的数 搬区进行高级别本地化计算。
1.1研究背景
特点,非常适合使用HBase进行存储。电力大数据系 统中,麵物联网对电力设备的各相电流、各相电压、 正向有功和反向有功等电位信息进行采集。采集频率 根据设备的重要程度而增加,例如变压器采集频率为1 嫌微照明设躲集频率为5嫌不同设备需要 采集的点位信息也不尽相同,因此数据是稀疏的。采 集数据随着时间推移需要不断推向数据存储层进行持 久化,需要存储系统具有髙扩展性和高写吞吐量。系
统中JS0N格式的采集数据包使用HTIP协议进行交 互,因此数据是半结构化的。
NoSQL _
库相比RDBMS更加适合这类应用场
景,但是为了提高系统的吞吐量和扩展性而舍弃了
11
B
技术方案
Technology Scheme
2
电力大数据平台关键技术
电力大数据平台的核心是HBase,所有的采集设 备指标数据将持久化到HBase中。对HBase进行深入 研究鞋鍾要的。
数据通信2019.1
Region的返回结给客户步3.
Spark。Spark是新一代大数据计算框架。
Spark相比MapReduce具有基于内存if負;、可以完成复 杂的迭代以及DAG Scheduler等优势,运行效率远超MapReduce 〇
2.1 HBase数据模型和物理模型
HBase只支持主键索引,有三种查询方式。一是 精确行键访问,实现毫秒级别响应;二是行键正则访 问,实时性较差;三是全表扫描,实时性很差[4]〇列族
Schema的一列属于一^歹IJ族。
表1 HBase中电力数据模型
3基于HBase的实时性优化方案及应用
本文架构如下图1所示,做了以下两处改进:1■碰Spark对HBase数据分片的感知。实现了
针对以HBase表作为数据源的算子,该算子实现了对 HBase表中数据进行髙级别本地化if負:。
2.改进HBase的实用性和实时性。实现一个增 强SQL徽插件,使HBase支持SQL语句操作;建立 二级索引,提升HBase对非IWkey字段操作的实
CeEaan F_l lirprof
Culm
if itir
T iaa Mncr
种:11
MWH'P
PMKT
ra
TiTlTI
&IIH FullY:[ir〇
VITdIihri_ MudViiLi*ILOIsTKprodra!〇l»SM»r2»棚
dih
i ETccfral
1#
_iUK
ft
TI£uib07
ZD刚
时性。
如表1所示,将采集设备名作为行键,属性和信息 是列族。设备devl的a相电压(UA)110kv,b相电压 (UB)35kv,额定功率(P)50000kvA,设备dev2的温度为 18丈,a相电压为10kv。不同设备的采集信息不同,因 此
该
稀
赫
。
物理上,底层存储的是以RowKey, ColuimiFamily: ColmmiQualifier,数据类型,版本标识的多层嵌套有序 Map结构的数据,同时具有稀疏,分布式,持久化,多维度雜点。
表中的行都按照Rowkey的字典序排列,表在行的 方向上分割为多个Region
RegionServer管理多个
Region。Region由一^或者多个Store组成,每个Store 代表一^列族,每个Store由一^MeraStore或0至多个 StoreFile构成,StoreFile便是HDFS中的文件。 MemStore负责缓存增删改的数据。StoreFile、HLog存 在HDFS中,依靠HDFS备份机制实现容错。当集群中 出现单点故障时可以備HLog进行隊
图1本文系统架构
3.1实现HBase数据高级^本地化计算
Spark通过缓存和划分有向无环图,计算效率高; 通过算子血统和check point实现髙容错。如果计算时 数据本地化级别达到进程本地化,性能最好;如果只能 达到节点本地化和机架本地化则需要消耗一定的1/0, 通过BlockManager的getRemote()方法获取计算数 据[5]。Spark框架并不能感知HBase表的Region分布 从而进行进程本地化计算,只能操作HFile进行读写, 无法充分利用读缓存BlockCahce和写缓存MemStore, 因此需要麵实现4
RDD,感知HBase麵分片。
本文计算架构如图2所示,改进Spark感知HBase 的数据分片。Spark运行时,每个任务线程Task是工 utor 进程的 JVM 堆中。 本文将 Task 的 Partition 和 Re- gion—一对应起来,实现本地化计算。MapReduce直 接操作HFile,效率低,本文Spark Task利用Region的 BlockCache读缓存和MemStore写缓存读取源数据,加
2.2其他工具
1. JSQLParser。JSQLParser 是常用的 SQL 解析 器,可将SQL解析为Java类啟躺。
2.
Observer和 Endpoint。Observer 类似于 RDBMS 的触发 器,当发生某些事件的时候预定义的协处理器会被服 务器端J_〇 Endpoint类似于RDBMS的存储过程,客 户端可以调用Endpoint执行一段Server端代码,并将
协处理器。HBase的协处理器分为两种: 作在其Partition上的,Task需要将源数据读取到Exec
12
技术方案|
2019.1数据通信
Technology Scheme I/
可臟。
修改Spark框架,实现一个对HBase表数据分片 感知的算子是本文改进HBase实时_
基础。使用髙
效的it算框架,可以完成大数据场景下索引表的快速 构建、按条件对非主键字段的高效更新以及高效迭代
3.2增强SQL插件
本文不修改HBase源码,实现了一个增强SQL插
图2本地化计算架构
件。增强SQL插條构如图1中增强SQL模块所示, 其麵流如下文。
用户職作HBase有两种途径,一种是使用原生 HBase Client API,另一种是使用SQL语句。使用SQL 操作HBase表是本文实现的重点。用户键入的SQL语 句字符串被JSQHW解析为Java的类层次结构,例 如:一^查询SQL语句字符串解析为Select对象,该对 象包含表名,字段名和where子句表达式。在图1 Schema转换和选取操作模块中,本文的工作主要将 JSQLParser解析出的字段映射为HBase行键、列限定 符等并选择下一步的执行策略,映射方案详见3.2.1。 撕策_
1. 2. 3.
含三种:
当SQL的where子句包含行键时,使用HBase 当SQL的where子句不包含行键但包含索引 当SQL的where子句不包含行键和索引字段
快读取效率。
改进的HBaseTableScanRDD,主要实现以下方法 (_Scala语言实现):
1. protected def getPartitions : Array [ Partition ] 〇 ^ 施在DAGScheduler贿任射細寸调用,且只调用一 次,返回这个RDD的所有Partition。本文定义 HBaseScanPartition继承 Partition,将 HBase 表的 Region樹噴序编号对应Partition的index方法的返回值,并额外定义Region的开始结束范围、所在节点。从而将HBase 的Region和Spaik的讨算分片Partition对应起来。
2. protected def getDependencies : Seq[ Dependency [_]] = deps。该方法只被调用一次,用于在 DAGScheduler对任务切分时返回血继依赖。由于此 RDD是直接贴近数据源,属于初始RDD,只需返回 臟,転没有舖〇
3. def compute ( split : Partition, context : TaskContext): Iterator[T]。
法对分区进衍返
回一个可遍历的结果。本文在该方法中,利用HBase 读写缓存,将HBase表中的每一行数据转换为Spark中 的一^ Row对象,Row中的域对应表中的字段。
4. protected def getPreferredLocations ( split: Partition): Seq[String]。指定优先位置,输入参数是 split分片,输出结果是一组优先的节点位置。对于每 个Partiton,最佳计^节点是其对应的Region,如果对应 节点压力过大,将会选择其他节点进行计算。本文返 回的优先节点只会是HBase集群上的RegionServer,如 果所有RegionServer资源紧缺,Spark的task将会等待, 考虑到数据量的规模,花费少量等待的延时避免长时 间的耗费网络资源I/O是值得的。
HBase数据分区Region与|雕节点的映射情况都 存储在-ROOT _表和.META.表中,这两张表的结构 和普通用户表一样。HBase将这两张表的地址存储在 Zookeeper集群中,降低HMaster的压力,提升HBase的
Api直接操作麵;
字段时,麵索引操作时,使S Spark操作|雕。
此外,本文考虑到HBase连接线程的复用性,在图 1的HTableConnectionPool模块中使用线程池保存连接 HBase的线程。
3.2.1 Schema
HBase在创建数据表时必须指定表名和列族,插 入数据时还需要指定行键和值。这与标准的SQL语句 只需要包含列字段名不R。因此,需要对Schema字段 进行转化,把SQL中的字段转化为HBase中的主键、列 族以及列限定符。
本錄用规格化的施处理SQL i詢的字段。
表2 Schema字段转化要求
ICrfHilfnlpcrt
cfiwtor«f ucr.,B
Efcfcr_a
13
B
技术方案
Technology Scheme
列族在可以自独定义其下的存储结构,为了不丢 失这个特匣,因此建表、操作数据时必须在SQL中指定 列族。
建■,如“create table student (info F, score F)新建名为student的表,用F指代列族类型,不需要指 定列名。插人新数据时必须指定行键,相当于RDBMS 的主键,用“rowkey”指代行键类型。其它字段类型用 “列族_列名”指代。插入语句“insert into student (rowkey, info_name, info_age, scorejmth, score_english) Values(‘00Q2’,‘张三’,‘18’,‘94’,‘88’)”。类似其 它SQL语句,如索引创建、删除、更新和查询等SQL语 句
都
需
“列制名”指定非獅!1类型。
数据通信2019.1
位信息为列值。稀疏的点位信息和随着时间推移需要 不断存储的数据使得HBase能最大程度发挥它的优 势。支持SQL语句后,能大幅度降低平台的使用门檻, 増加查询雖的实时性。
4实验结果及分析
为了对本文系统的性能进行评估,分析不足和优
点,本章将改进的HBase分布式系统和传统的 Hive +1^3^分布式系统进行SQL增改查消耗时延进 行测试,并雕果进行对比分析。
4.1实验环境
1.虚拟机
本文使用VMWare ESXi 6.3新建3个虚拟机,虚 拟机上安装Red Hat 4.4.7 _ 17操作系统,每个虚拟机
分配4&内存和2个
1她1(11)乂6〇11(11)0?11£5_ 2630
3.2.2二级索引构建策略
在HBase中,只有按RowKey的操作是一定能保 踐秒侧应。若只按其他字段进行操作只能全表扫 描,找出每一行符合要求的RowKey,然后通过RowKey 进行下一步的操作。当表中的数据太多时,全表扫描 会消耗大量时间以及集群资源。因此在HBase的非 RowKey字段上建立索引是非常有必要的。
1•创建索引。当增强SQL插件接收到创建索引语 句时,插件会在服务端创建一张索引表,表名为“原表 S_index”,行键是“列族名^1』名_值”的格式,列族名为 “index”,勸原数据行键。
2.
的prePut()、preDelete()方法,对数据表的增、删、改进 行拦截,拦截方法中获取列信息,按索引列值对索引表 第彌进行修改〇 RegionObserver以Region分区为单位, 在该Region上的Put/Delete操作都会被拦截,检查操 作中携带的数据中包含有索引的字段,将按照 索引表的Schema修改索引表中数据。
3.
v3 @ 2.40GHz 处理器。
2■软件环境
本文在虚拟机上部署分布式HBase系统和 Hive +HBase系统,HBase 系统包含一■个 Master、3 个 RegionServer 和3 个ZooKeeper,Yarn 集群包含一^ Re- sourceManager 和 3 个 NodeManager。
JDK 版本:1. 8.0_152、Scala 版本:2.11. 8、Hadoop 版本:2. 7. 4、HBase 版本:1. 2. 6、ZooKeeper 版本:
管理索弓|。重写协处理器BaseRegionObserver 3.4.10、Hive 版本:2.3.2、Spark 版本:2.1.0。
4.2实验数据
实验为电力系统数据,每行数据包含设备名称和 时间戳组成的IWKey,列值包括电流、电压、温度和正 向有功。
4.3测试与分析
1•插入测试
本节使用Insert SQL语句在HBase已有573M、 1.02G、2.16G数据时,插人1500万条数据测试,对比有 无索引两种情况平均每条数据的用时。测试结果 如下:
表3插入数据测试结果
ri■本 Viirq •ftXi H
d. iA»
l.Wf2. Iffi
#. in?4■测
Q•晒L
i. + at-.io
构建索引数据。如果是在用户表已经有大量数
据后再创建索引表,则必须对已有的数据建立索弓丨来 保证数据一致性。使用下文改进的Spark框架对已有 鎌
索
引
。
4•使用索引。当插件接受的SQL i吾句中不包含行 键字段时,查看是否有索引字段,当有多个索引字段 时,选取第一个字段索引,组织索引Rowkey,通过索引
mnmm
R〇wkey
本文对HBase和Spark的改进应用于电力大数据 系统的持久化存储和日常计算,主要负责对接物联网 的采集设备数据,是大数据平台的核心。HBase表中 主要以设备和时间戳组合为主键,设备的各个采集点
有索引插入数据比无索引插入数据耗时更多,这 是因为有索引时,需
要
RegionObserver的'Kl#理器
处理。但是由于插入操作都是基于写缓存进行处理
14
技术方案|
2019.1数据通信
Technology Scheme I/
据的插人性能产生一定的影响;本文的索引在按条件 操作下对作效轉常好,如果条件是范围,需要 碰索引表的機册。参考文献
的,只有在刷写缓存时才会将数据写入磁盘,因此耗时 不会随增加而显著变化。
2查询测试分析
查询使用“select * from t_remote_pulse where info _voltage = x”。其中x从表中已有电压等级随机取 出,测试结果为查询1500万次,对比每次查询的平均 用时。
表4根据非RowKey字段查询数据测试结果
BWU
< + t收iD■如
I.ILU
± 14;
' Ptti ft. K.i&T.3L
m?r
(LM
[1 ][美]乔治.HBase权威指南.出版社:人民邮电出版社 [2 ][美]迪米拉克.HBase实战.出版社:人民邮电出版社
[3 ]郭建伟•实战Hive和Hbase集成管理[J] •网络安全和信息
化,2018(10) :67 -71[4 ]冯心欣,胡淑英,邹其昊,徐艺文.基于HBase的车联网海
量数据查询[J ].福州大学学报(自然科学版),2018,46
(04) :466 -471
[5 ]程炎敏.基于大_ Spark架构的铁路货物在途时间预测
并行计^设计与实现[D].北京交通大学,2018
同数据量下,对非RowKey字段有索引,无索引以 及Hive + HBase查询耗时依次递增,且后两者远大于 前者。基于索引,只需要两次基于RowKey的RPC便 可以取得麵;无索引时只能进行全表扫描,耗时与数 据量线性相关;Hive + HBase采用MapReduce进行全 表扫描,耗时更长。
3•批量更新测试分析
使用“update t_remote_pulse set info_wp = y
whereinfo_voltage = x”。其中x从表中已有电压等级 随机取出,麵此SQL i詢对HBase麵行1500万次麵,平均每次时如下表。
表5按非RowKey字段条件批量更新数据的结果
Bast 钉索引耗时4审位^ 无3fe引Sptirk 耗时 iiive-'ll
TOft秒/条> i.:利心秒.•来 >(本文优ft)H秒■■浓丨本文优
79L^»fl. 212■1^ 392
I以腊\\,m■I.5I0
MS. 0^ft, mgylTI
作者简介:方威,四川大学计算机学院学生,主要研究大数据存 储和计算。
■
同数据量下,非Rc^Key有索引字段条件更新和 无索弓丨Spark Job条件更新比Hive有较大提升。基于 索引,只需要两次基于Rowkey的RPC操作即可;使用 改进的Spark Job对HBase数据进行高级别本地化更 新,效率也不错。
4.4实验结果综合分析
采用索引能够极大地提高HBase的非RowKey删 改查效率,并且不会随数据量增加而显著增加,满足大 数据的实时查询。基于改进Spark的批量修改厕以 达到大数据场景下快速响应的需求,并且节省了构建 索引而占用的相輕间。
本文也存在一些不足。不支持group by和having 类型的SQL i吾句;RegionObserver的prePut()函数需要 额外的查询开销区分插人操作和更新操作,这样对数
15
因篇幅问题不能全部显示,请点此查看更多更全内容