私はSpark SQLプログラムで作業していますが、次の例外を受け取っています:
_16/11/07 15:58:25 ERROR yarn.ApplicationMaster: User class threw exception: Java.util.concurrent.TimeoutException: Futures timed out after [3000 seconds]
Java.util.concurrent.TimeoutException: Futures timed out after [3000 seconds]
at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219)
at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:223)
at scala.concurrent.Await$$anonfun$result$1.apply(package.scala:190)
at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:53)
at scala.concurrent.Await$.result(package.scala:190)
at org.Apache.spark.sql.execution.joins.BroadcastHashJoin.doExecute(BroadcastHashJoin.scala:107)
at org.Apache.spark.sql.execution.SparkPlan$$anonfun$execute$5.apply(SparkPlan.scala:132)
at org.Apache.spark.sql.execution.SparkPlan$$anonfun$execute$5.apply(SparkPlan.scala:130)
at org.Apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150)
at org.Apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:130)
at org.Apache.spark.sql.execution.Project.doExecute(basicOperators.scala:46)
at org.Apache.spark.sql.execution.SparkPlan$$anonfun$execute$5.apply(SparkPlan.scala:132)
at org.Apache.spark.sql.execution.SparkPlan$$anonfun$execute$5.apply(SparkPlan.scala:130)
at org.Apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150)
at org.Apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:130)
at org.Apache.spark.sql.execution.Union$$anonfun$doExecute$1.apply(basicOperators.scala:144)
at org.Apache.spark.sql.execution.Union$$anonfun$doExecute$1.apply(basicOperators.scala:144)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:245)
at scala.collection.immutable.List.map(List.scala:285)
at org.Apache.spark.sql.execution.Union.doExecute(basicOperators.scala:144)
at org.Apache.spark.sql.execution.SparkPlan$$anonfun$execute$5.apply(SparkPlan.scala:132)
at org.Apache.spark.sql.execution.SparkPlan$$anonfun$execute$5.apply(SparkPlan.scala:130)
at org.Apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150)
at org.Apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:130)
at org.Apache.spark.sql.execution.columnar.InMemoryRelation.buildBuffers(InMemoryColumnarTableScan.scala:129)
at org.Apache.spark.sql.execution.columnar.InMemoryRelation.<init>(InMemoryColumnarTableScan.scala:118)
at org.Apache.spark.sql.execution.columnar.InMemoryRelation$.apply(InMemoryColumnarTableScan.scala:41)
at org.Apache.spark.sql.execution.CacheManager$$anonfun$cacheQuery$1.apply(CacheManager.scala:93)
at org.Apache.spark.sql.execution.CacheManager.writeLock(CacheManager.scala:60)
at org.Apache.spark.sql.execution.CacheManager.cacheQuery(CacheManager.scala:84)
at org.Apache.spark.sql.DataFrame.persist(DataFrame.scala:1581)
at org.Apache.spark.sql.DataFrame.cache(DataFrame.scala:1590)
at com.somecompany.ml.modeling.NewModel.getTrainingSet(FlowForNewModel.scala:56)
at com.somecompany.ml.modeling.NewModel.generateArtifacts(FlowForNewModel.scala:32)
at com.somecompany.ml.modeling.Flow$class.run(Flow.scala:52)
at com.somecompany.ml.modeling.lowForNewModel.run(FlowForNewModel.scala:15)
at com.somecompany.ml.Main$$anonfun$2.apply(Main.scala:54)
at com.somecompany.ml.Main$$anonfun$2.apply(Main.scala:54)
at scala.Option.getOrElse(Option.scala:121)
at com.somecompany.ml.Main$.main(Main.scala:46)
at com.somecompany.ml.Main.main(Main.scala)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:498)
at org.Apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:542)
16/11/07 15:58:25 INFO yarn.ApplicationMaster: Final app status: FAILED, exitCode: 15, (reason: User class threw exception: Java.util.concurrent.TimeoutException: Futures timed out after [3000 seconds])
_
スタックトレースから認識するコードの最後の部分はcom.somecompany.ml.modeling.NewModel.getTrainingSet(FlowForNewModel.scala:56)
で、次の行に移動します:profilesDF.cache()
キャッシングの前に、2つのデータフレーム間の結合を実行します。結合前に両方のデータフレームを保持することについての答えを見ました here いくつかの変換で使用しているため、まだ結合されたデータフレームをキャッシュする必要があります
そして、この例外がスローされる原因は何だと思いましたか?それを検索すると、rpcタイムアウト例外または私の問題ではないいくつかのセキュリティ問題に対処するリンクに移動しました
前もって感謝します
質問:この例外がスローされる原因は何だと思いましたか?
回答:
spark.sql.broadcastTimeout
300ブロードキャスト参加のブロードキャスト待機時間の秒単位のタイムアウト
spark.network.timeout
120sすべてのネットワークインタラクションのデフォルトタイムアウト..spark.network.timeout (spark.rpc.askTimeout)
、spark.sql.broadcastTimeout
、spark.kryoserializer.buffer.max
(kryoシリアル化を使用している場合)などは、複雑なクエリを処理するためのデフォルト値。これらの値から始めて、SQLワークロードに応じて調整できます。
注: ドキュメントによると
次のオプション(spark.sql。プロパティを参照)を使用して、クエリ実行のパフォーマンスを調整することもできます。より多くの最適化が自動的に実行されるため、これらのオプションは将来のリリースで非推奨になる可能性があります。*
また、理解を深めるために、 BroadCastHashJoin を参照してください。executeメソッドは、上記のスタックトレースのトリガーポイントです。
protected override def doExecute(): RDD[Row] = {
val broadcastRelation = Await.result(broadcastFuture, timeout)
streamedPlan.execute().mapPartitions { streamedIter =>
hashJoin(streamedIter, broadcastRelation.value)
}
}
master as local[n]
にジョブを送信したときに、Yarn-cluster
を設定していました。
クラスターで実行するときにコードでマスターを設定しないで、代わりに--master
を使用してください。
Ramからの提案がいくつかのケースで機能することを知っているのは良いことです。私はこの例外に何度かつまずいたことに言及したいと思います(説明されているものを含む here )。
ほとんどの場合、それは、一部のエグゼキューターのほとんどサイレントOOMによるものでした。失敗したタスクのSparkUIを確認します。この表の最後の列: OOMメッセージが表示される場合があります。
spark internalsを十分に理解している場合、ブロードキャストされたデータはドライバーを通過します。したがって、ドライバーには、エグゼキューターからデータを収集し、すべてに送信するスレッドメカニズムがあります。失敗すると、これらのタイムアウトになる可能性があります。
DynamicAllocationを有効にした場合は、この構成を無効にしてみてください(spark.dynamicAllocation.enabled = false)。これを設定することができますspark conf/spark-defaults.confの下の構成、-confまたはコード内で。
こちらもご覧ください: