全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
832 0
2020-12-09
面向数据工程师的Spark Streaming入门指南
据IBM称,如果不采取任何行动,所有感官信息中有60%会在几毫秒内失去价值。请记住,大数据和分析市场已达到1250亿美元,其中很大一部分将归因于未来的物联网,无法利用实时信息将造成数十亿美元的损失。
其中一些应用程序的例子包括电信公司,计算出最近30分钟内有多少用户使用过Whatsapp,零售商跟踪在当今社交媒体上对其产品表示正面评价的人数或执法机构使用来自中央电视台的数据寻找嫌疑犯。
这是诸如Spark Streaming之类的流处理系统将定义实时分析的未来的主要原因。越来越需要同时分析静态数据和动态数据来驱动应用程序,这使得像Spark这样既可以做到又可以做到的系统越来越有吸引力且功能强大。这是适用于所有大数据季节的系统。
您将学习Spark Streaming如何不仅保持完整的Spark API完整,而且在后台使用RDD进行存储和容错。这使Spark从业者从一开始就可以跳入流媒体世界。考虑到这一点,让我们开始吧。
Spark Streaming简介Spark Streaming简介| 由Harshit Agarwal | 中
目录
Apache Spark
Apache Spark生态系统
Spark流:DStreams
Spark流:流上下文
示例:字数统计
火花流:窗口
基于窗口的–字数统计
基于窗口的(效率更高)–字数统计
火花流-输出操作
Apache Spark
Apache Spark是一个统一的计算引擎和一组库,用于在计算机群集上进行并行数据处理。在撰写本文时,Spark是为此任务开发的最活跃的开源引擎,使其成为对大数据感兴趣的任何开发人员或数据科学家的标准工具。
Spark支持多种广泛使用的编程语言(Python,Java,Scala和R),包括用于执行从SQL到流技术和机器学习的各种任务的库,并且可以在从便携式计算机到成千上万台服务器的群集中的任何位置运行。这使得它成为一个简单的系统,可以开始并扩展到大数据处理或难以置信的大规模。以下是Spark的一些功能:
快速和通用引擎,用于大规模数据处理
不是Hadoop的修改版本
“ MapReduce的成功者”的主要候选人
Spark可以有效地支持更多类型的计算
例如,交互式查询,流处理
可以读/写到任何Hadoop支持的系统(例如HDFS)
速度:内存数据存储,可实现非常快速的迭代查询
对于磁盘上运行的复杂应用程序,该系统也比MapReduce更有效率
比Hadoop快40倍
从许多来源获取数据:Kafka,Twitter,HDFS,TCP套接字
结果可以推送到文件系统,数据库,实时仪表板,但不仅限于此
火花流
Apache Spark生态系统
以下是Apache Spark生态系统的组件-
Spark Core:Spark的基本功能(任务调度,内存管理,故障恢复,存储系统交互)。
Spark SQL:用于处理通过SQL和HiveQL查询的结构化数据的软件包
Spark Streaming:一个组件,可处理实时数据流(例如,日志文件,状态更新消息)
MLLib:MLLib是像Mahout一样的机器学习库。它建立在Spark之上,并提供支持许多机器学习算法的功能。
GraphX:对于图形和图形计算,Spark有自己的图形计算引擎,称为GraphX。它类似于其他广泛使用的图形处理工具或数据库,例如Neo4j,Giraffe和许多其他分布式图形数据库。
Spark Streaming-生态系统
Spark Streaming:抽象
火花流具有微批量结构如下:
将流视为一系列数据批次
定期创建新批次
时间间隔的大小称为批处理间隔
批处理间隔通常在500毫秒至几秒之间
火花流
每个窗口的减少值都是递增计算的。
离散流(DStream)
离散流或DStream是Spark Streaming提供的基本抽象。它代表连续的数据流,可以是从源接收的输入数据流,也可以是通过对输入流进行转换而生成的已处理数据流。在内部,DStream由一系列连续的RDD表示,这是Spark对不可变的分布式数据集的抽象(有关更多详细信息,请参见Spark编程指南)。DStream中的每个RDD都包含来自特定间隔的数据。
Spark流-DStream
RDD转换由Spark引擎计算
DStream操作隐藏了大多数这些细节
在DStream上执行的任何操作都转换为对基础RDD的操作
每个窗口的减少值都是递增计算的。
DStream
Spark流:流上下文
它是Spark Streaming功能的主要入口点。它提供了用于DStream从各种输入源创建的方法。可以通过提供Spark主URL和appName或从org.apache.spark.SparkConf配置或从现有的org.apache.spark.SparkContext创建流Spark。可以使用访问关联的SparkContext context.sparkContext。
创建和转换DStream之后,可以context.start()分别使用和启动和停止流计算。context.awaitTermination()允许当前线程通过stop()或等待异常终止上下文。
要执行SparkStreaming应用程序,我们需要定义StreamingContext。它专门针对流应用程序使用SparkContext。
Java中的流上下文可以定义如下:
JavaStreamingContext ssc =新的JavaStreamingContext(sparkConf,batchInterval);
哪里:
master是Spark,Mesos或YARN群集URL;要在本地模式下运行代码,请使用“ local [K]”,其中K> = 2表示并行度
appname是您的应用程序的名称
每批的时间间隔(以秒为单位)
一旦构建,它们将提供两种类型的操作:
从先前的DStream产生新的DStream的转换。例如,一种常见的转换是过滤数据。
无状态转换:每个批次的处理不依赖于其先前批次的数据。
                      示例为: map(),filter()和reduceByKey()
