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に設定した後、正常に動作するようになりました。
動的割り当てと最大リソース割り当てはどちらも異なる設定であり、一方がアクティブになると一方が無効になります。 EMRのリソース割り当てを最大化すると、ノードごとに1つのエグゼキュータが起動され、すべてのコアとメモリがそのエグゼキュータに割り当てられます。
別のルートを取ることをお勧めします。 51ノードのかなり大きなクラスターがあるようですが、それが必要かどうかさえわかりません。ただし、最初はこの経験則に従ってください。そうすれば、これらの構成を調整する方法のコツをつかむことができます。
ここで、51ノードが必要であると仮定して、以下を試してください。
上記の構成は、私にとって魅力のように機能しています。 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サービスを再起動します。
エグゼキュータメモリと#エグゼキュータを増やす必要があります。データが膨大な場合は、ドライバメモリを増やしてみてください。
私の提案は、動的リソース割り当てを使用せずに実行して、それがまだハングするかどうかを確認することです(sparkジョブはクラスターリソース全体を消費し、他のアプリケーションがリソースを不足させる可能性があることに注意してくださいジョブが実行されていない場合のこのアプローチ)。ハングしない場合は、リソース割り当てを試してから、リソースのハードコーディングを開始し、リソースを増やし続けて、使用できる最適なリソース割り当てを見つけられるようにします。
以下のリンクは、リソースの割り当てとリソースの最適化を理解するのに役立ちます。
http://site.clairvoyantsoft.com/understanding-resource-allocation-configurations-spark-application/