SparkStreaming_window_sparksql_reids

1.5ウィンドウ

ローリングウィンドウ + スライディングウィンドウ

ウィンドウ操作はウィンドウ関数です。Spark Streaming はスライディング ウィンドウ操作のサポートを提供し、スライディング ウィンドウ内のデータに対して計算操作を実行できるようにします。RDD データがウィンドウに入るたびに集計されて計算処理が行われ、生成された RDD がウィンドウ DStream の RDD として使用されます。たとえば、次の図では、スライディング ウィンドウ計算が 3 秒ごとにデータに対して実行されます。この 3 秒以内の 3 つの RDD が処理のために集約され、2 秒後に最後の 3 秒以内のデータが処理されます。 . スライディング ウィンドウの計算を実行します。したがって、各スライディング ウィンドウ操作では、ウィンドウの長さとスライディング間隔という 2 つのパラメーターを指定する必要があり、これら 2 つのパラメーターの値はバッチ間隔の整数倍である必要があります。

  1. 赤い四角形はウィンドウであり、このウィンドウは一定期間内のデータ フローを保持します。

  2. ここでの各時間は時間単位であり、公式の例では、すべてのウィンドウ サイズが 3 時間単位で、2 時間単位ごとにウィンドウが 1 回スライドします。

したがって、ウィンドウベースの操作では、次の 2 つのパラメータを指定する必要があります。

ウィンドウの長さ - ウィンドウの長さ (図の 3)

スライド間隔 - ウィンドウベースの操作が実行される間隔 (図の 2)。

  1. ウィンドウ サイズは、個人的には一定期間内のデータのコンテナーのように感じます。

  2. スライド間隔は理解できる cron 式です。

事例の実装

package com.qianfeng.sparkstreaming 
import
org.apache.spark.SparkConf 
import org.apache.spark.streaming.dstream.DStream 
import org.apache.spark.streaming.{Seconds, StreamingContext} 
/
** 
  * 現時点での統計各キーがこれまでに出現した回数
  * 過去 N 個の長期期間内に生成されたデータによる M 回ごとのウィンドウ操作
  * M はスライド長さのスライド間隔
  * N はウィンドウの長さ ウィンドウの長さ
  */
オブジェクトDemo05_WCWithWindow { 
  def main(args: Array[String]): Unit = { 
    val conf = new SparkConf() 
      .setAppName("WordCountUpdateStateByKey") 
      .setMaster("local[*]") 
    val patchInterval = 2 
    val period = Seconds(batchInterval) ) 
    val ssc = new StreamingContext(conf,duration) 
    val Lines:DStream[String] = ssc.socketTextStream("qianfeng01", 6666) 
    valpairs:DStream[(String, Int)] = Lines. flatMap(_.split(") \\s+ ")).map((_, 1)) 
val
    ret:DStream[(String, Int)] =pairs.reduceByKeyAndWindow(_+_, 
      windowDuration = Seconds(batchInterval * 3), 
      slideDuration = Seconds(batchInterval) * 2) ) 
ret.print
    () 
ssc.start
    () 
    ssc.awaitTermination() 
  } 
}

1.6 SparkSQLとSparkStreamingの統合事例

Spark の最も強力な点は、Spark Core および Spark SQL と統合できることです。これまでに、transform や foreachRDD などの演算子を通じて、Spark Core を使用して DStream 内の RDD でバッチ操作を実行する方法を見てきました。次に、Spark SQL を使用して DStream で RDD を使用する方法を見てみましょう。

ケース: トップ 3 製品ソート: 最新のトップ 3

これは、これまでのさまざまなカテゴリの上位 3 つの製品売上の統計である updatestateByKey に基づいています。

コード

package com.qianfeng.sparkstreaming 
import
org.apache.spark.SparkConf 
import org.apache.spark.sql.SparkSession 
import org.apache.spark.streaming.{Seconds, StreamingContext} 
import org.apache.spark.streaming.dstream。 DStream 
/** 
 * SparkStreamingIntegrationSparkSQL のパターン例,热门品类top3排行
 * 输受信据格式:
 * id ブランド カテゴリ
 * 1 huwei watch 
 * 2 huawei Phone 
 * 
 */ 
object Demo06_SQLWithStreaming { 
  def main(args: Array[String]): Unit = { 
    val conf = new SparkConf() 
      .setAppName("StreamingIntegerationSQL") 
      .setMaster("local[*]") 
    val patchInterval = 2 
    val period = Seconds(batchInterval) 
    val spak = SparkSession.builder() 
      .config(conf) ) 
      .getOrCreate() 
    val ssc = new StreamingContext(spark.sparkContext, period) 
    ssc.checkpoint("/Users/liyadong/data/sparkdata/streamingdata/chk-1") 
    val Lines:DStream[String] = ssc.socketTextStream( "qianfeng01", 6666) 
    //001 モバイル
    val ペア:DStream[(String, Int)] = Lines.map(line => { 
      val field = line.split("\\s+") 
      if(fields == null || フィールド.length != 3) { 
        ("", -1) 
      } else { 
        val brand = field(1) 
        val category = field(2) 
        (s"${category}_${brand}", 1) 
      } 
    }).filter(t => t._2 != -1) 
val
    usb:DStream[(String, Int)] =pairs.updateStateByKey(updateFunc) 
usb.foreachRDD
    ((rdd, bTime) => { 
      if (!rdd.isEmpty()) {//category_brand count 
        import dark.implicits._ 
        val df = rdd.map{case (cb, count) => { 
          val category = cb.substring(0, cb.indexOf("_ ")) 
          val brand = cb.substring(cb.indexOf("_") + 1) 
          (カテゴリ、ブランド、数) 
        }}.toDF("カテゴリ", "ブランド", "販売") 
df.createOrReplaceTempView
        ( "tmp_category_brand_sales") 
        val sql = 
          """ 
            |選択
            | t.カテゴリー、
            | t.ブランド、
            | t.セールス、
            | t.rank 
            |from ( 
            | 選択
            | カテゴリ、
            | ブランド、
            | 売上、
            | row_number() over(カテゴリ別、売上明細別のパーティション) ランク
            | tmp_category_brand_sales から
            |) t
            |ここで、t.rank < 4 
            |; 
                    """.stripMargin 
        spar.sql(sql).show() 
      } 
    }) 
ssc.start
    () 
    ssc.awaitTermination() 
  } 
def
  updateFunc(seq: Seq[Int], オプション: Option[Int]): オプション[Int] = { 
    Option(seq.sum + option.getOrElse(0)) 
  } 
}

1.7 SparkStreaming は Reid を統合します

//将实时结果写入Redis中
dStream.foreachRDD((w,c)=>{
  val jedis = new Jedis("192.168.10.101", 6379)   //抽到公共地方即可
  jedis.auth("root")
  jedis.set(w.toString(),c.toString())  //一个key对应多个值,可以考虑hset
})

Guff_hys_python データ構造、ビッグデータ開発学習、Python トレーニング プロジェクト - CSDN ブログ

おすすめ

転載: blog.csdn.net/HYSliuliuliu/article/details/135006501