SparkStreaming中的数据抽象叫做DStream。DStream是抽象类,它把连续的数据流拆成很多的小RDD数据块, 这叫做“微批次”, spark的流式处理, 都是“微批次处理”。 DStream内部实现上有批次处理时间间隔,滑动窗口等机制来保证每个微批次的时间间隔里, 数据流以RDD的形式发送给spark做进一步处理。因此, 在一个为批次的处理时间间隔里, DStream只产生一个RDD。
1、Socket数据源
- Scala版本——WordCount计算
package com.sparkscala.streaming
import org.apache.log4j.{
Level, Logger}
import org.apache.spark.streaming.dstream.{
DStream, ReceiverInputDStream}
import org.apache.spark.{
SparkConf, SparkContext}
import org.apache.spark.streaming.{
Seconds, StreamingContext}
/**
* 数据源:从 socket 中获取数据
*/
object StreamingWordCountScala {
def main(args: Array[String]): Unit = {
Logger.getLogger("org").setLevel(Level.WARN)
//一、初始化程序入口
/**
* local[1] 中括号里面的数字都代表的是启动几个工作线程,默认情况下是一个工作线程。
* 那么作为sparkStreaming 我们至少要开启两个线程,因为其中一个线程用来接收数据,这样另外一个线程用来处理数据。
* Seconds 指的是每次数据数据的时间范围(batch interval)
*/
val conf: SparkConf = new SparkConf().setMaster("local[2]").setAppName(this.getClass.getSimpleName)
val ssc: StreamingContext = new StreamingContext(conf, Seconds(3))
//二、获取数据流,就是数据源
//从 socket 中获取数据
val lines: ReceiverInputDStream[String] = ssc.socketTextStream("192.168.244.130", 1234)
//三、数据处理
//val result: DStream[(String, Int)] = lines.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
val words: DStream[String] = lines.flatMap(_.split(" "))
val wordAndOne: DStream[(String, Int)] = words.map((_, 1))
val wordResult: DStream[(String, Int)] = wordAndOne.reduceByKey(_ + _)
//四、数据输出查看
wordResult.print()
//五、启动任务
ssc.start() //启动
ssc.awaitTermination() //线程等待,等待处理下一批次任务