基于海量数据的HBase写入性能测试与优化

2019-05-22 10:27青欣文伟军金星姜镇
电脑知识与技术 2019年6期

青欣 文伟军 金星 姜镇

摘要:HBase解决了大规模数据的结构化存储和实时的随机读写访问,但HBase提供的API在大规模数据批量写入等方面存在着性能瓶颈,不能很好地满足应用需求。本文提出了基于MapReduce架构实现HBase的性能优化方案,并设计了分布式程序进行验证,实验表明在海量数据应用条件下采用MapReduce计算框架能够利用HBase集群的计算性能,相比传统的单线程和多线程数据写入方式具有更好的实用性和有效性,同时结合这三类数据写入方式的性能特征提出了以写入数据量为依据的选择策略。

关键词:MapReduce,Hadoop,HBase,海量数据

中图分类号:TP392 文献标识码:A 文章编号:1009-3044(2019)06-0009-05

Testing and optimization of HBase writing performance based on massive data

QING Xin1,, WEN Wei-jun1, JIN Xing1, JIANG Zhen1

(75837 Troops, Guangzhou 510000, China)

Abstract: HBase solves the structured storage of massive data and real-time random read and write access. But, There is a performance bottleneck of HBase API in large scale data batch write, and it cannot meet the demands of application. This paper realized performance optimization of HBase based on MapReduce architecture, and designs the distributed programs. The Experiments show that in the massive data application condition, MapReduce can take the advantage of the calculating capacity of HBase cluster, and more practical and effective than traditional single thread and multi-thread data writing method. Combined with The performance characteristics of the three types of data write mode, this paper proposed a selection policy based on data amount.

Key words: MapReduce; Hadoop; HBase; massive data

云計算[1][2]实际是以商业应用为背景结合了之前学术界所提到的如“网格计算”、“互联网计算”、“按需计算”等概念发展而来的一种分布式计算模式,也正是因为其以商业应用为依托,云计算在近几年提到了快速的发展。云计算因其实用价值在工业界和学术界得到了一致的认可。作为一种全新的应用模式,云计算已成为人们提供服务、存储数据、进行数据挖掘等应用和研究的主要方式。

云数据库HBase[3][4][17]是Hadoop[5]的Apache顶层项目,它是BigTable[6]的开源实现。作者在实验室搭建了一个基于HBase的数据注册和发布的管理平台,在应用中发现HBase在海量数据的写入时,由于HBase提供的API接口是单线程操作,不能有效的利用HBase集群的计算资源,不能满足平台的性能要求。

本文结合实际问题,为了能提高HBase数据管理系统的效率,特别是在海量数据条件下的写入性能,采用MapReduce[7]编程模型与HBase相结合的方法进行性能优化,并进行了读写性能的测试。实验结果表明,MapReduce计算模型充分利用HBase集群中各个节点的计算资源, HBase的数据写入性能得到了极大的提高。

1 相关知识

1.1 MapReduce编程模型

MapReduce是Google提出的在分布式集群中并行处理少量数据的编程模型,把在大规模的数据集的操作分发给主节点管理下的集群中的各个资源节点来完成,极大地简化了分布式程序的结构和编写。MapReduce执行一个任务的过程可以分解为Job的分解和结果的汇总,这处理过程被MapReduce抽象为两个函数:map和reduce,map负责把任务分解成多个任务,reduce负责把分解后多任务处理的结果进行汇总,图1显示了MapReduce任务逻辑过程[8]。

从图中可以看出整个计算模型的核心部分是Map()和Reduce(),这两个函数的具体功能和操作是由用户根据需求自己来设计实现,只要能按用户自定义的规则,将输入的对转换成另一个或一批对输出。

在Map阶段,MapReduce框架首先将输入的数据分割成大小固定的数据块(Splits),随后将每个Split分解为一批键值对作为Map()的输入,经过处理计算得到中间结果,再按照key2进行排序,并把具有相同key值的value集中形成一个新列表,形成作为Reduce()的输入数据。

在Reduce阶段,Reduce()以为输入数据,按照用户自定义的操作进行计算,得到最终的结果并输出。

可以看出MapReduce计算过程充分地利用了分布式集群资源,使整个集群的计算具有了更高的效率。HBase是目前比较流行的云数据管理平台,具有分布式特性,那么利用MapReduce来进行性能优化是一个有效的选择。

1.2 HBase云数据库

