ブロードキャストブロードキャスト変数

ブロードキャストブロードキャスト変数
       ブロードキャスト変数は、より大きなオブジェクトを効率的に分散し、1つ以上のスパーク操作のためにすべての作業ノードに大きな読み取り専用値を送信するために使用されます。
       たとえば、アプリケーションがすべてのノードに大きな読み取り専用ルックアップテーブルを送信する必要がある場合、またはマシンラーニング1アルゴリズムの大きな特徴ベクトルを送信する必要がある場合、
ブロードキャスト変数は非常に使いやすいです。

変数のブロードキャスト変数を
       ブロードキャストする場合、ドライバー側の変数は各ワーカー側にブロードキャストされ、ワー​​カー側は変数の値のコピーを1つだけ受信します。
アプリケーションシナリオ
      ジョブが送信された後、タスクの実行中に、計算プロセス中にドライバーから複数回フェッチする必要がある1つ以上の値がある場合、この時点で大量のネットワークIOが必然的に発生します。
       現時点では、最初にドライバーエンドの可変値を各ワーカーエンドにブロードキャストしてから、計算プロセス中にローカルで値を取得するだけで効率が向上し、ネットワークIOを回避するのが最善です。ブロードキャストする場合、ドライバー側の変数は各ワーカー側にブロードキャストされ、1つのワーカー側で1つのコピーのみが受信されます。
:ブロードキャスト値は正確な値である必要があります。RDDはブロードキャストできません(RDDはデータの説明であるため、正確な値は取得されません)。RDDをブロードキャストする場合は、RDDに対応するデータをドライバー側に取得してから取得する必要があります。入って、もう一度放送してください。放送データは不変です。

import org.apache.spark.{
    
    SparkConf, SparkContext}

object BroadcastDemo {
    
    
  def main(args: Array[String]): Unit = {
    
    
    val conf = new SparkConf()
    conf.setAppName(this.getClass.getName).setMaster("local[2]")
    val sc = new SparkContext(conf)
    //list是在Driver端创建也相当于本地变量
    val list = List("hello java")
    //封装广播变量,并进行广播,该方法也是transformation,只有action的时候才执行
    val broadcast = sc.broadcast(list)
    //算子部分是在Executor端执行
    val lines = sc.parallelize(List("dd ff","ff ffd"))
    //使用广播变量进行数据处理value可以获取广播变量的值
    val filterStr = lines.filter(broadcast.value.contains(_))
    filterStr.foreach(println)

    sc.stop()

  }
}

おすすめ

転載: blog.csdn.net/qq_42706464/article/details/108440617