一种基于数据倾斜的多路数据流连接系统
技术领域
本发明涉及了一种数据流连接系统和处理方法,尤其是涉及了一种依据流式数据的倾斜程度进行多路数据流连接的系统。
背景技术
时至今日,随着高新技术的进一步发展,尤其是人工智能、云计算、物联网等技术的发展,数据已经呈现出爆炸式增长,海量数据的计算分析服务影响着社会方方面面,为公众的生活和企业的运营决策提供服务。在通常情况下,这些数据体量大、时效性强、结构多样复杂,如何从海量实时数据中及时的获取准确全面的信息成了当前大数据研究的一个热门方向。
目前,针对实时数据流的数据处理方案主要有Spark、Flink、Storm等。Spark生态中针对流式数据处理开发出Spark Streaming架构。Spark Streaming把输入的数据按照batch size(如1秒)分成一段一段的数据DStream(Discretized Stream),每一段数据都转换成Spark中的RDD(Resilient Distributed Dataset),然后将Spark Streaming中对DStream的Transformation操作变为针对Spark中RDD的Transformation操作,并且变换的中间结果保存在内存中。Spark Streaming具有高容错性,准实时性以及扩展性强、吞吐量大。
Flink和Storm也是常用的大数据流式处理系统,它们都具有强实时性,高扩展性性,可以动态地增加节点增加整体的存储容量和并行计算能力,同时数据冗余备份机制保证数据不会丢失。
目前一些发明人针对数据流的连接也提出了自己的解决方案。
现有的一种分布式等值数据流连接方法(中国专利申请CN201510998218)。该发明提出一种新型的分布式等值连接方法,该方法包括代价模型计算,使用提出的代价模型,选择开销代价最小的连接方案;数据分发,将需要连接的数据流发送到同一个task中,task为在具体线程中执行的任务抽象,将task分配到不同的节点中运算,使需要连接的数据流在同一个节点运算;数据连接,将接收到的数据构成关系数据模型,通过关系树模型连接和降载数据。
数据流连接方法及装置(CN201610965692),本发明提出一种数据流连接方法及装置,通过动态调整数据流连接顺序,实现提高数据流连接效率的目的。具体实施过程是,根据至少三个数据流各自的属性,确定出数据流之间的连接谓词,根据连接谓词得到至少三个数据流依次相邻的第一连接顺序,确定连接谓词中的各属性的值的数据分布。然后在接收到任一数据流的新元组后,对该数据流的属性对应的数据分布进行调整,最终根据调整后的数据分布,将第一连接顺序调整为第二连接顺序。
但是上述现有技术仍然存在不少缺陷不足和局限。
一方面,现有的流式大数据处理的技术方案例如Spark、Flink、Storm等没有基于数据倾斜进行多路数据流的连接,或者只适合于等值连接而不适用于非等值连接,或者针对连接次序而只针对三路及以上数据流连接。
另一方面,随着数据量的大规模增长以及查询结构的复杂化,在实践中发现了:在对海量流式数据进行查询时,需要在最短的时间内对多个数据流进行查询连接操作以获得完整准确的结果,而在现有的解决方案中还没有提出通过减少键值冗余提高连接查询效率的方案。
发明内容
本发明涉及的是一种基于数据倾斜进行多路数据流连接系统的实现方案,系统使用一种全新的组连接算法,解决多路数据流连接过程中键值冗余的问题。
所谓数据流是指一个包含信息的序列,在这个序列中信息一个接一个,彼此相互独立而不是作为一个整体来传送。数据流S={s1,s2,…,si,…}是大量的数据以一种速度连续不断的到来形成的数据序列,每个数据到来的顺序无法预知,用户只能有限次的遍历这个序列。
数据流连接操作是为了获取完整全面信息,是分布式流式数据处理中非常重要的一个环节。不同于数据库中多表的连接是对表中元组进行笛卡尔积,数据流连接由于其自身数据量的无限性,连接时一般引入了滑动窗口机制,连接只针对窗口内的数据。
所谓键值(Key)指的是数据流连接时指定的连接属性,即数据流连接时与连接谓词相关的属性。本发明中为了方便,将数据流中除了连接属性其他的属性统称为属性值(Value),数据流中的信息简化成多个(key,value)元组。所谓键值冗余指的是在滑动窗口中相同键值的元组多于一个。
为了解决背景技术中存在的问题,本发明解决的最主要的技术问题是设计出了一种多路数据流连接的系统,是一种基于数据倾斜的多路数据流连接系统,通过分析流式数据的特征并结合发明的组连接算法进行多路数据流的连接优化。
本发明系统采用优化连接方法——组连接来解决多路数据流连接查询优化问题。本发明系统中的数据主要通过数据采集模块和数据缓存模块获取;数据流的连接主要通过预处理模块、变换模块、连接模块、扩展模块和查询解析模块实现;最终数据连接的结果由结果存储模块持久存储。
如图1所示,本发明采用的具体技术方案是:
本发明依据流式数据的倾斜程度进行多路数据流连接,实施的系统包括数据采集模块、数据缓存模块、预处理模块、变换模块、连接模块、扩展模块、结果存储模块、查询解析模块和操作界面;数据采集模块输出端经数据缓存模块连接到预处理模块的输入端,预处理模块的输出端经不同窗口连接到变换模块的输入端,变换模块的输出端经不同的窗口连接到连接模块的输入端,连接模块的输出端经扩展模块连接到结果存储模块,同时扩展模块的输出端连接到操作界面,操作界面输出端连接到预处理模块,操作界面输出端经查询解析模块分别连接到变换模块和连接模块。
所述的系统具体为:
包括数据采集模块,从系统外部数据源接收多路数据流,多路数据流输入到数据采集模块,数据采集模块同时将多路数据流布发送到数据缓存模块;数据采集模块能实时采集处理数据流,主要提供数据读、写、过滤等功能。
包括数据缓存模块,接收来自数据采集模块的各路数据流并存储,同时将各路数据流对应发送到预处理模块;数据缓存模块主要提供数据缓存功能。数据缓存模块为每个数据源的数据流自动创建一个主题topic,方便后续子系统的模块对数据的自动获取;
数据采集模块与数据缓存模块主要可以通过自主定制设置,管理员配置等手段,实现同时对多个数据源数据采集、过滤以及缓存。
包括预处理模块,接收来自数据缓存模块的各路数据流和来自操作界面的配置文件,根据配置文件从数据缓存模块中获取数据流,为各数据流创建各自的数据框架DataFrame,并按照预定时间划分成一系列窗口;
配置文件中包含了数据流的主题topic、各属性名称和窗口时间等信息。
包括变换模块,接收来自查询解析模块发送过来的数据流的连接属性信息,变换模块依据数据流中连接属性的字段并结合组连接算法对数据流在窗口内进行变换,注意的是变换是在窗口内进行的;
本发明的组连接算法对各路数据流重新分配处理,实现依据数据特征进行多路数据流连接。
包括连接模块,接收来自查询解析模块的查询计划,根据查询计划对数据流进行连接;
包括扩展模块,接收来自连接模块发送过来的重组连接后的数据流并进行扩展,分发送到操作界面和结果存储模块;
包括结果存储模块,接收来自扩展模块发送过来的重组连接后的数据流进行储存;
包括查询解析模块,接收来自操作界面发送过来的查询语句SQL并进行解析获得数据流的连接属性和查询计划,将连接属性发送到变换模块,将查询计划发送到连接模块;
包括操作界面,接收外部输入的需求信息生成配置文件并发送到预处理模块,接收外部输入的查询语句SQL发送到查询解析模块,接收扩展模块发送过来的重组连接后的数据流并进行显示;
具体实施中,提供一站式系统管理和交互环境,用户直接通过Web端设定和修改系统参数,实时监控集群的运行状态。
本发明中的核心是组连接算法,所述的组连接算法在秒级窗口大小且连接结果的选择率(Selectivity)小于1/4情况下实施,其具体为:在数据流进行连接之前,将数据流中具有相同键值的元组(key,value)聚合为同一元组模型(key,valueList)然后发送到连接模块,使得后续的分布式系统能同时处理相同元组模型(key,valueList)中的元组;本发明将此方法称之为数据流中的组连接(GroJoin)算法,整个过程如图2所示。
通过将具有相同键值key的元组归为分组到同一元组模型(key,valueList)中,将每个元组模型(key,valueList)视为一个基本元素进行同时处理,这样能减少键值冗余提高连接查询效率。
元组模型(key,valueList)不仅保留了元组(key,value)的某些特征,而且还具有批处理的优点,可能会大大降低网络传输的成本。
但是,在上述算法中实验发现并不是每个组连接都可以提高连接效率,本发明通过实验探索发现了组连接执行的条件,在秒级窗口大小的情况下,连接结果的选择率(Selectivity)应该约小于1/4。
若在秒级窗口大小且连接结果的选择率(Selectivity)小于1/4情况下,则在常规的变换模块数据流处理方法下实施组连接算法,这样能显著提高数据的效率和精度。
若在秒级窗口大小且连接结果的选择率(Selectivity)不小于1/4情况下,则在常规的变换模块数据流处理方法下不实施组连接算法,而是仅执行常规的变换模块数据流处理方法。
所述的配置文件中包含了数据流的主题topic、各属性名称和窗口时间等信息。
所述的数据采集模块使用但不限于Flume海量日志采集系统,可被替代为Logstash等;
所述的数据缓存模块使用但不限于Kafka开源流处理系统,可被替代为RabbitMQ等;
所述的数据计算引擎使用但不限于Spark数据流处理系统,可被替代为Flink,Storm等。
所述的结果存储模块使用但不限于PostgreSQL对象关系型数据库管理系统,可被替代为MySQL等。
本发明中,单数据流数据倾斜定义为在单个数据流中整体元组数目和不同键值数量的比值。多数据流数据倾斜定义为多个数据流中单数据流倾斜值的乘积。
在对海量流式数据进行查询时,通过本发明的处理方式能在最短的时间内对多个数据流进行查询连接操作以获得完整准确的结果,通过减少键值冗余提高连接查询效率。
本发明的有益效果和优势有:
现有的流式大数据处理方案例如Spark、Flink、Storm等没有基于数据倾斜进行多路数据流的连接。而本发明能统计滑动窗口中流式数据的特征,然后基于这些特征运用组连接算法,实现多路数据流的连接。
现有的一种分布式等值数据流连接方法通过计算代价模型并选择最小的计算代价来进行数据的连接。但这种方式只适合于等值连接,对于非等值连接不适用。而本发明提出的一种数据流优化连接方案,这种解决方案适用于多种连接属性,包括等值连接以及非等值连接(如大于,小于等)。而且,本发明不限于等值连接,在theta连接方面的效果更加显著。
现有的数据流连接方法及装置通过实时更新窗口中数据的分布动态调整数据流连接顺序,此方法只针对三路及以上数据流连接。本发明不针对连接次序,而是获得并利用数据倾斜的特征,并且支持二路及以上数据流连接。
此外,在本发明的多路流式数据连接处理方案中,可以进一步结合采用Flume、Kafka和Spark、PostgreSQL等开源组件,能更好地融合了Flume高可靠的数据采集能力、Kafka高吞吐消息发布/订阅机制并结合Spark海量数据计算能力实现多路数据流连接功能,实现海量流式数据采集、缓存、处理以及存储的流程。
本发明除了组连接设计以外,还设计了查询解析、连接优化等方面,实现多路数据流的连接优化,使得在Flume、Kafka、Spark和PostgreSQL组合的架构上实现数据流的采集、缓存、查询连接以及存储的机制,在Flume、Kafka、Spark和PostgreSQL组合的架构上实现数据流的采集、缓存、查询连接以及存储的机制,能支持基于数据倾斜的多路数据流连接系统的架构方式,支持二路及以上数据流的优化连接。
具体实施中,系统通过结合操作界面能实现系统配置、数据查询的自动化实现方式。
本发明可以完成流式数据的采集、缓存、处理以及存储的过程,且系统配置人性化,界面友好,数据可视化程度高。
本发明可以运用于海量流式数据的连接查询,总结具有以下突出优势:
(1)本发明处理数据量巨大,数据的维度、范围、量级都不受限制,可达到TB级,甚至PB级;
(2)本发明可以处理二路及多路数据流的连接查询。
附图说明
图1是系统总体架构图;
图2是本发明变换模块的(key,valueList)处理过程图;
图3是系统的数据流程处理图;
图4是系统集群拓扑图;
图5是数据采集缓存流程图;
图6是连接查询模块实现图;
图7为实施例在不同概率分布上的性能结果图。
图8为在选择率、数据流速和窗口大小不同参数配置下,系统的性能结果图。
具体实施方式
下面结合附图及具体实施例对本发明作进一步详细说明。
本发明通过实验验证了技术方案,并且采用相应的优化方法条件稳定了连接结果的输出延时。
本发明技术方案的总体架构可从功能上分为数据采集缓存、数据连接处理、结果存储展示三大模块。系统执行作业的基本流程图见图3,具体流程如下:
(1)数据采集模块采用Flume,多源数据被数据采集模块Flume采集后,首先进行数据过滤,只保留需要的数据。过滤条件根据需求由管理员来编写代码实现。数据缓存模块采用Kafka,采集的数据被推送到数据缓存模块Kafka,数据缓存模块Kafka根据指定的主题topic名称为每个数据流创建主题topic,用于缓存数据。
(2)本发明系统采用大数据计算引擎Spark完成流式数据的连接查询。Spark从数据缓存模块拉取流式数据,然后根据用户设定的属性名称为每个数据流创建数据框架DataFrame,并且根据设定为每个数据流添加滑动窗口。
(3)数据变换模块以滑动窗口为单位进行数据的变换操作。如果窗口内的数据满足组连接条件,则对窗口内的数据进行聚合操作,聚合结果会被推送到连接模块;如果不满足组连接条件,则不对窗口内的数据进行聚合操作,直接进入连接模块。
(4)连接模块根据查询计划对数据流进行连接查询。查询解析模块解析用户输入的SQL语句生成查询计划。查询解析模块是在现有SQL解析器上进行,删减了与流式数据连接不相关的算子。连接模块执行连接查询,并把结果推送到结果扩展模块。
(5)结果扩展模块扩展连接查询结果,并把结果推送到用户界面和数据存储模块。用户只需要从网页端发布查询操作,提交后系统自动获取数据、执行连接查询、提供查询结果。
本发明的实施例如下:
本实施例实验中整个集群共有15台机器,其中每台硬盘大小为300G,内存32GB,CPU为64位AMD Opteron 6174,主频2.2GHz,运行的操作系统是64位的CentOS 7。本系统所在的集群部署在HP刀片式服务器上,服务器有15个刀片机。刀片机命名依次为node01~node15,每台物理刀片的磁盘(硬盘)大小即为300G,如图4所示。
本系统数据采集模块、缓存模块部署在节点node13、node14、node15节点上。查询结果存储在node12节点上。系统流式数据查询连接模块部署在node01~node11节点上,采用典型的Spark集群主从架构。其中节点node01为主节点master,其余节点为从节点worker。下面从数据采集缓存、数据连接查询、数据存储展示三部分对本发明的技术方案进行详细的阐述。
例如,针对数据库中的车牌数据进行处理,元组(key,value)中的键值key为车牌,元值value为车牌相关的历史记录信息,比如车辆位置、速度等。
(1)数据采集缓存的实现
本系统数据采集缓存部分采用了Flume和Kafka技术实现,由Zookeeper分布式应用协调系统负责Kafka集群的管理,如图5所示,各自功能概述如下:
1.1)使用Agent系统对数据源产生的数据进行采集。组件Source负责数据的采集以及过滤,过滤功能的实现是管理员根据用户需求自定义过滤器实现的。Channel组件负责接收Source组件的信息并推送到Sink组件。Sink组件负责根据预定义的配置信息把数据写入到Kafka中指定的主题topic中。
1.2)Kafka集群接收Flume模块采集的信息并暂时缓存。本系统设定Kafka中数据备份数为2,分区数为48。
1.3)用户通过系统操作界面修改Flume和Kafka的配置信息以及创建新的topic。
(2)数据连接查询的实现
本系统的连接查询模块运行在Spark集群上。其模块实现图如图6所示,实现步骤如下:
2.1)数据缓存模块获取多路数据流,为Spark集群提供连接查询数据。
2.2)Spark集群获取缓存模块的数据进行多路数据流连接查询。
·用户针对待处理的数据源进行配置文件设置,Spark集群根据配置文件的内容进行系统配置。
·预处理模块根据配置信息为各数据流属性设定名称,并把各路数据流转换成数据框架DataFrame。
·变换模块统计窗口内的流式数据信息,若满足组连接条件则对窗口内数据进行聚合操作,把窗口内具有相同键值的元组(key,value)聚合成元组模型(key,valueList),若不满足则不做任何操作。
·连接模块依据查询计划进行数据流的连接。查询计划是查询解析模块解析SQL查询语句得出的。
·扩展模块对连接的结果进行扩展,把窗口内数据的元组模型(key,valueList)还原成元组(key,value)。
2.3)结果存储模块负责把最终的结果写入到存储层。
(3)数据存储展示的实现
系统展示模块采用前端框架FLEX,通过MXML框架来进行组件布局和数据绑定。具体实现如下:
3.1)登录窗口设定有两种用户账号:管理员账号和普通用户账号。这两种账号是通过用户id区分的。管理员有权限对系统配置文件进行配置,而普通账号只可以查询数据分析结果。
3.2)配置信息管理项通过调用Kafka和Spark的api接口直接配置Kafka和Spark集群的基本参数,实现系统配置的自动化。
3.3)系统实时运行状态项通过调用Spark的Web接口在线监控系统的工作情况;通过调用Kafka Offset Monitor的Web接口在线监控Kafka集群的运行情况。例如系统的负载、每台机器CPU、内存、磁盘占用率等等。
3.4)数据操作项直接与通用数据配置服务器通过socket端口通信,当数据源有变化时,再以xml格式更新服务器的数据源相关配置文件。
3.5)数据操作项直接通过调用shell脚本的方式,运行已经部署在网站的实时连接查询作业。
通过上述真实实验得出,本发明所设计的系统支持用GNU/Linux作为开发和生产平台。可以在由多个节点构成的集群上演示系统的运行,而且只要Spark允许,还可以继续扩展。
结果详见图7,图中可见,在不同概率分布上的性能结果,性能稳定,并且比优化前连接延迟短。在选择率、数据流速和窗口大小不同参数配置下,系统的性能稳定,比现有的Spark streaming性能提高40%左右。
本发明的数据流处理实施例实现方案如上所述,数据采集模块使用Flume实现系统数据采集功能,保留Flume可靠性、可扩展性的特点;数据缓存模块使用Kafka实现了缓存数据的功能,保留Kafka吞吐量大、易扩展的特点;数据连接查询模块使用Spark实现系统流式数据连接查询功能,保持了Spark的性能优势已经良好的可扩展性,实现了系统最初功能要求;界面展示模块是整个系统自动化部署、运行、呈现结果的良好体现。