基于流计算框架的对比实验研究

2021-09-30 01:26韩雨轩李盼颖温秀梅马兆辉张书玮
河北建筑工程学院学报 2021年2期
关键词:流式设计图数据结构

韩雨轩 李盼颖 温秀梅,3,* 马兆辉 张书玮

(1.河北建筑工程学院,河北 张家口 075000;2.哈尔滨工业大学(深圳),中国 深圳 518055;3.张家口市大数据技术创新中心,河北 张家口 075000)

0 引 言

随着信息时代的不断发展,人们每天在互联网中产生的数据量迅速膨胀.对于数据信息中价值的挖掘成为当下的热点和人们关注的焦点,而数据的价值随着时间的流逝不断的降低,所以人们对于获取数据信息和处理数据信息的时效性都有了更高的要求.实时到来实时处理的数据称为流数据,也叫动态数据.不同于静态数据,流数据以大量、快速、时变的流形式持续到达,需要计算框架对其进行实时数据采集和计算处理,而传统的批处理框架为了提高吞吐量牺牲了实时性,无法适用于流数据的实时处理.为了解决这个需求,多种实时流计算框架相继诞生,它是专门面向动态数据处理的计算平台[1],具有低延迟、可扩展、高可用等特点,广泛应用于金融服务、网络监控、电信数据管理、Web应用、生产制造、传感检测等应用领域.本文主要介绍两种时下应用广泛的流式计算框架Storm和Spark Streaming,通过实验分析这两种框架的结构和工作流程,并对比分析了两种框架之间的不同点,最后对基于Spark Streaming的实验进行了改进[2],在集群环境中对Spark Streaming、Flume和Kafka进行了整合.

1 相关知识

1.1 Storm

Storm是应用广泛的流式计算框架,由stream、spout和bolt组成,其中,stream是传输的数据流信息,spout是数据流的源头,也就是生产者,bolt是数据流在运算过程中的某个阶段.整个结构可以称为一个拓扑(topology),如图1所示.在Storm流式计算框架中,从数据流源头到数据计算的过程持续运行,直到进程结束部署[3].

图1 Storm结构图

在Storm中,stream由任意多个元组组成,元组(tuple)是Storm中的核心数据结构,它是由任意多个键值对组成的列表.

spout是Storm中数据的源头,数据流在spout中被转换为Storm的数据结构tuple,作为连续的数据流传递到负责运算的节点[4].spout可以接收的数据源有很多种类,例如网站上的点击流数据、社交软件上产生的实时信息、采集器采集的日志信息等.storm将数据转换和处理业务逻辑分离,不仅使spout的开发更为便捷,也增强了它的复用性.spout开发的主要内容是消费数据源的实时流数据.

bolt是Storm中负责处理业务逻辑的组件,它从spout接收tuple数据流,并在进行相应的逻辑计算后,将结果发送到下一级的bolt中进行下一阶段的业务处理.bolt常用的计算功能包括过滤、聚合和计算.bolt的传递关系根据用户的业务需要进行组建,可以形成复杂的Topology结构[5].

1.2 Spark Streaming

Spark Streaming是基于Spark的流式计算框架,可以对动态数据进行高通量,高容错处理,spark Streaming可以灵活选择数据源,例如:采集系统获取到的数据流,或者通过TCP套接字获取的数据流等.它可以对获取到的数据流进行Map、Reduce和Join等复杂操作.最终Spark Streaming将计算后的结果数据存储到文件系统或分布式数据库中[6].

Spark Streaming的工作原理和Storm不同,它本质是Spark的改进,是将实时流式数据以细小的批处理作业进行计算,实现流式数据的实时处理.Spark Streaming中的对数据进行离散化(Discretized)处理,依照一定的batch size将动态接收的数据转化为Spark Streaming中的数据结构DStream.在Spark Streaming中,对DStream的Transformations操作会进一步变为RDD的Transformations操作,每一步的中间结果以内存的形式缓存[7].

计算过程根据用户的业务需求进行设计,最终输出到外部数据库进行存储,整体架构如图2所示.

图2 Spark Streaming流程图

DStream是一种抽象的数据结构,在Spark Streaming计算框架中,DStream可以表示为连续性的RDD,也就是持续性的数据流.这里的RDD包含一小段时间内的数据流,整个计算过程中对数据的处理同样是以RDD为单位进行的,计算过程由Spark引擎Spark core来完成[8].流程如图3所示.

图3 DStream流程图

2 实验分析

分别在Storm和Spark Streaming流计算框架中设计实验进行分析,实验及改进设计Storm、Spark Streaming、Flume、Kafka等技术,各软件具体版本如表1所示.

表1 软件及对应版本表

2.1 实验设计

