Spark Streaming官方文档翻译Spark Streaming总览

狂风中的少年 提交于 2020-01-27 06:35:44

Spark Streaming官方文档翻译Spark Streaming总览
Spark Streaming官方文档翻译基本概念之初始化与Dstream
Spark Streaming官方文档翻译基本概念之输入数据流和接收器
Spark Streaming官方文档翻译基本概念之转换操作
Spark Streaming官方文档翻译基本概念之输出操作
Spark Streaming官方文档翻译基本概念之sql与Mllib
Spark Streaming官方文档基本概念之缓存与检查点
Spark Streaming官方文档翻译基本概念之累加器、广播变量和检查点
Spark Streaming官方文档翻译Spark Streaming应用之部署,升级,监控
Spark Streaming官方文档翻译Spark Streaming性能调优
Spark Streaming官方文档翻译Spark Streaming容错
Spark Streaming官方文档翻译Spark Streaming +Kafka 集成指南
Spark Streaming官方文档翻译Spark Streaming自定义接收器

总览

Spark Streaming 是Spark core API的扩展,支持可伸缩、高吞吐量、容错的实时数据流处理。数据可以从许多来源获取,如Kafka、Flume、Kinesis或TCP sockets,可以使用复杂的算法处理数据,这些算法用高级函数表示,如map、reduce、join和window。最后,处理后的数据可以推送到文件系统、数据库和活动仪表板。实际上,您可以将Spark的机器学习和图处理算法应用于数据流。
在这里插入图片描述
在内部,它是这样工作的。Spark Streaming接受实时输入数据流,并将数据分成批次,然后由Spark engine处理,以批量生成最终的结果流。

在这里插入图片描述

Spark Streaming提供了一种高级抽象,称为discretized stream或DStream,用来表示连续的数据流。DStreams可以从Kafka、Flume和Kinesis等源的输入数据流创建,也可以通过对其他DStreams应用高级操作创建。在内部,DStream表示为RDDs序列。

本指南向您展示了如何使用DStreams编写Spark流程序。您可以用Scala、Java或Python(在Spark 1.2中引入)编写Spark Streaming程序,所有这些都在本指南中介绍。在本指南中,您可以找到选项卡,让您在不同语言的代码片段之间进行选择。

Note:有一些api是不同的,或者在Python中不可用的。在本指南中,您将发现标记Python API突出了这些差异。

快速入门例子

在详细介绍如何编写自己的Spark Streaming程序之前,让我们先快速了解一下简单的Spark Streaming程序是什么样子的。假设我们要计算从监听TCP套接字的数据服务器接收到的文本数据中的字数。你所需要做的就是如下所示。

scala

首先,我们将Spark Streaming类的名称和一些有关StreamingContext的隐式转换导入到我们的环境中,以便向我们的其他类(如DStream)添加有用的方法。StreamingContext是所有流功能的主要入口点。我们用两个执行线程创建一个本地StreamingContext,批处理间隔为1秒。

import org.apache.spark._
import org.apache.spark.streaming._
import org.apache.spark.streaming.StreamingContext._ // not necessary since Spark 1.3

// Create a local StreamingContext with two working thread and batch interval of 1 second.
// The master requires 2 cores to prevent a starvation scenario.

val conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
val ssc = new StreamingContext(conf, Seconds(1))

使用这个上下文(context),我们可以创建一个表示来自TCP源的流数据DStream,指定为主机名(例如localhost)和端口(例如9999)

// Create a DStream that will connect to hostname:port, like localhost:9999
val lines = ssc.socketTextStream("localhost", 9999)

这 lines DStream表示从数据服务器接收的数据流。DStream中的每个记录都是一行文本。接下来,我们希望按空格字符将行分割为单词。

// Split each line into words
val words = lines.flatMap(_.split(" "))

flatMap是一个一对多的DStream操作,它通过从源DStream中的每个记录生成多个新记录来创建一个新的DStream。在这种情况下,每一行将被分成多个单词,单词流表示为单词DStream。接下来,我们要计数这些单词。

import org.apache.spark.streaming.StreamingContext._ // not necessary since Spark 1.3
// Count each word in each batch
val pairs = words.map(word => (word, 1))
val wordCounts = pairs.reduceByKey(_ + _)

// Print the first ten elements of each RDD generated in this DStream to the console
wordCounts.print()

words DStream进一步map(一对一转换)到(word,1)对的DStream中,然后将其reduce以获取每批数据中单词的频率。最后,wordCounts.print()将打印每秒生成的一些计数。

请注意,执行这些行时,Spark Streaming仅设置启动时将执行的计算,但是尚未开始任何实际处理。我们最终可以执行

ssc.start()             // Start the computation
ssc.awaitTermination()  // Wait for the computation to terminate

完整的代码可以在Spark Streaming示例NetworkWordCount中找到。

如果您已经下载并构建了Spark,则可以按以下方式运行此示例。您首先需要通过使用以下命令将Netcat(在大多数类Unix系统中找到的一个小实用程序)作为数据服务器运行

$ nc -lk 9999

然后,在另一个终端中,您可以通过使用

./bin/run-example streaming.NetworkWordCount localhost 9999

然后,将对运行netcat服务器的终端中键入的任何行进行计数并每秒打印一次。它将类似于以下内容。

# TERMINAL 1:
# Running Netcat

$ nc -lk 9999

hello world



...
# TERMINAL 2: RUNNING NetworkWordCount

$ ./bin/run-example streaming.NetworkWordCount localhost 9999
...
-------------------------------------------
Time: 1357008430000 ms
-------------------------------------------
(hello,1)
(world,1)
...
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!