spark中stream编程指导(二)

这篇文章还是接着(一)中的继续,主要阐述一下spark中定义的几种不同类型的数据源,  以及在spark流式的程序中如何应用

基本数据源(basic sources)

在之前的事例程序中我们已经熟悉了ssc.socketTextStream(...),该函数可以用在TCP套接字连接中接收来的数据创建一个DStream,除了套接字之外,StreamingContext API对于创建DStream还提供了其他的方法,这些方法可以将文件或是Akka actor作为输入数据源。

  • 文佳数据流File Streams: 为了从任何的与HDFS文件系统兼容的文件系统(that is, HDFS, S3, NFS, etc.)读取数据:

     streamingContext.fileStream[KeyClass, ValueClass, InputFormatClass](dataDirectory) 

    Spark流式处理将会监控目录dataDirectory并且处理在这个目录当中创建的任何的文件(文件被写在嵌套的目录中并不对其支持). 特别需要注意的是,

    • 目录中的文件必须是统一的数据格式。
    • 在目录dataDirectory中创建的文件是能够自动的移动或是重命名进入数据目录的。
    • 一旦移动过去以后,文件将不能被改变。所以如果文件继续地被添加数据,那么新添加的数据将不能被读到。

    对于简单的文本文件,有一个想对容易的方法streamingContext.textFileStream(dataDirectory).同时文件输入流并不需要运行receiver,因此也不需要分配运行core数。

    Python API中的fileStream是不能使用的,仅仅是textFileStream可以使用

  • 基于用户角色的数据流(Streams based on Custom Actors): DStreams 可以通过Akka actor用接收来的数据流来创建,使用如下方法streamingContext.actorStream(actorProps, actor-name). 详细请见 Custom ReceiverGuide .

    actorStream  不能在Python API中使用,但是actor的Python API仅仅可以在java和scala库中使用。

  • 将一个RDD序列作为一个数据流(Queue of RDDs as a Stream): 为了用测试数据来测试流式应用,我们可以创建于一个基于RDD序列的DStream,使用方法StreamingContext.queueStream(queueOfRDDs)。每一个RDD都将会被压入这个序列,整个序列会被作为一个DStream,而里边的每一个RDD将会被作为一个数据batch,处理的过程正如一个流。

来自socket,files,或是actor的数据流,更多的细节可以看StreamingContext forScala, JavaStreamingContextfor Java, and StreamingContext for Python.

高级数据源(advanced sources)

在Spark1.4.1的Python API只是提供了Kafka的可用API 。随后版本中会被添加。

在这种数据源中,要求要与非spark库的外部源进行对接,它们中的一些有着很复杂的依赖(e.g., Kafka and Flume)。因此,为了减小相关依赖版本的冲突,从这些数据源创建DStream的功能被移动到了独立的库当中,当需要时,可以被明确的连接。例如,你想要使用来自Twitter的Twitter数据流创建一个DStream,按如下步骤:

  1. 链接(Linking):向你的maven工程或者是SBT中添加依赖库 spark-streaming-twitter_2.10
  2. 编程(Programming): 导入相关类文件,Import theTwitterUtils class,并且按下面用TwitterUtils.createStream创建DStream。
  3. 部署(Deploying):生成一个完整包含所有依赖的jar文件,然后部署应用。进一步了解Deploying section.
import org.apache.spark.streaming.twitter._ TwitterUtils.createStream(ssc, None)

需要注意的是,高级源在shell下面是不能使用的,因此基于高级源的应用在shell下面不能被测试。如果要在shell下面使用它们,你必须将相关依赖jarx下载好,并且加入classpath当中。

如下一些高级源以及使用链接,

  • Kafka: Spark Streaming 1.4.1 is compatible with Kafka 0.8.2.1. See theKafka Integration Guide for more details.

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

  • Kinesis: See theKinesis Integration Guide for more details.

  • Twitter: Spark Streaming’s TwitterUtils uses Twitter4j 3.0.3 to get the public stream of tweets usingTwitter’s Streaming API. Authentication informationcan be provided by any of the methods supported byTwitter4J library. You can either get the public stream, or get the filtered stream based on akeywords. See the API documentation (Scala,Java) and examples(TwitterPopularTagsandTwitterAlgebirdCMS).

客户数据源(Custom Sources)

Python 并不支持在一部分。

Input DStreams 也可以创建在客户数据源之外,我们所需要做的就是实现一个用户定义的receiver(下一部分会介绍),这个receiver可以从客户数据源接收数据,并且将其压入spark中。See theCustom ReceiverGuide for details.

Receiver可靠性(Receiver Reliability)

有两种基于他们可靠性的数据源。例如像Kafka和flume这样的源,允许这些被转移的数据被告知。如果从这些可靠数据源接收数据的系统已经正确地知道了已经接收的数据,那么无论什么样的错误发生,将会确保没有数据会被丢失。有两种receiver:

  1. Reliable Receiver - A reliable receiver correctly sends acknowledgment to a reliable source when the data has been received and stored in Spark with replication.
  2. Unreliable Receiver - An unreliable receiver does not send acknowledgment to a source. This can be used for sources that do not support acknowledgment, or even for reliable sources when one does not want or need to go into the complexity of acknowledgment.

The details of how to write a reliable receiver are discussed in theCustom Receiver Guide.

你可能感兴趣的:(spark中stream编程指导(二))