Spark Streaming原生支持一些不同的数据源。一些“核心”数据已经被打包到Spark Streaming的Maven工件中,而其他的一些则可以通过spark-streaming-kafka等附加工件获取。


核心数据源

所有的核心数据源创建DStream的方法都位于StreamingContext中。

文件流

因为Spark支持从任意Hadoop兼容的文件系统中读取数据,所以Spark Streaming也就支持从任意Hadoop兼容的文件系统目录中的文件创建数据量。
由于支持多种后端,这种方式广为使用,尤其是对于像日志这样始终要复制到HDFS上的数据。
要让Spark Streaming来处理数据,我们需要为目录名字提供统一的日期格式,文件也必须是原子化创建(比如把文件移入Spark监控的目录)。

除了文本数据,也可以读入任意Hadoop数据格式。只需要将Key、Value、以及InputFormat类提供给Spark Streaming即可。例如先前已经有了一个流处理作业来处理日志,并已经将得到的每个时间区间内传输的数据分别存储成了一个SequenceFile,则可用如下样式来读取数据。
例:用Scala读取目录中的SequenceFile流:
ssc.fileStream[LongWritable, IntWritable,
    SequenceFileInputFormat[LongWritable, IntWritable]](inputDirectory).map{
    case(x, y) => (x.get(), y.get())
}

Akka actor流

actorStream可以把Akka actor(http://akka.io/)作为数据的源。要创建一个actor流,需要创建一个Akka actor,然后实现org.apache.spark.streaming.receiver.ActorHelper接口。要把数据从actor复制到Spark Streaming中,需要在收到新数据时调用actor的store()函数。

附加数据源

除核心数据源外,还可以用附件数据源接收器来从一些知名数据获取系统中接收的数据,这些接收器都作为Spark Streaming的组件进行了独立打包。它们任然是Spark的一部分,不过你需要在构建文件中添加额外的的包才能使用它们。
现有的一些接收器包括Twitter、Apache、Kafka、Amazon Kinesis,以及ZeroMQ。可以通过添加与Spark版本匹配的Maven工件spark-streaming-[projectname]来引入这些接收器。

Apache Kafka

Apache Kafka因其速度与弹性成为了一个流行的输入源。在工程中需要引入Maven工件spark-streaming-kafka_2.10(版本)来使用它。提供的KafkaUtils对象可以在StreamingContext和JavaStreamingContext中以你的Kafka消息创建出DStream。
import org.apache.spark.streaming.kafka.*;

//创建一个主题到接收器线程数的映射表
Map<String, Integer> topics = new HashMap<String, Integer>();
topics.put("pandas","1");
topics.put("logs", 1);
JavaPairDStream<String, String> input = 
    KafkaUtils.createStream(jssc, zkQurum, group, topics);
input.print();

Apache Flume

Spark提供两个不同的接收器来使用Apache Flume:

1、推式接收器

该接收器以Avro数据池的方式工作,由Flume向其中推数据。
Flume对Avro池的配置:
a1.sinks = avroSink
s1.sinks.avroSink.type = avro
a1.sinks.avroSink.channel = memoryChannel
a1.sinks.avroSink.hostname = receiver-hostname
a1.sinks.avroSink.port = port-used-for-avro-sink-not-spark-port
虽然这种方式简洁,但缺点是没有事务支持。这回增加运行接收器的工作节点发生错误时丢失少量的几率。不仅如此,如果运行接收器的工作节点发生故障,系统会尝试从另一个位置启动接收器,这是需要重新配置Flume才能将数据发送给新的工作节点。比较麻烦。

2、拉式接收器

该接收器可以从自定义的中间数据中拉数据,而其他进程可以使用Flume把数据推进该中间数据池。
拉式接收器设置了一个专门的Flume数据池供Spark Streaming读取,并让接收器主动从数据池中拉取数据。这种方式的优点在于弹性较好,Spark Streaming通过事务从数据池读取并复制数据。在收到事务完成的通知前,这些数据还保留在数据池中。
Flume对自定义数据池的配置:
a1.sinks = spark
a1.sinks.spark.type = org.apache.spark.streaming.flume.sink.SparkSink
a1.sinks.spark.hostname = receiver-hostname
a1.sinks.port = port-used-for-sync-not-spark-port
a1.sinks.spark.channel = memoryChannel