Spark DStream sammelt Daten aus verschiedenen Datenquellen (RDD-Warteschlange, Datei, DIY-Sammler, Kafka) (Scala-Programmierung)

Inhaltsverzeichnis

1. RDD-Warteschlange

2 textFileStream

3 DIY-Sammler

4 Kafka-Datenquelle [Wichtige Punkte]


1. RDD-Warteschlange

       a. Verwendungsszenario: Test
       b. Implementierungsmethode: Erstellen Sie einen DStream über ssc.queueStream(queueOfRDDs). Jedes an diese Warteschlange gesendete RDD wird als DStream verarbeitet.

    val  sparkconf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("stream")
    val ssc = new StreamingContext(sparkconf,Seconds(3))

    // 创建一个队列对象,队列中存放的是RDD
    val queue = new mutable.Queue[RDD[String]]()
    // 通过队列创建DStream
    val queueDS: InputDStream[String] = ssc.queueStream(queue)

    queueDS.print()

    // 启动采集器
    ssc.start()
       //这个操作之所以放在这个位置,是为了模拟流式的感觉,数据源源不断的生产
       for(i <- 1 to 5 ){
          // 循环创建rdd
          val rdd: RDD[String] = ssc.sparkContext.makeRDD(List(i.toString))
          // 将RDD存放到队列中
          queue.enqueue(rdd)
          // 当前线程休眠1秒
          Thread.sleep(6000)         
       }
        // 等待采集器的结束
    ssc.awaitTermination()
    }

2 textFileStream

   val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("textFileStream")
    val ssc = new StreamingContext(sparkConf,Seconds(3))

    //从文件中读取数据
    val textDS: DStream[String] = ssc.textFileStream("in")
    textDS.print()
  
    // 启动采集器
    ssc.start()

    // 等待采集器的结束
    ssc.awaitTermination()

3 DIY-Sammler

    1. Benutzerdefinierter Kollektor
    2. Unter welchen Umständen ist es notwendig, einen Kollektor anzupassen?
         Lesen Sie beispielsweise Daten von MySQL und HBase.
         Die Funktion des Sammlers besteht darin, Daten gemäß dem Erfassungszyklus an einem bestimmten Ort zu sammeln.
         Derzeit gibt es: Sammeln von Kafka, Sammeln von Daten vom angegebenen Port des Netcat-Tools, Sammeln von Daten im Dateiverzeichnis usw.
    3. Die Schritte zum Anpassen des Kollektors, Nachahmen von socketTextStream
         a, Anpassen der Kollektorklasse, Erben von Erweiterungen und Spezifizieren Datengenerika, Weisen Sie gleichzeitig den Attributen der übergeordneten Klasse Werte zu, geben Sie die Ebene der Datenspeicherung
         b an und überschreiben Sie die Methoden onStart und onStop
            onStart: So starten Sie den Collector
            onStop: So stoppen Sie den Collector

val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("DIY")
    val ssc = new StreamingContext(sparkConf, Seconds(3))

    // 获取采集的流
    val ds: ReceiverInputDStream[String] = ssc.receiverStream(new MyReciver("localhost",9999))
    ds.print()

    ssc.start()
    ssc.awaitTermination()
  }

  // 继承extends Reciver,并指定数据泛型,同时对父类的属性赋值,指定数据存储的级别
  class MyReciver(host: String, port: Int) extends Receiver[String](StorageLevel.MEMORY_ONLY) {

    private var socket: Socket = _
    def receive = {
     // 获取输入流
      val reader = new BufferedReader(
        new InputStreamReader(
          socket.getInputStream,
          "UTF-8"
        )
      )
      // 设定一个间接变量
      var s: String = null
      while (true) {
        // 按行读取数据
        s = reader.readLine()
        if (s != null) {
      // 将数据进行封装
          store(s)
        }
      }

    }

    // 1. 启动采集器
    override def onStart(): Unit = {
      socket = new Socket(host, port)
      new Thread("Socket Receiver") {
        setDaemon(true)
        override def run() {
          receive
        }
      }.start()


    }

    // 2. 停止采集器
    override def onStop(): Unit = {
      socket.close()
      socket = null


    }
  }

4 Kafka-Datenquelle [Wichtige Punkte]

- DirectAPI: Der berechnete Executor verbraucht aktiv Kafka-Daten und die Geschwindigkeit wird von selbst gesteuert.
-- Konfigurationsinformationen werden grundsätzlich auf eine feste Weise geschrieben

 // TODO Spark环境
    // SparkStreaming使用核数最少是2个
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("streaming")
    val ssc = new StreamingContext(sparkConf, Seconds(3))

    // TODO 使用SparkStreaming读取Kafka的数据

    // Kafka的配置信息
    val kafkaPara: Map[String, Object] = Map[String, Object](
      ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> "hadoop105:9092,hadoop106:9092,hadoop107:9092",
      ConsumerConfig.GROUP_ID_CONFIG -> "atguigu",
      "key.deserializer" -> "org.apache.kafka.common.serialization.StringDeserializer",
      "value.deserializer" -> "org.apache.kafka.common.serialization.StringDeserializer"
    )

    val kafkaDStream: InputDStream[ConsumerRecord[String, String]] =
      KafkaUtils.createDirectStream[String, String](
        ssc,
        LocationStrategies.PreferConsistent,
        ConsumerStrategies.Subscribe[String, String](Set("atguigu"), kafkaPara)
      )
    // 获取数据,key是null,value是真实的数据
    val valueDStream: DStream[String] = kafkaDStream.map(record => record.value())
   
    valueDStream.flatMap(_.split(" "))
      .map((_, 1))
      .reduceByKey(_ + _)
      .print()

    ssc.start()
    // 等待采集器的结束
    ssc.awaitTermination()

 

Guess you like

Origin blog.csdn.net/jojo_oulaoula/article/details/133852399