HBase是基于HDFS的开源数据库,它以Google的BigTable为原型,设计并实现了具有高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统,用于存储粗粒度的结构化数据。HBase以表的形式存储数据,每个表由行和列组成,每个列属于一个特定的列族(Column Family)。表中由行和列确定的存储单元称为一个元素(Cell),每个元素保存了同一份数据的多个版本,由时间戳(Time Stamp)来标识,在逻辑上HBase是一张超大规模的稀疏表,如表1所示。

行键是数据行在表中的唯一标识,并作为检索记录的主键。在HBase中访问表中的行只有三种方式:通过单个行键访问、给定行键的范围访问和全表扫描。行键可以是任意字符串(最大长度64KB)[6],并按照字典序进行存储。

HBase是按照列存储的稀疏行/列矩阵,在物理存储中就是把逻辑模型中的一个行进行分割,并按照列族存储,同时表中的空值不会被存储。每个表被建立的时候都只有一个Region(HBase存储的单元),随着表中的记录数不断增加直到数据量超过Region定义的阈值时,Region就会被分割形成两个新的Region,每个Region存储大表中某个行范围的数据。所以当数据记录不断增加后,整个表将会由多个Region组成,而Region作为HBase分布式存储的最小单位,将会被分配到集群中各个Region服务器上,以达到负载均衡的目的。每个Region由一个或多个Store组成,每个Store保存一个列族的所有数据。每个Store又是由一个memStore和零个或多个StoreFile组成,StoreFile则是以HFile的格式存储在HDFS上的,如图2所示。

可以看到,HBase是以Region作为最小的单位实现负载均衡,多个Regions分配到集群中的各个资源节点从而使数据达到分布式存储的目的。并且在Region内部也是采用了分块存储的机制。那么,这种存储机制对于MapReduce的应用起到了很好的支撑作用,并且MapReduce能够识别每个Region的存储节点,从而把该Region的计算任务分配它存储的节点,达到了移到计算而不移动数据的目的,经证明这种方式能最大程度的利用集群性能和节约开销。

2 HBase写入性能测试与优化

HBase数据写入功能可以分为单数据写入和批量数据导入,其运用场景分别为数据注册和发布的管理平台中普通用户数据发布与注册、用户注册和数据修改等和传统RDBMS向云数据库的数据转移以及批量数据导入,本文对HBase这两种方式的性能进行了测试。

2.1 集群结构

首先在实验室搭建了HBase集群,并设计了针对性的应用,来对比使用MapReduce前后的性能差异。

实验环境中共有6台服务器,搭建完全分布式HDFS与HBase环境,采用的Hadoop与HBase版本为hadoop0.20.2[9]与HBase0.92.0[10],其中一台节点做为NameNode和Master,另一台做为Master备份节点,剩余四台则做为DataNode和RegionServer节点,并且在其上运行Zookeeper服务,整个实验环境结构如图3所示。

2.2 单线程数据写入性能

2.2.1 单个数据写入

单个数据写入实验的目的在于测试一条随机数据的写入性能,从而模拟用户在使用数据注册和发布管理平台时的数据写入操作,检测HBase性能是否满足平台设计要求,实验结果如图 4所示。

经过测试分析单个数据写入时间在200ms左右,可以看出测试性能完全满足实际运用,保证了系统性能良好。对其过程进行跟踪分析,发现数据写入时间主要消耗在客户端与HBase服务器建立数据连接,而實际的一条数据写入时间为1至2毫秒。

2.2.2 大数据的批量导入

数据注册和发布的管理平台[15][16]除了对普通用户提供数据访问外,还要对外部程序或系统提供批量数据写入和同步功能,实验测试了HBase导入不同规模数据所用的时间,导入数据为根据数据表格式随机生成的数据,其规模从10000条到1000万条,这样能够很好地测试HBase在各种条件下批量数据导入所需要时间。

生成数据为TXT文档,命名为MetaData+数据量。实验中记录用HBase提供的单线程API将各数据集写入HBase所用时间,结果如表2所示。

实验结果表明,数据写入时间随着数据集增大线性增加,经过计算,数据的写入速度平均为600条/秒(单次数据写入只需建立一个HBase数据连接)。如表中所示,在海量数据写入时将需要大量时间,当导入1000万条数据时要16688秒(4小时38分钟)。

2.2.3 结果分析

在HBase数据写入性能实验中,本文就HBase提供两种数据写入方式的性能进行了详细测试。一是单个数据的写入性能,在HBase集群中重复数据写入操作并记录所需时间,结果表明HBase的单个数据写入性能非常稳定,大约为200毫秒,能满足分布式资源虚拟化整合平台的性能要求。二是批量数据写入性能,由于HBase提供的数据写入API是单线程的,不能很好地利用HBase的集群计算资源,在海量数据条件下其性能较差,不能要求系统对海量数据处理的要求。

