web-dev-qa-db-ja.com

Sparkジョブが大きなデータでハングする

S3(15日間のデータ)からクエリを実行しようとしています。私はそれらを別々に(毎日)クエリしてみましたが、うまくいきました。 14日間も問題なく動作します。しかし、15日間クエリを実行すると、ジョブは永久に実行され続け(ハングし)、タスク番号は更新されません。

私の設定 :

動的割り当てと最大リソースがオンになっている51ノードのクラスターr3.4xを使用しています。

私がしているのは=

val startTime="2017-11-21T08:00:00Z"
val endTime="2017-12-05T08:00:00Z"

val start = DateUtils.getLocalTimeStamp( startTime )
val end = DateUtils.getLocalTimeStamp( endTime )

val days: Int = Days.daysBetween( start, end ).getDays

val files: Seq[String] = (0 to days)
      .map( start.plusDays )
      .map( d => s"$input_path${DateTimeFormat.forPattern( "yyyy/MM/dd" ).print( d )}/*/*" )

sqlSession.sparkContext.textFile( files.mkString( "," ) ).count

同じものを14日で実行すると、197337380(カウント)を取得し、15日目を個別に実行して27676788を取得しました。しかし、合計15日をクエリすると、ジョブがハングします。

更新:

仕事はうまくいきます:

  var df = sqlSession.createDataFrame(sc.emptyRDD[Row], schema)

    for(n <- files ){
      val tempDF = sqlSession.read.schema( schema ).json(n)
      df = df(tempDF)
    }

df.count

しかし、なぜ今は機能するが以前は機能しないのかを誰かが説明できますか?

更新:mapreduce.input.fileinputformat.split.minsizeを256 GBに設定した後、正常に動作するようになりました。

6
user3407267

動的割り当てと最大リソース割り当てはどちらも異なる設定であり、一方がアクティブになると一方が無効になります。 EMRのリソース割り当てを最大化すると、ノードごとに1つのエグゼキュータが起動され、すべてのコアとメモリがそのエグゼキュータに割り当てられます。

別のルートを取ることをお勧めします。 51ノードのかなり大きなクラスターがあるようですが、それが必要かどうかさえわかりません。ただし、最初はこの経験則に従ってください。そうすれば、これらの構成を調整する方法のコツをつかむことができます。

  • クラスターメモリ-処理しているデータの最低2倍。

ここで、51ノードが必要であると仮定して、以下を試してください。

  • r3.4xには16個のCPUが搭載されているため、OSやその他のプロセス用に1つ残しておくことで、すべてのCPUを使用できます。
  • エグゼキュータの数を150に設定します。これにより、ノードごとに3つのエグゼキュータが割り当てられます。
  • エグゼキュータあたりのコア数を5に設定します(ノードあたり3エグゼキュータ)
  • エグゼキュータメモリをおおよそ合計ホストメモリ/ 3 = 35Gに設定します
  • 並列処理(デフォルトのパーティション)を制御する必要があります。これを、使用しているコアの総数〜800に設定します。
  • シャッフルパーティションを調整します-これをコア数の2倍にします-1600

上記の構成は、私にとって魅力のように機能しています。 Spark UIでリソース使用率を監視できます。

また、yarn config /etc/hadoop/conf/capacity-scheduler.xmlファイル、設定yarn.scheduler.capacity.resource-calculatorからorg.Apache.hadoop.yarn.util.resource.DominantResourceCalculator-これにより、Sparkは、これらのCPUで実際にフルスロットルになります。変更後にyarnサービスを再起動します。

9
rohitkulky

エグゼキュータメモリと#エグゼキュータを増やす必要があります。データが膨大な場合は、ドライバメモリを増やしてみてください。

私の提案は、動的リソース割り当てを使用せずに実行して、それがまだハングするかどうかを確認することです(sparkジョブはクラスターリソース全体を消費し、他のアプリケーションがリソースを不足させる可能性があることに注意してくださいジョブが実行されていない場合のこのアプローチ)。ハングしない場合は、リソース割り当てを試してから、リソースのハードコーディングを開始し、リソースを増やし続けて、使用できる最適なリソース割り当てを見つけられるようにします。

以下のリンクは、リソースの割り当てとリソースの最適化を理解するのに役立ちます。

http://site.clairvoyantsoft.com/understanding-resource-allocation-configurations-spark-application/

https://community.hortonworks.com/articles/42803/spark-on-yarn-executor-resource-allocation-optimiz.html

0
roh