Dos formas clásicas de usar SparkStream:

todo el mundo:

  ¡es bueno! Las dos formas clásicas de usar SparkStream solo involucran SparkStream, pero no involucran varias conexiones. La fuente de datos es el número de puerto de tcp.

El primer tipo: Calcule los datos según el intervalo, sin procesar los datos históricos.

package SparkStream

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
  * Created by Administrator on 2017/10/10.
  * 功能:演示sparkStream的wordcount
  *
  */
object StreamWc {
  def main(args: Array[String]): Unit = {

   //设置日志的级别
    LoggerLevels.setStreamingLogLevels()
  val conf=new SparkConf().setAppName("StreamWc").setMaster("local[2]")
  val sc=new SparkContext(conf)
  val ssc=new StreamingContext(sc,Seconds(5))

   //创建DStream  接收数据
   val DStream=ssc.socketTextStream("192.168.17.108",8888)
   val result=DStream.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
   result.print()

   //启动spark任务
    ssc.start()
    //等待结束任务
    ssc.awaitTermination()

  }
}

 

Primero, lea los datos del puerto TCP

yum install nc

nc -lk 8888

En segundo lugar, ejecute SparkStream, verifique la entrada de datos de tcp, si SparkStream se ha procesado

El segundo tipo: Calcule los datos de acuerdo con el intervalo y necesite integrar los datos históricos.

package SparkStream

import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}

/**
  * Created by Administrator on 2017/10/10.
  * 功能:演示SparkStream中的wordcount的累加
  *
  */
object StreamWc_Sum {
  /**
    * String : 单词 hello
    * Seq[Int] :单词在当前批次出现的次数
    * Option[Int] : 历史结果
    */
   val updateFunc=(iter:Iterator[(String,Seq[Int],Option[Int])])=>{
     //iter.flatMap(it=>Some(it._2.sum + it._3.getOrElse(0)).map(x=>(it._1,x)))
  iter.flatMap{case(x,y,z)=>Some(y.sum+z.getOrElse(0)).map(m=>(x,m))}
}


  def main(args: Array[String]): Unit = {
    //设置日志的级别
    LoggerLevels.setStreamingLogLevels()
    val conf=new SparkConf().setAppName("StreamWc_Sum").setMaster("local[2]")
    val sc=new SparkContext(conf)
    val ssc=new StreamingContext(sc,Seconds(5))
    // ss做累加之前,一定要做checkpoint,而且存储的目录一定是hdfs
    //做checkpoint 写入共享存储中
    ssc.checkpoint("c://test//wc_sum")
    val lines=ssc.socketTextStream("192.168.17.108",8888)
    //没有累加的计数
//    val result=lines.flatMap(_.split(" ")).map((_,1)).reduceByKey()
   // 用默认的hash分区, true表示以后也这样用的
//updateStateByKey结果可以累加但是需要传入一个自定义的累加函数:updateFunc  三个参数
      val result=lines.flatMap(_.split(" ")).map((_,1)).updateStateByKey(updateFunc,
  new HashPartitioner(ssc.sparkContext.defaultParallelism), true)
    result.print()

   //启动sparkstream
    ssc.start()
    等待结束任务
    ssc.awaitTermination()

  }
}

 

Primero, lea los datos del puerto TCP

yum install nc

nc -lk 8888

En segundo lugar, ejecute SparkStream para verificar la entrada de datos de tcp, si SparkStream se ha procesado y concéntrese en el procesamiento de datos históricos:

Piense personalmente en los puntos centrales:

1 función updateFunc

2 el operador de scala updateStateByKey, el punto de control que se debe hacer antes

 Estos dos puntos no son fáciles de escribir, sugiero guardar el código. Modifique sobre esta base la próxima vez, no escriba desde cero

 

 

Supongo que te gusta

Origin blog.csdn.net/zhaoxiangchong/article/details/81668304
Recomendado
Clasificación