SparkStreamを使用する2つの古典的な方法:

全員:

  いいです!SparkStreamを使用する2つの古典的な方法には、SparkStreamのみが含まれ、さまざまな接続は含まれません。データソースはtcpのポート番号です。

最初のタイプ:履歴データを処理せずに、間隔に従ってデータを計算します

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()

  }
}

 

まず、TCPポートからデータを読み取ります

yum install nc

nc -lk 8888

次に、SparkStreamを実行し、tcpからのデータ入力を確認して、SparkStreamが処理されているかどうかを確認します。

2番目のタイプ:間隔に従ってデータを計算し、履歴データを統合する必要があります

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()

  }
}

 

まず、TCPポートからデータを読み取ります

yum install nc

nc -lk 8888

次に、SparkStreamを実行して、tcpからのデータ入力をチェックし、SparkStreamが処理されたかどうかを確認し、履歴データの処理に焦点を合わせます。

個人的にコアポイントを考えてください:

1関数updateFunc

2 scalaの演算子updateStateByKey、前に実行するチェックポイント

 これらの2つのポイントを書くのは簡単ではありません。コードを保存することをお勧めします。次回はこれに基づいて変更し、最初から作成しないでください

 

 

おすすめ

転載: blog.csdn.net/zhaoxiangchong/article/details/81668304
おすすめ