有状态转换:使用先前批次中的数据来计算当前批次的结果。其中包括滑动窗口,跨时间跟踪状态等
将数据写入外部系统的输出操作。每个流应用程序必须定义一个输出操作。
请注意,流上下文只能启动一次,并且必须在设置所有DStream和输出操作之后启动。
基本数据源
下面列出的是Spark Streaming的基本数据源:
文件流:用于从与HDFS API兼容的任何文件系统(即HDFS,S3,NFS等)上的文件中读取数据,DStream可以创建为:
... = streamingContext.fileStream <...>(目录);
基于自定义接收器的流:可以使用通过自定义接收器接收的数据流创建DStream,从而扩展了Receiver <T>类
... = streamingContext.queueStream(queueOfRDDs)
RDD队列作为流:为了使用测试数据测试Spark Streaming应用程序,还可以使用RDD队列创建DStream
... = streamingContext.queueStream(queueOfRDDs)
大多数转换与应用于RDD的语法具有相同的语法
转型
含义
地图(功能)
通过将源DStream的每个元素传递给函数func来返回新的DStream。
flatMap(func)
与map相似,但是每个输入项可以映射到0个或多个输出项。
过滤器(功能)
通过仅选择func返回true的源DStream的记录来返回新的DStream。
union(otherStream)
返回一个新的DStream,其中包含源DStream和otherDStream中元素的并集。
加入(其他流)
当在(K,V)和(K,W)对的两个DStream上调用时,返回一个新的(K,(V,W))对的DStream,其中每个键都有所有元素对。
示例:字数统计
SparkConf sparkConf =新的SparkConf()
.setMaster(“ local [2]”)。setAppName(“ WordCount”);
JavaStreamingContext ssc = ...
JavaReceiverInputDStream <String> lines = ssc.socketTextStream(...);
JavaDStream <String>单词= lines.flatMap(...);
JavaPairDStream <String,Integer> wordCounts =单词
                                             .mapToPair(s-> new Tuple2 <>(s,1))
                                             .reduceByKey((i1,i2)-> i1 + i2);
wordCounts.print();
火花流:窗口
最简单的窗口化功能是一个窗口,它使您可以创建新的DStream,方法是将窗口化参数应用于旧的DStream来计算。您可以在新流上使用任何DStream操作,从而获得所需的所有灵活性。
窗口计算允许您在数据的滑动窗口上应用转换。任何窗口操作都需要指定两个参数:
窗长
窗口持续时间(秒)
滑动间隔
执行窗口操作的时间间隔(以秒为单位)
这些参数必须是批处理间隔的倍数
DStream
窗口(windowLength,slideInterval)
它返回一个新的DStream,该DStream是基于窗口批处理计算的。
...
JavaStreamingContext ssc = ...
JavaReceiverInputDStream <String>行= ...
JavaDStream <String> linesInWindow =
lines.window(WINDOW_SIZE,SLIDING_INTERVAL);
JavaPairDStream <String,Integer> wordCounts = linesInWindow.flatMap(SPLIT_LINE)
.mapToPair(s-> new Tuple2 <>(s,1))
.reduceByKey((i1,i2)-> i1 + i2);
reduceByWindow( func,InvFunc,windowLength,slideInterval )
返回一个新的单元素流,该流是通过使用func(应该是关联的)在滑动间隔内聚合流中的元素而创建的。
每个窗口的减少值都是递增计算的。
func减少进入滑动窗口的新数据
invFunc “逆减少”离开窗口的旧数据。
reduceByKeyAndWindow( func,InvFunc,windowLength,slideInterval )
当在(K,V)对的DStream上调用时,返回一个新的(K,V)对的DStream,其中每个键的值使用给定的reduce函数func在滑动窗口的批处理中聚合。
为了执行这些转换,我们需要定义一个检查点目录
基于窗口的–字数统计
...
JavaPairDStream <String,Integer> wordCountPairs = ssc.socketTextStream(...)
.flatMap(x-> Arrays.asList(SPACE.split(x))。iterator())
.mapToPair(s-> new Tuple2 <>(s,1));
JavaPairDStream <String,Integer> wordCounts = wordCountPairs
.reduceByKeyAndWindow((i1,i2)-> i1 + i2,WINDOW_SIZE,SLIDING_INTERVAL);
wordCounts.print();
wordCounts.foreachRDD(new SaveAsLocalFile());
基于窗口的(效率更高)–字数统计
在更有效的版本中,每个窗口的减少值都是按增量计算的-
reduce函数处理进入滑动窗口的新数据;
“逆缩小”功能处理离开窗口的旧数据。
请注意,必须启用检查点才能使用此操作。
...
ssc.checkpoint(LOCAL_CHECKPOINT_DIR);
...
JavaPairDStream <String,Integer> wordCounts = wordCountPairs.reduceByKeyAndWindow(
(i1,i2)-> i1 + i2,
(i1,i2)-> i1-i2,WINDOW_SIZE,SLIDING_INTERVAL);
Spark流:输出操作
输出操作允许将DStream的数据推出到外部系统,例如数据库或文件系统
输出操作
含义
打印()
在运行应用程序的驱动程序节点上,打印DStream中每批数据的前十个元素。
saveAsTextFiles(前缀,[后缀])
将此DStream的内容另存为文本文件。每个批处理间隔的文件名都是基于前缀生成的。
saveAsHadoopFiles(前缀,[后缀])
将此DStream的内容另存为Hadoop文件。
saveAsObjectFiles(前缀,[后缀])
将此DStream的内容另存为序列化Java对象的SequenceFiles。
foreachRDD(功能)
通用输出运算符,将函数func应用于从流生成的每个RDD。
在线参考-
? Spark文档
? Spark文档
结论
应该清楚的是,Spark Streaming提供了一种编写流应用程序的强大方法。从工程的角度来看,如果需要使该作业与其余的数据处理应用程序紧密交互,那么将已经运行的批处理作业转换为几乎无需更改代码的流式作业既简单又非常有用。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群