实验中,Spout不断读取数组中的语句作为数据流的来源,并以行的形式读取到Tuple中,传输给SplitBolt进行单词的切分,然后制定消息流在Bolt之间的传输规则——Strom消息流分组.目的是为了在进行单词计数的时候,同一个单词的统计发送到同一个WordCountBolt上,SplitBolt订阅Spout发射的tuple,每接收到一个tuple就获取"line"对应的值,并保存到一个字符串中:String line=input.getStringByField("line").将获取到的数据流以空格切分为单词,保存到字符串数组中:String[]words=line.split("").最终切分后的单词会向下一级Bolt发射tuple:collector.emit(input,new Values(word)).形式如:{"word","hallo"}.

WordCountBolt订阅SplitBolt的输出,用来计算单词的当前频率.每接收到一个到来的tuple,会将tuple中单词的频率加一:map.put(word,map.get(word)+1),并向后发送该单词的当前频数,形式如:{"word":"I","count":3}.

最终结果通过reportBolt进行输出打印,输出为当前单词统计的当前频率,打印结果形如:“单词:word的当前频次为107”.实验过程,通过ack确认机制来确保数据传输的可靠性.整体设计如图4所示.

图4 Storm实验设计图

实验中Storm的Topology设计如图5所示.

图5 Topology设计图

同时,在单节点上进行Spark Streaming的实验设计,通过监听Socket获取数据,该处需要提供Socket的主机名和端口号,数据保存在内存和硬盘中.信息的获取流程如图6所示.9999端口为NC开启的端口.为避免Spark Streaming只处理最新数据流信息,而不缓存旧的历史结果,需要通过chekcpoint方法设置检查点,通过检查点将之前处理的RDD结果存入到指定的目录.利用updateStateByKey函数对数据流的处理结果进行累加,然后传入一个自定义的累加函数updateFunc:

图6 信息获取流程图

iter.flatMap{case(x,y,z)=>Some(y.sum+z.getOrElse(0)).map(m=>(x,m))

2.2 对比分析

通过实验,可以看到虽然两框架都提供了可扩展性和可容错性,但是它们的处理模型从根本上是不一样的.实验中Storm使用Java语言进行程序开发,编程模型为Spout/Bolt,而Spark使用Scala语言,编程模型为DStream.Storm框架每次实时处理一条接受到的event,而Spark Streaming是在一个短暂的时间间隔里处理小批量的Event,其数据结构DStream的本质还是RDD,而RDD是批量处理.所以说Storm可以真正实现毫秒级处理,而相比于Storm,Spark Streaming则有一定的时延.

对于大多数的应用,计算不会成为瓶颈,而计算完成后的数据存储才是真正的问题.即使使用了storm,也没办法处理完一条数据就落到数据库或者HDFS中.而对于一些计算一段时间的数据流的应用,无需数据来一条就处理一条,立刻要看结果的,大多都有10s或者几秒的延迟,这样的情况下spark streaming具有良好的适应性.

3 实验改进

Spark Streaming支持的数据输入源除了上述的TCP套接字之外,还可以通过Kafka、Flume、Twitter、ZeroMQ等获取数据源[9],对获取到的数据流进行Map、Reduce和Join等复杂计算后的结果数据存储到文件系统HDFS或分布式数据库中.故可以将Spark和Flume,Kafka进行整合,将实验搭建在集群之上,通过zookeeper进行协调服务,利用Flume实时采集数据并写入到Kafka,在Kafka中创建Topic:

bin/kafka-topics.sh--create--zookeeper node1.itcast.cn:2181,node2.itcast.cn:2181--replication-factor 3--partitions 3--topic urlcount

Spark Streaming利用KafkaUtils.createStream方法从Kafka中拉取数据流信息,创建DStream并进行实时计算,实验设计图如图7所示.

图7 实验设计图

4 结束语

本文论述了Storm和Spark Streaming两种流式计算框架的设计思想和架构设计,通过实验对二者架构原理和工作流程进行了进一步的阐述和分析,并对Storm和Spark Streaming之间的不同点进行了对比和分析.在实际应用中,从数据过滤,进行解析进行处理,到计算完成后进行数据落地的过程中,计算通常不会成为瓶颈,而是受限于数据存储的速率.所以Spark Streaming除了应用于一些需要历史数据和实时数据结合分析的特定应用场合之外,还可以适用于对实时性要求不高或者数据量非常巨大的应用场景.

猜你喜欢
流式设计图数据结构
常熟开关新品来袭!CSX3系列电气防火限流式保护器
2种6色流式细胞术试剂检测淋巴细胞亚群的性能比较
流式大数据数据清洗系统设计与实现
太庙历史文化展设计图、非洲木雕展设计图
数据结构线上线下混合教学模式探讨
为什么会有“数据结构”?
一种汽车空调平行流式冷凝器侧进风性能研究
高职高专数据结构教学改革探讨
美国拟建漂浮城,可环游世界
高效学习数据结构