2.3 基于多线程的HBase写入性能优化

采用多线程对数据批量导入性能进行优化,本文主要测试了数据量和线程数量这两个条件对性能的影响。

首先,测试在固定数据量的基础上通过增加单机线程数对性能的影响,开始使用单线程,然后逐步增加线程数量,实验中使用MetaData1000000数据集,具体的结果如图 5所示。

可以看出,当保持数据量不变时,随着线程数量增加导入数据所需时间越来越少。当线程数量为1时需要大约1800秒,当线程数量为2时需要大约1000秒,性能提高了约80%,但是随着线程不断地增加性能提高的幅度起来越来越小。通过分析,实验所用服务器CPU为四核,那么当线程的数量达到4以后,程序不再保证每个线程分配一个处理核心,而只能在系统中抢占CPU时间片来完成任务,进程数为10时的性能提高大约为320%。实验表明在多核服务器中多线程方式对大规模数据批量导入性能具有一定的提升能力,但是受到单机计算能力的影响和限制。

其次,测试在固定线程数量条件下不同数据量的导入时间,由第一个实验可知,在大数据量的前提下多线程的性能要比单线程更好,为了全面研究多线程的适用范围,下面实验测试了多线程与单线程在小数据量下的性能差异,实验中线程数目为5,结果如图 6所示。

可以看出,当数据量过小时多线程导入数据消耗的时间比单线程更多,这是因为多线程的初始化消耗了一定的时间,但当程序启动之后多线程的导入速度要比单线程快,如图中显示随着数据量的增加多线程的性能表现越来越好,当达到约300条时两种方式消耗的时间相等,之后多线程的效率超过了单线程。

2.4 基于MapReduce的HBase性能优化

本节将测试运用MapReduce对HBase的海量数据写入性能优化的特性,实验将从集群机器数和数据量这两方面进行分析,所用数据集要导入HDFS[12][13]。

首先,测试MapReduce在导入不同数据量的性能。实验时RegionServer数量为两台,并且每台RegionServer运行两个Map任务,递增导入数据的规模,并记录所用时间,结果如表 3所示。

对表中数据进行分析,当数据量为10时,MapReduce程序用时约14秒,这是MapReduce程序启动的消耗,当数据量增加时MapReduce程序时间随之增加,这里MapReduce程序仍然只有一个Map在工作,但是当数据量大于64M(MapReduce默认处理的数据块为64M)以后,MapReduce程序将产生多个Map任务,从表中数据可知当数据量为50W和100W时消耗的时间基本相同,这是因为在实验集群中默认可以同时运行4个Map任务,而这50W和100W数据分别运行了2个和3个Map任务,所以整个Job的运行时间为耗时最长的Map任务所用时间。当数据量更大时,同时运行了4个以上Map就达到了集群的最好性能,表中可以看出1000万数据的导入时间约为500W的两倍。

实验中单Map任务时,HBase的导入速度比单线程的速度要快,这是因为采用MapReduce方式时,实验数据已经导入到HDFS中,并且根据MapReduce计算框架中Map任务分配策略(移动计算比移动数据更有效)确保了Map任务在数据所在服务器上进行运行,而单线程方式是通过客户端方式访问HBase提供的数据接口,数据导入需要通过网络通信。

其次,测试不同集群机器数量对HBase性能的影响。上一个实验指出,在小数据规模时,由于MapReduce分布式計算在集群中启动非常耗时,所以不适用于小规模的数据导入应用。本实验中增加集群机器数量,设置每台服务器可以同时启动2个Map任务,测试了不同集群规模在不同数据集中的性能,实验结果如图 7所示。

从图中可以看出,集群机器越多,导入等量数据所用的时间越短。当数据量越大时,这种差距越明显。在1000万条数据的时候,三台机器是10分钟左右,五台机器是6分20秒,时间缩短了约36%。集群机器越多,能够并行执行Map任务的机器就越多,因此数据写入时间就越短。

实验中HBase集群的写入性能且有一种阶梯式特性,这是因为MapReduce执行任务时,把整个Job分解成了多个Map任务执行,并且集群同时运行的Map数目是确定的,那么整个Job的完成须要等每一个Map任务完成,才能结束。例如,当集群机器数量为四台、数据量为600W时,整个Job被分解为18个Map任务,而系统可以同时运行8个Map,那么运行完16个Map之后,还剩下2个Map,其中有一个Map的数据量为64M,那么不管剩下的数据为多少,都必须与这个最慢的Map任务进行同步,同理,当数据量为700W时,当运行完16个Map之后,还剩下5个Map任务,由于集群可以同时运行8个Map任务,那么运行2个Map和5个Map的时间基本相同,五个Map任务同步通信更多[11],时间会多消耗点。

