Spark Streaming详解《八》

一、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的使用《七》
 

 

持续更新中...

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风雨「83」

你的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值