私はSpark 1.6.3、Scala 2.11.8を使用していました。スパーク1.6.3 rdd.foreachのブロードキャスト変数が多すぎる
私は、ブロードキャストをrdd.foreachで使用すると、信じられないほどの時間がかかりますが、実際には "FINISHED"には到着しませんでした。
val histDS = sc.textFile(args.head)
.map(_.split("\t"))
.filter(r => r(17).length > 0 && r(18).length > 0)
.map(r => HistoryRecord(r(22), r(17).toLong))
val cycle = sc.broadcast[Cycle](Cycle())
for (rec: HistoryRecord <- histDS) {
// do something, cycle works as global variable
}
次多分それは約10分を実行し続けるよう
主なコードがあり、私は、プロセスを停止するが、私は唯一の次のコードのようにforループで値を印刷する場合、それが正常に動作します。
for (rec: HistoryRecord <- histDS) {
println(rec)
}
次に、次のコードを使用して、rddを使用してみました。 collect()関数は、 "for"ループで使用される配列を取得します。
val histDS = sc.textFile(args.head)
.map(_.split("\t"))
.filter(r => r(17).length > 0 && r(18).length > 0)
.map(r => HistoryRecord(r(22), r(17).toLong))
.collect()
このコードは正常に実行され、約2分で終了します。
だから誰でも知っていますか? collect()は、rddを使用するのと比べてパフォーマンスに影響します。 foreach?