文章目录

  • 基本数据源
  • 1. 文件流(textFileStream)
  • 2. RDD队列流(queueStream,队列里是RDD)
  • 3. 套接字流(socketTextStream)


基本数据源

Spark Streaming 是一个流式计算引擎,就需要对接外部数据源来接收数据。每一个输入流DStream和一个Receiver对象相关联,这个Receiver从源中获取数据,并将数据存入内存中用于处理。

基本数据源有:文件系统、套接字连接、Akka的actor等。

1. 文件流(textFileStream)

监控文件系统的变化,如果有文件增加,读取新的内容
① 这些文件具有相同的格式
② 这些文件通过原子移动或重命名文件的方式在dataDirectory创建
③ 如果在文件中追加内容,这些追加的新数据不会被读取。

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
import org.apache.spark.storage.StorageLevel
 
object FileStreaming {
  def main(args: Array[String]): Unit = {
     
    System.setProperty("hadoop.home.dir", "G:\\bin\\hadoop-2.5.2")
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
 
    //local[2]代表开启两个线程
    val conf = new SparkConf().setAppName("FileStreaming").setMaster("local[2]")
 
    //接收两个参数,第一个conf,第二个是采样时间间隔
    val ssc = new StreamingContext(conf, Seconds(3))
     
    //监控目录 如果文件系统发生变化 就读取进来
    val lines = ssc.textFileStream("H:\\tmp_files\\test_file_stream")
     
    lines.print()
     
    ssc.start()
    ssc.awaitTermination()
  }
}

2. RDD队列流(queueStream,队列里是RDD)

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
import scala.collection.mutable.Queue
import org.apache.spark.rdd.RDD
 
object RDDQueueStream {
 
  def main(args: Array[String]): Unit = {
 
    System.setProperty("hadoop.home.dir", "G:\\bin\\hadoop-2.5.2")
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
     
    val conf = new SparkConf().setAppName("RDDQueueStream").setMaster("local[2]")
     
    val ssc = new StreamingContext(conf,Seconds(1))
     
    //需要一个RDD队列
    val rddQueue = new Queue[RDD[Int]]()
     
    for( i <- 1 to 3){
      rddQueue += ssc.sparkContext.makeRDD(1 to 10)
       
      Thread.sleep(5000)
    }
     
    //从队列中接收数据 创建DStream
    val inputDStream = ssc.queueStream(rddQueue)
     
    val result = inputDStream.map(x=>(x,x*2))
     
    result.print()
     
    ssc.start()
    ssc.awaitTermination()
 
  }
}

3. 套接字流(socketTextStream)

val lines = sc.socketTextStream("192.168.15.131",1234)
lines.print()