Spark流计算(二)

来源:互联网 发布:深入浅出java虚拟机 编辑:程序博客网 时间:2024/05/22 12:58

连接

与Spark相似,Spark Streaming可通过Maven Central获得。需要加入如下依赖

<dependency>   <groupId>org.apache.spark</groupId>   <artifactId>spark-streaming_2.11</artifactId>    <version>2.1.1</version></dependency>
对于处理来自Kafka,Flume和Kinesis的数据,由于它们不在Spark Streaming核心API中,我们需要加入相应的依赖,例如

Source  Artifact

Kafka   spark-streaming-kafka-0-8_2.11

Flume   spark-streaming-flume_2.11

Kinesis spark-streaming-kinesis-asl_2.11 [Amazon SoftwareLicense]

初始化StreamingContext

可通过SparkConf对象创建StreamingContext

from pyspark import SparkContextfrom pyspark.streaming import StreamingContextsc = SparkContext(master, appName)ssc = StreamingContext(sc, 1)
appName参数是应用显示在UI集群中的名称。master是Spark,Mesos或者YARN集群URL,或者一个特殊的local[*]在本地运行。实践中,当运行一个集群不会在程序中指定master,而是用spark-submit启动应用然后从那里接收。但是对于本地测试和单元测试,可以传递local[*](检测本地系统的核数)。注意这将建立一个SparkContext,可通过ssc.sparkContext访问。批次间隔要根据应用的潜在要求和可获得的集群资源设置.

环境定义后,需进行如下工作:

1、通过建立输入DStreams定义输入源

2、通过应用转换和输出操作到DStreams定义流计算

3、开始接收数据并用streamingContext.start()处理

4、等待进程被停止(手动或出错),使用streamingContext.awaitTermination()

5、进程可被手动停止,使用streamingContext.stop()

需要记住的问题:

一旦环境还是运行,无法设置或添加新的流计算

一旦环境被停止,无法重启

在同一时间一个JVM上只有一个活跃的StreamingContext

作用于StreamingContext的stop()同时停止SparkContext, 如果只需停止StreamingContext,设置可选参数stopSparkContext为假。

一个SparkContext可以反复用来创建多个StreamingContext,只要前面的StreamingContext已停止(SparkContext未停止)下一个StreamingContext还未创建。

离散化流DStreams

离散化流或者DStream是Spark Streaming提供的基本抽象。体现了连续的数据流,来自源或由转换输入流产生的经处理的数据流。在内部,一个DStream有连续的RDDs系列体现,是Spark不可更改、分布式数据集的抽象。DStream中每个RDD包含一定间隔的数据。如下图所示

Spark Streaming

对DStream的任何操作转化为对下层RDDs的操作。例如,在之前的将文本流转化为词中,flatMap操作被应用于lines DStream的每个RDD并生成words DStream,如下图所示

Spark Streaming

这些底层RDD转换由Spark引擎计算。DStream操作隐藏了大部分细节,为开发者提供了便利的高层API。

输入DStreams和接收器

输入DStreams是体现接收自源的输入流数据。在此前例子中,lines是输入DStreams,体现了接收自netcat服务器的数据流。每个输入DStream(除了文件流)与一个接收器对象相连,该对象接收来自源的数据并将它储存在Spark内存中待处理。

Spark Streaming提供两类内置留源:

基本源:直接在StreamingContext API可获得源,例如文件系统,端口连接。

高级源:例如Kafka,Flume,Kinesis等,这些如此前所述需要连接额外的依赖。

注意,如果想在你的流应用中并行接收多个数据流,可以构建多个输入DStreams。这将构建多个接收器同时接收多个数据流。注意一个Spark工作者/执行者是一个长期运行任务,因此会占用分配给Spark Streaming应用的一个核。因此,记住Spark Streaming应用需要分配足够的核(或线程,如果本地运行)来处理接收的数据和运行接收器。

记住的点

当运行一个本地Spark Streaming程序,不要使用local或者local[1],作为主URL。它们意味着只有一个线程会用来运行本地任务。如果基于一个接收器(如端口,Kafka,Flume等)来使用输入DStream,那么单一线程会被用来运行接收器,而无法处理接收的数据。因此,当本地运行时,总是使用local[n]作为主URL,n>运行的接收器数量。

延展到在集群上运行,分配给Spark Streaming应用的核数量必须大于接收器的数量,否则系统会接收数据,但无法处理它们。

基本源

我们在此前的例子中接触了ssc.socketTextStream(...),从TCP端口连接接收文本数据并建立一个DStream,除端口外,StreamingContext API提供方法从文件创建DStreams作为输入源。

文件流:从任何与HDFS API兼容的文件系统(HDFS,S3,NFS等)的文件中读取数据。

 streamingContext.textFileStream(dataDirectory)

Spark Streaming会监视dataDirectory文件夹,并处理其中的任何文件(不支持嵌入文件夹中的文件),注意:

文件应有相同的数据格式

文件需要通过atomically移动或重命名到该数据文件夹的方式在dataDirectory里创建

一旦移动不能改变文件。所以如果文件被连续追加,新的数据会被读取。

对于简单的文本文件,有一个更简单的方法streamingContext.textFileStream(dataDirectory)。并且文件流不需要运行一个接收器,所以不需要分配核。

注意Python API里没有fileStream,只能使用textFileStream。

基于自定义接收器的流:DStreams可以通过自定义的接收器接收数据流并创建DStreams。

RDDs对列的流:使用测试数据测试Spark Streaming应用,可以基于一队RDDs来创建DStreams,使用streamingContext.queueStream(queueOfRDDs)。每个推倒队中的RDD被视为在DStream中的一批次数据,并作为流处理。

高级源

从Spark2.1.1开始,在Python API中可用Kafka,Kinesis和Flume。

注意高级源不在Spark壳中,因此基于高级源的应用无法在壳中被测试。如果确实希望在Spark壳中使用它们,需要下在相应的Maven artifact’s JAR以及依赖并加入到classpath路径中。

一些高级源有:

  • Kafka: Spark Streaming 2.1.1 is compatible with Kafka broker versions 0.8.2.1 or higher. See theKafka Integration Guide for more details.

  • Flume: Spark Streaming 2.1.1 is compatible with Flume 1.6.0. See theFlume Integration Guide for more details.

  • Kinesis: Spark Streaming 2.1.1 is compatible with Kinesis Client Library 1.2.1. See theKinesis Integration Guide for more details.

自定义源:

Python不支持

只需执行一个用户定义的接收器接收自定义源的数据并推到Spark中。

接收器稳定性

根据稳定性可将数据源分为两类。允许接收传送的数据如Kafka和Flume。如果从这些可靠的源接收数据的系统准确地接收数据,可以保证没有数据因为任何失败而损失。

可靠的接收器——接收数据并以冗余方式存储在Spark后,准确地发出接收信号到一个可靠的源。

不可靠的接收器——不发送接收信号。可以用于不支持接收认可的源,或者对于那些可靠但不想或不需要使用接收机制的源。






阅读全文
0 0