spark-streaming之 socketTextStream

hgs19921112發表於2018-10-17
package hgs.spark.streaming
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.streaming.Seconds
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.storage.StorageLevel
import org.apache.spark.HashPartitioner
object SocketStreamingTest {
  def main(args: Array[String]): Unit = {
    
    val conf = new SparkConf();
    conf.setMaster("local[2]").setAppName("SocketStreaming")
    val context = new SparkContext(conf);
    //要新增spark-streaming的依賴包,spark的Seconds
    val streamContext  = new StreamingContext(context,Seconds(5));
    val ds = streamContext.socketTextStream("192.168.6.129", 8888, StorageLevel.MEMORY_ONLY);
    streamContext.checkpoint("d:\\chekpoint")
    //val ds2 = ds.flatMap(_.split(" ")).map((_,1)).reduceByKey((x,y)=>(x+y))//這種方式只是對該批次資料進行處理,並沒有累計上一個批次
    
    
    //updateFunc: (Iterator[(K, Seq[V], Option[S])]) K:單詞, Seq[V]該批次單詞出現次數列表,Option:上一次計算的結果
    val updateFunc=(iter:Iterator[(String,Seq[Int],Option[Int])])=>{
      //iter.flatMap(it=>Some(it._2.sum+it._3.getOrElse(0)).map((it._1,_)))//方式一
      //iter.flatMap{case(x,y,z)=>{Some(y.sum+z.getOrElse(0)).map((x,_))}}//方式二
      iter.flatMap(it=>Some(it._1,(it._2.sum.toInt+it._3.getOrElse(0))))//方式三
    }
    val partitionner = new HashPartitioner(2)
    //透過updateStatByKey來進行累加
    val ds2 = ds.flatMap(_.split(" ")).map((_,1)).updateStateByKey(updateFunc, partitionner, true)
    //列印
    ds2.print()
    streamContext.start()
    streamContext.awaitTermination()
  }
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31506529/viewspace-2216732/,如需轉載,請註明出處,否則將追究法律責任。

相關文章