1.5ウィンドウ
ローリングウィンドウ + スライディングウィンドウ
ウィンドウ操作はウィンドウ関数です。Spark Streaming はスライディング ウィンドウ操作のサポートを提供し、スライディング ウィンドウ内のデータに対して計算操作を実行できるようにします。RDD データがウィンドウに入るたびに集計されて計算処理が行われ、生成された RDD がウィンドウ DStream の RDD として使用されます。たとえば、次の図では、スライディング ウィンドウ計算が 3 秒ごとにデータに対して実行されます。この 3 秒以内の 3 つの RDD が処理のために集約され、2 秒後に最後の 3 秒以内のデータが処理されます。 . スライディング ウィンドウの計算を実行します。したがって、各スライディング ウィンドウ操作では、ウィンドウの長さとスライディング間隔という 2 つのパラメーターを指定する必要があり、これら 2 つのパラメーターの値はバッチ間隔の整数倍である必要があります。
-
赤い四角形はウィンドウであり、このウィンドウは一定期間内のデータ フローを保持します。
-
ここでの各時間は時間単位であり、公式の例では、すべてのウィンドウ サイズが 3 時間単位で、2 時間単位ごとにウィンドウが 1 回スライドします。
したがって、ウィンドウベースの操作では、次の 2 つのパラメータを指定する必要があります。
ウィンドウの長さ - ウィンドウの長さ (図の 3)
スライド間隔 - ウィンドウベースの操作が実行される間隔 (図の 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 ブログ