Spark 2.x管理与开发-Spark Streaming-Spark Streaming进阶(六)【输入DStreams和接收器】

输入DStreams表示从数据源获取输入数据流的DStreams。

在NetworkWordCount例子中,lines表示输入DStream,它代表从netcat服务器获取的数据流。

每一个输入流DStream和一个Receiver对象相关联,这个Receiver从源中获取数据,并将数据存入内存中用于处理。

输入DStreams表示从数据源获取的原始数据流。

Spark Streaming拥有两类数据源:

  • 基本源(Basic sources):这些源在StreamingContext API中直接可用。例如文件系统、套接字连接、Akka的actor等
  • 高级源(Advanced sources):这些源包括Kafka,Flume,Kinesis,Twitter等等。

下面通过具体的案例,详细说明:

一、文件流:

通过监控文件系统的变化,若有新文件添加,则将它读入并作为数据流

需要注意的是:

① 这些文件具有相同的格式

② 这些文件通过原子移动或重命名文件的方式在dataDirectory创建

③ 如果在文件中追加内容,这些追加的新数据也不会被读取。

注意:要演示成功,需要在原文件中编辑,然后拷贝一份。

*********自己操作********

文件流(监控文件系统的变化,如果文件有增加,读取新的文件内容),用到的很少

Spark Streaming监视文件夹,如果有变化,把变化的内容采集进来。

Scala代码:

package streamingExamples
/**
  * 文件流
 */
import org.apache.log4j.Logger
import org.apache.log4j.Level
import org.apache.spark.SparkConf
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.streaming.Seconds

object FileStreaming {
  def main(args: Array[String]): Unit = {
    //下面的两行代码定义日志级别,可以减少打印出来的日志
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
    
    //一、创建Spark环境
    //保证CPU的核数大于等于2,"local[2]"表示开启两个线程
    //一个线程用于读取数据,一个线程用于计算处理数据
    val conf=new SparkConf().setMaster("local[2]").setAppName("FileStreaming")
    //二、定时采样
    //因为SparkStreaming是将连续的数据流变成不连续的RDD,所以就是定时采样。
    //接收两个参数,其中:Seconds(3)是采样时间间隔,这里就是3秒
    val ssc=new StreamingContext(conf,Seconds(3))
    //三、创建DStream
    val lines=ssc.textFileStream("D:\\tmp_files\\test_file_stream")
    //四、打印
    lines.print()
    //五、启动StreamingContext进行计算
    ssc.start()
    //六、等待任务结束
    ssc.awaitTermination()
  }
}

结果:

首先,运行此程序

然后在要监控的目录下新创建一个文本

添加内容如下:

 

接下来进行保存和重命名

发现程序执行的日志里出现了此文件的内容:

 

二、RDD队列流:

使用streamingContext.queueStream(queueOfRDD)创建基于RDD队列的DStream,用于调试Spark Streaming应用程序。

 

*********自己操作********

RDD队列流(DStream本质就是RDD),用到的很少

Scala代码:

package streamingExamples
/**
 * RDD队列流
 * 如果源数据直接就是一个RDD队列,Spark就直接对接这个队列即可
 */
import org.apache.log4j.Logger
import org.apache.log4j.Level
import org.apache.spark.SparkConf
import org.apache.spark.SparkConf
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.streaming.Seconds
import scala.collection.mutable.Queue
import org.apache.spark.rdd.RDD

object RDDQueueStream {
  def main(args: Array[String]): Unit = {
    //下面的两行代码定义日志级别,可以减少打印出来的日志
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
    
    //一、创建Spark环境
    //保证CPU的核数大于等于2,"local[2]"表示开启两个线程
    //一个线程用于读取数据,一个线程用于计算处理数据
    val conf=new SparkConf().setMaster("local[2]").setAppName("RDDQueueStream")
    //二、定时采样
    //因为SparkStreaming是将连续的数据流变成不连续的RDD,所以就是定时采样。
    //接收两个参数,其中:Seconds(1)是采样时间间隔,这里就是1秒
    val ssc=new StreamingContext(conf,Seconds(1))
    //三、创建DStream
    //1.新建RDD队列
    val rddQueue=new Queue[RDD[Int]]()
    //2.添加数据-循环三次
    for(i<-1 to 3){
      rddQueue+=ssc.sparkContext.makeRDD(1 to 10) //从数字1到10
      Thread.sleep(3000) //睡3秒
    }
    //3.从队列中接收数据
    val inputDStream=ssc.queueStream(rddQueue)
    val result=inputDStream.map(x=>(x,x*2))
    //四、打印
    result.print()
    //五、启动StreamingContext进行计算
    ssc.start()
    //六、等待任务结束
    ssc.awaitTermination()
  }
}

结果:

 

 

 

 

 

三、套接字流:

套接字流(SocketTextStream),用到的也比较有限。

通过监听Socket端口来接收数据

   

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3