3 结果分析

从多线程和MapReduce两种并行处理方法出发,对HBase的海量数据批处理进行了优化,实验表明这两种方式都能提高HBase批处理性能,但是也有各自的缺陷。

多线程方法随着线程的增加性能呈线性提高,但是,当线程数量大于服务器CPU内核数量之后,其性能增加速度迅速降低,并且受到单台计算机处理能力和网络带宽限制,多线程方法的性能提升能力有限。

MapReduce方法对于海量数据处理的优化性能很好,因为MapReduce程序是运行在HBase集群上的,它充分的利用了集群的计算能力,随着集群的扩展MapReduce的计算能力也会提高。但是MapReduce任务的启动消耗非常大,并且在小规模数据时,由于并行启动的Map任务数据量不多,性能并没有多线程好。假设单机多线程相比单线程的最大加速比为N,当MapReduce处理的数据能够同时启动大于N个Map任务时,采用MapReduce计算方式效率比多线程计算效率更高,结果如图 8所示。

综合单线程、多线程和MapReduce方法的性能,在批量数据处理任务中根据数据量大小来选择合适的方法。当数据量很小,约在300条以下时可以选择单线程方法,实现简单而且性能也能达到要求,当数据量较大但不够MapReduce启动N(多线程最大加速比)个Map任务时建议采用多线程的方法,当处理海量数据时,采用MapReduce方法可以最大程度利用集群的计算性能。

实验结果表明在实现分布式资源虚拟化整合平台的过程中,必须结合系统功能和性能需求,合理选择数据处理方法,这样才能使系统性能达到最优。

4 总结

本文对HBase数据写入性能进行详细测试,全面了解其性能特性。通过测试找到了HBase的不足,并根据HBase数据库存在的性能缺陷。提出了采用多线程和MapReduce计算框架的并行处理方法来提高其性能,并对实验结果进行总结分析,提出根据不同应用场景综合运用不同数据处理方法的策略。

参考文献:

[1]Armbrust M, Fox A, Griffith R, et al. A view of cloud computing[J]. Communications of the ACM, 2010, 53(4): 50-58.

[2]陈全, 邓倩妮. 云计算及其关键技术[J]. 计算机应用, 2009, 29(9): 2562-2567.

[3]George L. HBase: the definitive guide[M]. O'Reilly Media, Incorporated, 2011.

[4]HBase [EB/OL], https://zh.wikipedia.org/wiki/HBase, 2013-04-10.

[5]Hadoop [EB/OL], https://zh.wikipedia.org/wiki/HBase, 2013-04-10.

[6]Chang F, Dean J, Ghemawat S, et al. Bigtable: A distributed storage system for structured data[J]. ACM Transactions on Computer Systems (TOCS), 2008, 26(2): 4.

[7]Dean J, Ghemawat S. MapReduce: simplified data processing on large clusters[J]. Communications of the ACM, 2008, 51(1): 107-113.

[8]李明, 胥光辉, 戢瑶. MapReduce 编程模型在网络I/O密集型程序中的应用研究[J]. 计算机应用研究, 2011, 28(9):3372-3374.

[9]http://hadoop.apache.org/docs/r0.20.0/releasenotes.html, 2011-03-13

[10]https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310753&version=12314223, 2013-03-13.

[11]Moise D, Shestakov D, Gudmundsson G T, et al. Indexing and Searching 100M Images with Map-Reduce[C]. ACM International Conference on Multimedia Retrieval. 2013.

[12]杜晓东. 大数据环境下基于Hbase的分布式查询优化研究[J]. 计算机光盘软件与应用, 2014(8):22-24.

[13]王海豹. 基于Hadoop架构的数据共享模型研究[D]. 北京工业大学, 2013.

[14]彭宇, 庞景月, 刘大同,等. 大数据:内涵、技术体系与展望[J]. 电子测量与仪器学报, 2015(4):469-482.

[15]孙知信, 黄涵霞. 基于云计算的数据存储技术研究[J]. 南京邮电大学学报(自然科学版), 2014, 34(4):13-19.

[16]劉晓静. 基于HBase的海量小视频存储与检索系统的研究与实现[D]. 西安电子科技大学, 2014.

[17]Lars G. HBase : the definitive guide : [random access to your planet-size data][J]. 2011.

【通联编辑:梁书】