SparkStreaming 编程指南
摘要:学习SparkStreaming从官网的编程指南开始,由于Python编码修改方便不用打包,这里只整理python代码!
一、概述
Spark Streaming 是 Spark Core API 的扩展, 它支持弹性的, 高吞吐的, 容错的实时数据流的处理。数据可以通过多种数据源获取, 例如 Kafka, Flume, Twitter, ZeroMQ, Kinesis 以及 TCP sockets, 也可以通过例如 map, reduce, join, window 等的高级函数组成的复杂算法处理。最终, 处理后的数据可以输出到文件系统, 数据库以及实时仪表盘中。事实上, 还可以在 data streams(数据流)上使用机器学习以及图计算算法。
在内部, 它工作原理如下, Spark Streaming 接收实时输入数据流并将数据切分成多个 batch(批)数据, 然后由Spark引擎处理它们以生成最终的 stream of results in batches(分批流结果)。
Spark Streaming 提供了一个名为discretized stream或DStream的高级抽象, 它代表一个连续的数据流。DStream可以从数据源的输入数据流创建, 例如 Kafka, Flume 以及 Kinesis, 或者在其他 DStream 上进行高层次的操作来创建。在内部, 一个 DStream 是通过一系列的 RDDs 来表示。
本指南告诉你如何使用DStream来编写一个Spark Streaming程序。你可以使用 Scala,Java或者Python(Spark 1.2 版本后引进)来编写 Spark Streaming 程序。所有这些都在本指南中介绍. 您可以在本指南中找到标签, 让您可以选择不同语言的代码段.
注意: 在 Python 有些 API 可能会有不同或不可用. 在本指南, 您将找到 Python API 的标签来高亮显示不同的地方。
二、一个入门示例
在我们详细介绍如何编写你自己的 Spark Streaming 程序的细节之前, 让我们先来看一看一个简单的 Spark Streaming 程序的样子. 比方说, 我们想要计算从一个监听 TCP socket 的数据服务器接收到的文本数据(text data)中的字数. 你需要做的就是照着下面的步骤做.
首先, 我们导入StreamingContext,这是所有流功能的主要入口点。 我们创建了一个带有 2 个执行线程和间歇时间为 1 秒的本地 StreamingContext.
from pyspark import SparkContext
from pyspark.streaming import StreamingContext # 创建一个具有两个工作线程(working thread)并且批次间隔为 1 秒的本地 StreamingContext .
sc = SparkContext("local[2]", "NetworkWordCount")
ssc = StreamingContext(sc, 1)
使用该 context, 我们可以创建一个代表从 TCP 源流数据的DStream,指定主机名(例如 localhost)和端口(例如 9999)。
# 创建一个将要连接到 hostname:port 的 DStream,如 localhost:9999
lines = ssc.socketTextStream("localhost", 9999)
上一步的这个 lines DStream 表示将要从数据服务器接收到的数据流. 在这个离散流(DStream)中的每一条记录都是一行文本(text). 接下来,我们想要通过空格字符拆分这些数据行成单词。
# 将每一行拆分成单词
words = lines.flatMap(lambda line: line.split(" "))
flatMap 是一种一对多的DStream操作,它会通过在源DStream中根据每个记录生成多个新纪录的形式创建一个新的DStream。在这种情况下,每一行都将被拆分成多个单词和代表单词DStream的单词流。下一步,我们想要计算这些单词:
# 计算每一个 batch(批次)中的每一个 word(单词)
pairs = words.map(lambda word: (word, 1))
wordCounts = pairs.reduceByKey(lambda x, y: x + y) # 在控制台打印出在这个DStream中生成的每个 RDD 的前十个元素
wordCounts.print()
上一步的单词DStream进行了进一步的映射(一对一的转换)为一个 (word, 1) paris 的DStream,这个 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/spark-submit examples/src/main/python/streaming/network_wordcount.py localhost 9999
然后,在运行在 netcat 服务器上的终端输入的任何行(lines),都将被计算,并且每一秒都显示在屏幕上,它看起来就像下面这样:
# TERMINAL 1:
# Running Netcat
$ nc -lk 9999
hello world
# TERMINAL 2: RUNNING network_wordcount.py
$ ./bin/spark-submit examples/src/main/python/streaming/network_wordcount.py localhost 9999
...
-------------------------------------------
Time: 2014-10-14 15:25:21
-------------------------------------------
(hello,1)
(world,1)
...
三、基础概念
接下来,我们了解完了简单的例子,开始阐述 Spark Streaming 的基本知识。
(1)依赖
与 Spark 类似,Spark Streaming 可以通过 Maven 来管理依赖. 为了编写你自己的 Spark Streaming 程序,你必须添加以下的依赖到你的 SBT 或者 Maven 项目中.
Maven:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.2.0</version>
</dependency>
针对从 Spark Streaming Core API 中不存在的数据源中获取数据,如 Kafka, Flume,Kinesis ,你必须添加相应的坐标 spark-streaming-xyz_2.11
到依赖中. 例如,有一些常见的依赖如下.
Source(数据源) Artifact(坐标)
Kafka spark-streaming-kafka-0-8_2.11
Flume spark-streaming-flume_2.11
Kinesis spark-streaming-kinesis-asl_2.11 [Amazon Software License]
(2)初始化 StreamingContext
为了初始化一个 Spark Streaming 程序, 一个 StreamingContext 对象必须要被创建出来,它是所有的 Spark Streaming 功能的主入口点。
一个 StreamingContext 对象可以从一个 SparkConf 对象中来创建.
from pyspark import SparkContext
from pyspark.streaming import StreamingContext sc = SparkContext(master, appName)
ssc = StreamingContext(sc, 1)
这个 appName 参数是展示在集群 UI 界面上的应用程序的名称. master 是一个 Spark, Mesos or YARN cluster URL, 或者一个特殊的 “local[*]” 字符串以使用 local mode(本地模式)来运行. 在实践中,当在集群上运行时,你不会想在应用程序中硬编码 master,而是 使用 spark-submit 来启动应用程序 , 并且接受该参数. 然而,对于本地测试和单元测试,你可以传递 “local[*]” 来运行 Spark Streaming 进程(检测本地系统中内核的个数). 请注意,做个内部创建了一个 SparkContext(所有 Spark 功能的出发点),它可以像 ssc.sparkContext 这样被访问.
这个 batch interval(批间隔)必须根据您的应用程序和可用的集群资源的等待时间要求进行设置. 更多详情请参阅 优化指南 部分.
在定义一个 context 之后,您必须执行以下操作.
♦ 通过创建输入 DStreams 来定义输入源.
♦ 通过应用转换和输出操作 DStreams 定义流计算(streaming computations).
♦ 开始接收输入并且使用 streamingContext.start() 来处理数据.
♦ 使用 streamingContext.awaitTermination() 等待处理被终止(手动或者由于任何错误).
♦ 使用 streamingContext.stop() 来手动的停止处理.
需要记住的几点:
♦ 一旦一个 context 已经启动,将不会有新的数据流的计算可以被创建或者添加到它。.
♦ 一旦一个 context 已经停止,它不会被重新启动.
♦ 同一时间内在 JVM 中只有一个 StreamingContext 可以被激活.
♦ 在 StreamingContext 上的 stop() 同样也停止了 SparkContext 。为了只停止 StreamingContext ,设置 stop() 的可选参数,名叫 stopSparkContext 为 false.
♦ 一个 SparkContext 就可以被重用以创建多个 StreamingContexts,只要前一个 StreamingContext 在下一个StreamingContext 被创建之前停止(不停止 SparkContext).
(3)Discretized Streams (DStreams)(离散化流)
SparkStreaming 编程指南的更多相关文章
- OpenGL编程指南(第七版)
OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...
- 编译opengl编程指南第八版示例代码通过
最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...
- 高质量C++/C编程指南(林锐)
推荐-高质量C++/C编程指南(林锐) 版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐 2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐 20 ...
- iOS ---Extension编程指南
当iOS 8.0和OS X v10.10发布后,一个全新的概念出现在我们眼前,那就是应用扩展.顾名思义,应用扩展允许开发者扩展应用的自定义功能和内容,能够让用户在使用其他app时使用该项功能.你可以开 ...
- Lambda 表达式(C# 编程指南) 微软microsoft官方说明
Visual Studio 2013 其他版本 Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地 ...
- KVC/KVO原理详解及编程指南
一.简介 1.KVC简介 2.KVO简介 二.KVC相关技术 1.Key和Key Path 2.点语法和KVC 3.一对多关系(To-Many)中的集合访问器方法 4.键值验证(Key-Value V ...
- iOS多线程编程指南(二)线程管理
当应用程序生成一个新的线程的时候,该线程变成应用程序进程空间内的一个实体.每个线程都拥有它自己的执行堆栈,由内核调度独立的运行时间片.一个线程可以和其他线程或其他进程通信,执行I/O操作,甚至执行任何 ...
- Core Animation编程指南
本文是<Core Animation Programming Guide>2013-01-28更新版本的译文.本文略去了原文中关于OS X平台上Core Animation相关内容.因为原 ...
- 【Todo】【读书笔记】Java多线程编程指南-设计模式篇
下了这本书<Java多线程编程指南-设计模式篇>, 还有另一本<JAVA多线程设计模式>,据说内容有重复,结合着看.
随机推荐
- 51nod 1489 蜥蜴和地下室
题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 哈利喜欢玩角色扮演的电脑游戏<蜥蜴和地下室>.此时,他正在扮演一个魔术 ...
- Spark Job调优(Part 2)
原文链接:https://wongxingjun.github.io/2016/05/11/Spark-Job%E8%B0%83%E4%BC%98-Part-2/ 这篇文章将会完成Part 1中留下的 ...
- [R] 简单笔记(一)
library(lattice) xyplot(Petal.Length~Petal.Width,data=iris,goups = Species)//画分类图 plot(model,subdata ...
- python_92_面向对象初体验
class dog: def __init__(self,name): self.name=name def bulk(self): print('%s汪汪汪!'%self.name) d1=dog( ...
- idea spring boot启动项目上面有红色叉
一打开IDEA,在启动debug项目有一个红色叉如下图 因为打开项目可以主项目的包没有加载进来,解决办法就是右击项目->maven->Reimport 就搞定了..
- WPF DataGridCheckBoxColumn需要点两次才能修改checkbox状态
如题,如果必须要用DataGridCheckBoxColumn使用一下方式就可以解决需要点击两次才能改状态的问题 <DataGridCheckBoxColumn> <DataGrid ...
- B1002 写出这个数
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 1. 输出格式: 在一行内输出 n 的 ...
- 【Linux】开放指定端口设置
这里以开放tomcat的8080端口为例 1.开放Linux的8080端口 vi /etc/sysconfig/iptables 进入编辑页面,在指定位置新增以下配置 -A INPUT -m stat ...
- Oracle rownum的理解
核心过程分三步: 从表中取出行(无索引的话,顺序取出). 根据当前结果集,为当前行添加rownum. 条件筛选,如通过则添加到结果集中. 完.
- Linux 常用命令(三)
一.less --分页查看文件:方面查阅(编辑)大文件 说明:支持方向键盘和鼠标向上向下浏览 -N 显示行号 二.head --output the first part of files 默认显示 ...