智能电网是电网的智能化, 通过将信息技术、通信技术、计算机技术与原有的电网高度紧密地集合到一起的新型电网, 实现电网的可靠、安全、经济、高效、环境友好和使用安全的目标。但是随着电网智能化的不断提高, 其数据量也随之以指数级的增长。面对这海量数据的存储的难题, 国内已有电力调度系统的建设大多采用常规的解决方案, 即采用昂贵的大型服务器为基础, 通过传统的关系数据库的方式管理, 并且以数据库分片的方式存放到磁盘阵列中的形式[1]。这导致系统的扩展升级较为困难, 费用十分高昂, 且整个系统模块间耦合性较强, 难以满足电网智能化所要求的高效、可靠、经济的目标[2]。
云存储能够解决智能电网对海量数据的存储的难题, 最大限度地整合系统的存储能力, 减少电网智能化的成本, 大幅提高当前系统的整体性能, 对智能电网的发展起到巨大的推动作用。云计算虽然在智能电网方面未见成型的系统[3,4], 但已经在其他领域得到了大量的应用[7,8], 而且智能电网方面的云计算系统也在架构设计开发阶段了[9], 但是Hadoop集群在处理电网大数据上具有巨大的优势[1,12]。
Hadoop作为一个开源的云计算基础框架, 一个分布式系统基础架构, 可以使用户充分利用集群的威力高速运算和存储, 具有可靠的数据存储和处理能力、易于扩展的计算机集群、以高容错性的多数据副本、以软件开源及廉价计算机集群带来的低成本等优势, 正成为信息领域研究的热点。
HBase (Hadoop Database) , 是一个在HDFS系统基础上的高可靠性、高性能、面向列、可伸缩的分布式No SQL数据库, 是谷歌公司Big Table技术的开源项目[15], 利用HBase技术可在廉价PC服务器集群上搭建起大规模非关系结构化快速读写的存储仓库。
Map Reduce作为并行处理大数据集的软件框架, 在Hadoop上得到了实现[7]。它负责分配工作以及与用户程序进行通信, 通过把对数据集的大规模操作分发给网络上的每个节点上, 实现数据的分布式处理。
智能电网环境下电力数据具有:规模大、类型多、价值密度低和变化快的特点[5], 按照数据的产生源大致分为三类:一是电网运行和设备检测或监测数据;二是电力企业营销数据, 如交易电价、售电量、用电客户等方面的数据;三是电力企业管理数据[5]。因此随着时间的增长, 存储电网数据所需的空间将越来越大, 同理在查询数据时也将更为费时费力。
针对上述智能电网数据的特点, 结合Hbase分布式数据库稀疏存储、自动切分数据、提供高并发读写操作等特点, 构建出智能电网数据云存储系统。
如图1所示为云存储系统的结构图, 整个系统由存储客户端、Hadoop服务器集群、查询客户端三部分组成。数据源包括智能电网中的发电、变电、输电、用电、调度、销售、财政等数据, 由各类监控管理设备或终端经由以太网等网络传输, 并经由存储客户端存储到集群当中。系统核心是以大量廉价的PC机为基础, 通过Hadoop分布式框架搭建的服务器集群, 由少量的Name Node (负责维护文件系统命名空间) 和大量的Data Node (负责存储数据块) 组成。图1左边是存储客户端, 负责将上传的数据映射成Hbase数据库Htable表项, 并且存储到Hbase数据库中;右边为查询服务器, 负责处理海量数据的查询, 为数据分析应用提供海量数据基础。
通过虚拟化技术, 在安装Windows 7操作系统的PC机上, 安装VMware Workstation 10, 虚拟Linux环境, 形成一个处于10.10.11.0段的局域网络。在各机上安装JDK、SSH、Hadoop-0.20.2以及Hbase-0.90.5, 完成搭建一个完全分布模式下的Hadoop集群, 最后再在各机上安装Zookeeper-3.3.4来管理Hadoop集群。
创建Hbase表时需要确定表的结构和表的属性。表的结构有三种基本类型包括:行关键字 (Row Key) 、时间戳 (Time Stamp) 和列族 (Column Family) 。其中行关键字由用户ID (类型为32位二进制) 、数据存入时间 (Datatime类型) 、数据类型 (String类型) 、数据行ID (类型64位二进制) 四个部分组成的字节数组, 由Row Key生产器生成。时间戳根据输入数据的时间戳而定, 若数据为静态数据本身无时间戳则由存入数据库时间为时间戳的值。列族, 利用其稀疏和动态创建列的特性, 根据输入文件描述的对象动态创建列并且把数据存到对应列中。而表的属性主要用到的有:数据行最大版本数, Hbase通过保留旧版本以预防误操作, 在这由于数据被修改的可能性较小故设为3;压缩算法, 使用snappy算法, 其压缩效率与lzo相近但解压效率远高于Izo, 使数据查询速度加快。
实验以调度系统向云存储系统进行数据上传为例, 将一台PC机作为调度系统数据发生端, 将满足国标DLT890[12]标准 (转化自IEC系列标准) [6,11]的数据上传到集群。其中数据包含了地理 (GIS) 信息、电力设备和线路信息、财政信息、负载信息、量测信息、电力保护信息、设备储备与损耗信息、预测及计划信息等[14], 这些信息数据以通用信息模型及其拓展模型为模板形成, 并且通过RDF (Resource Description Framework) 网络资源描述语言[10]的方式描述, 如图2所示。
在实验里, 存储客户端根据用户信息和相关配置信息创建配置信息并且初始化Row Key工厂以及创建数据行上传缓冲区HTable Pool, 然后将上传文件中的数据映射为数据行存放到上传缓冲区中, 当缓冲区存放的数据行达到一定的行数再提交实行稀疏的磁盘存储, 如表1所示, 且数据项中可以含有空的列项, 并且为空的数据项不占用任何存储空间。由于HTable是有序的且Hbase具有自动切分数据的能力, 故只需控制存储数据行的Row Key不连续递增, 就能把数据行均匀的存到集群机器上, 保持机器负载的均衡, 避免了新数据扎堆存储到相同的机器上降低整个存储系统的I/O性能的现象。
上述数据上传的详细过程如图3所示, 其中上传缓冲区通过HTable Pool类对上传的数据行进行缓冲和管理, 除此之外通过建立上传文件流队列实现用户的多文件上传操作。
Hbase轻量化地集成了Hadoop中的Map Reduce并行运算模型[9], 并且根据自身的特点突出优化了其表查询的效率以及提出了基于Map Reduce的表查询函数。因此用户在查询时主要设计的是Table Input Format、Table Mapper、Table Reducer、Table Output Format四个函数[8], 其整体查询过程如图4所示。
1) Table Input Format函数, 负责将数据以表的形式通过表分割成为Splits, 然后提交给Map函数。
2) Table Mapper函数, 负责处理Table Input Format函数提交的Splits, 配置Row Key值的范围、该数据项的版本、过滤器等设置, 确定数据查找的条件并创建扫描读入对象Scan, 最后将查询到的数据交给Table Reducer函数。
3) Table Reducer函数, 负责对查询到的数据进行分析处理。实验中由于无特殊应用需求, 只对查询数据进行了排序, 提交到Table Output Format函数。
4) Table Reducer个数配置, 通过配置Table Reducer个数能够调节H a d o o p集群的负载以及该Map Reduce任务的处理速度, Table Reducer个数在很大程度上影响整个Map Reduce任务的效率。
5) Table OutputFormat函数, 除了负载汇总Table Reducer函数处理完的数据以外, 还提供了底层刷新的机制, 大大地增加了大量数据在相界面呈现时的速度。
图4 查询过程
本文的所有实验均在实验室搭建的Hadoop平台上运行。平台有9个节点组成, 均为廉价PC机, 每个节点的物理配置为双核CPU, 主频为2.0MHz, 内存为2G, 网络带宽100Mbps局域网, 硬盘为100G, Hadoop版本为0.20.205, Hbase版本为0.90.5, 数据行最大版本数为3。
实验是在集群无其他任务的条件下, 使用测试客户端以不同的配置测试Hbase的I/O性能, 以得到Hbase的I/O性能最优时Hbase的配置。其中影响Hbase的I/O性能的主要因素是要在集群上开多少个并行进程来处理查询和分析处理任务。
1) 实验中只改变Map Reduce的并行进程个数 (即改变每个Input Split的大小) , 保持其他条件不变, 创建查询170万行数据的任务并获取任务运行时间, 结果如图5所示。
2) 控制Map Reduce的并行进程个数 (Map和Reduce任务均为18个) 及其他条件不变, 只改变查询数据行的数量, 从10万行到350万行, 并获取任务运行时间, 结果如图6所示。
由上述两组实验可以看出, 每个Map Reduce任务的并行进程个数太少时集群资源没用充分地利用查询速度降低;而并行进程个数太多时, 虽然数据处理的速度有所增加, 但却浪费了大量的时间在进程创建和节点通讯上, 反而得不偿失;除此之外如果每个进程处理的数据过多会大量占用节点内存, 导致该节点无法处理别的进程, 降低了效率。因此根据上述两个实验得出在集群用18个进程且每个进程生命周期为20秒 (即处理约170行数据) 时得到较好的效率。故对于本集群, Map Reduce的并行进程个数应设置为[查询数据行数/90000]+1。这样设置虽然牺牲了集群的小部分任务处理速度, 但是却使集群在多任务高负载运行下保证每个任务的处理速度。
实验是在集群无其它任务运行且Map Reduce配置相同的条件下, 使用测试客户端对Hbase进行写入数据和查询数据, 将同样的数据放到Oracle系统 (四核CPU, 8GB内存, 硬盘650GB) 里查询并统计时间。
由上表2可以看出, 当数据量低于80万行时, 单机服务的传统Oracle数据库有很大的优势;但是随着查询数据量的增大, 集群Hbase数据库的优势越来越明显。但是当在大量数据入库时, 两种数据库系统写入速度都不太理想, 不过针对这一问题, Hbase也提供了一种与数据库文件导入类似的以Hfile (按照Hbase数据格式存储的文件格式) 的方式入库, 其写入速度与HDFS速度一样[13], 并且在文件格式转换时, 还能通过Map Reduce的方式利用集群的整体性能快速地将数据转换为Hfile。综上, 该集群非常适合存储大规模的存储次数频繁但每次数据量不多的智能电网大数据, 且在电网大数据处理上具有快速、可靠、廉价的优势。
本文研究了基于Hadoop的智能电网数据云存储系统, 首先分析智能电网数据的特点, 利用Hbase分布式数据库的特点, 设计并实现了智能电网数据云存储系统。搭建了具有9个节点的廉价PC机组成的Hadoop集群, 然后开发了基于Hbase以及Map Reduce的存储和查询客户端, 并且对集群进行了大量的实验, 包括Map Reduce配置实验和与HDFS性能比较实验, 表明了本集群适合应用于智能电网大数据的存储, 并且提供了快速处理大数据的能力, 在行业电网数据分析中具有快速、有效、可靠、廉价的优势。
【本文标签】
【责任编辑】平文云仓