一、Spark Steaming概述
Spark流是核心Spark API的扩展,支持可伸缩、高吞吐量、容错的实时数据流处理。数据可以从许多来源获取,如Kafka、Flume、Kinesis或TCP套接字,并且可以使用复杂的算法进行处理,这些算法用高级函数表示,如map、reduce、join和window。最后,处理后的数据可以推送到文件系统、数据库和活动指示板。事实上,您可以将Spark的机器学习和图形处理算法应用于数据流。
二、常用实时流处理框架
框架 | 说明 | 优缺点 | 语言 |
Storm | 真正实时流处理 | | JAVA |
Spark Streaming | 并不是实时流处理,而是一个mini batch操作 | | Java Scala,python |
Flink | 实时流处理 | | |
Kafka Streaming | 实时流处理 | | |
三、Spark Streaming执行原理
在内部,它是这样工作的。Spark Streaming接收实时输入的数据流,并将数据分成批次,然后由Spark engine处理,生成批次的最终结果流。
四、Spark Streaming 基本操作
演示一个简单的示例Demo
(1)通过创建输入DStreams来定义输入源。
(2)通过对DStreams应用转换和输出操作来定义流计算。
(3)开始接收数据并使用streamingContext.start()进行处理。
(4)使用streamingContext.awaitTermination()等待处理停止(手动或由于任何错误)。
(5)可以使用streamingContext.stop()手动停止处理。
#@Time:2020/5/27 7:19 上午
#@Author:wangyun
#@File:Spark006.py
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
# Create a local StreamingContext with two working thread and batch interval of 1 second
sc = SparkContext("local[2]", "NetworkWordCount")
ssc = StreamingContext(sc, 1)
# Create a DStream that will connect to hostname:port, like localhost:9999
lines = ssc.socketTextStream("localhost", 9999)
# Split each line into words
words = lines.flatMap(lambda line: line.split(" "))
# Count each word in each batch
pairs = words.map(lambda word: (word, 1))
wordCounts = pairs.reduceByKey(lambda x, y: x + y)
# Print the first ten elements of each RDD generated in this DStream to the console
wordCounts.pprint()
ssc.start() # Start the computation
ssc.awaitTermination() # Wait for the computation to terminate
sc.stop()
(6)启动端口
nc -lk 9999
(7)提交执行脚本
./spark-submit /Users/wangyun/Documents/BigData/codeProject/Spark006.py localhost 9999
从9999端口输入数据
结果输出:
从 4040端口可以看到执行情况:
五、StreamingContext和DStreams核心
(1)StreamingContext
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
sc = SparkContext(master, appName)
ssc = StreamingContext(sc, 1)
appName参数是应用程序在集群UI上显示的名称。master是一个Spark、Mesos或YARN集群的URL,或者一个特殊的“local[*]”字符串,可以在本地模式下运行。实际上,在集群上运行时,您不希望在程序中硬编码master,而是使用spark-submit启动应用程序并在那里接收它。但是,对于本地测试和单元测试,可以通过“local[*]”运行Spark流in-process(检测本地系统中的内核数量)。
批处理间隔必须根据应用程序的延迟需求和可用的集群资源来设置。有关更多细节,请参见性能调优一节。
在定义上下文之后,您必须执行以下操作。
- 通过创建输入DStreams来定义输入源。
- 通过对DStreams应用转换和输出操作来定义流计算。
- 开始接收数据并使用streamingContext.start()进行处理。
- 使用streamingContext.awaitTermination()等待处理停止(手动或由于任何错误)。
- 可以使用streamingContext.stop()手动停止处理。
注意点:
- 一旦上下文启动,就不能设置或添加新的流计算。
- 一旦上下文被停止,就不能重新启动它。
- 在JVM中只能同时激活一个StreamingContext。
- StreamingContext上的stop()也会停止SparkContext。要仅停止StreamingContext,请将名为stopSparkContext的stop()的可选参数设置为false。
- 只要在创建下一个StreamingContext之前停止前一个StreamingContext(不停止SparkContext),就可以重用一个SparkContext来创建多个StreamingContext。
(2)DStreams
离散流(DStream)是Spark流提供的基本抽象。它表示一个连续的数据流,要么是从源接收的输入数据流,要么是通过转换输入流生成的已处理数据流。在内部,DStream由一系列连续的RDDs表示,这是Spark对不可变的分布式数据集的抽象(参见Spark编程指南了解更多细节)。DStream中的每个RDD包含来自某个间隔的数据,如下图所示。
应用于DStream上的任何操作都转换为底层RDDs上的操作。例如,在前面将行转换为单词的示例中,flatMap操作应用于行DStream中的每个RDD,以生成单词DStream的RDDs。如下图所示。
这些底层的RDD转换由Spark引擎计算。DStream操作隐藏了这些细节中的大部分,并为开发人员提供了方便的高级API。
相关推荐:
hadoop,pySpark环境安装与运行实战《一》Spark RDD操作,常用算子《二》PySpark之算子综合实战案例《三》Spark运行模式以及部署《四》Spark Core解析《五》PySpark之Spark Core调优《六》PySpark之Spark SQL的使用《七》
持续更新中...