web-dev-qa-db-ja.com

ビッグデータセットを処理するときのFetchFailedExceptionまたはMetadataFetchFailedException

1 GBのデータセットで解析コードを実行すると、エラーなしで完了します。しかし、一度に25 GBのデータを試行すると、エラーが発生します。私は、以下の障害を回避する方法を理解しようとしています。提案やアイデアを喜んで聞いてください。

さまざまなエラー、

org.Apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 0

org.Apache.spark.shuffle.FetchFailedException: Failed to connect to ip-xxxxxxxx

org.Apache.spark.shuffle.FetchFailedException: Error in opening FileSegmentManagedBuffer{file=/mnt/yarn/nm/usercache/xxxx/appcache/application_1450751731124_8446/blockmgr-8a7b17b8-f4c3-45e7-aea8-8b0a7481be55/08/shuffle_0_224_0.data, offset=12329181, length=2104094}

クラスターの詳細:

糸:8ノード
合計コア数:64
メモリ:500 GB
Sparkバージョン:1.5

Spark送信ステートメント:

spark-submit --master yarn-cluster \
                        --conf spark.dynamicAllocation.enabled=true \
                        --conf spark.shuffle.service.enabled=true \
                        --executor-memory 4g \
                        --driver-memory 16g \
                        --num-executors 50 \
                        --deploy-mode cluster \
                        --executor-cores 1 \
                        --class my.parser \
                        myparser.jar \
                        -input xxx \
                        -output xxxx \

スタックトレースの1つ:

at org.Apache.spark.MapOutputTracker$$anonfun$org$Apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:460)
at org.Apache.spark.MapOutputTracker$$anonfun$org$Apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:456)
at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:772)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:771)
at org.Apache.spark.MapOutputTracker$.org$Apache$spark$MapOutputTracker$$convertMapStatuses(MapOutputTracker.scala:456)
at org.Apache.spark.MapOutputTracker.getMapSizesByExecutorId(MapOutputTracker.scala:183)
at org.Apache.spark.shuffle.hash.HashShuffleReader.read(HashShuffleReader.scala:47)
at org.Apache.spark.rdd.ShuffledRDD.compute(ShuffledRDD.scala:90)
at org.Apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
at org.Apache.spark.rdd.RDD.iterator(RDD.scala:264)
at org.Apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
at org.Apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
at org.Apache.spark.rdd.RDD.iterator(RDD.scala:264)
at org.Apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.Apache.spark.scheduler.Task.run(Task.scala:88)
at org.Apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617)
at Java.lang.Thread.run(Thread.Java:745)
36
WoodChopper

このエラーは、エグゼキューターのメモリの問題が原因であることがほぼ保証されています。これらのタイプの問題に対処するいくつかの方法を考えることができます。

1)パーティションを増やして実行することもできます(repartitiondataframeを実行します)。通常、メモリの問題は、1つ以上のパーティションにメモリに収まらないデータが含まれている場合に発生します。

2)_spark.yarn.executor.memoryOverhead_を明示的に設定していないことに気づいたので、デフォルトではmax(386, 0.10* executorMemory)になります。それは私には低く聞こえます。私はそれを1GBに増やしようとします(memoryOverheadを1GBに増やす場合は、_--executor-memory_を3GBに下げる必要があることに注意してください)

3)障害が発生したノードのログファイルを調べます。 「キリングコンテナ」というテキストを探します。 「物理メモリの制限を超えて実行中」というテキストが表示された場合、memoryOverheadを増やすと、私の経験では問題が解決します。

上記のメモリおよびネットワーク設定の問題に加えて、大きなテーブル(たとえば、複数のTBここ))の場合、タイムアウトの取得によりorg.Apache.spark.shuffle.FetchFailedExceptionが発生する可能性があることに注意してくださいパーティションをシャッフルします。この問題を修正するには、次を設定します。

SET spark.reducer.maxReqsInFlight=1;  -- Only pull one file at a time to use full network bandwidth.
SET spark.shuffle.io.retryWait=60s;  -- Increase the time to wait while retrieving shuffle partitions before retrying. Longer times are necessary for larger files.
SET spark.shuffle.io.maxRetries=10;

また、Spark timeout spark.network.timeoutを800などのより大きな値に設定します。デフォルトの120秒では、負荷が高いときに多くのエグゼキューターがタイムアウトします。

4
Ted

OK.

これには実際にいくつかの方法があります。 Glennieの素晴らしい答えが述べたように、これはおそらくメモリの問題であるため、everythingに十分なメモリがあることを確認してください。コンテナメモリ、AMメモリ、マップメモリ​​、メモリ削減など、注意が必要な構成があります。 this を読むと、適切な構成を見つけるのに非常に役立ちます。自分で番号を選択する必要がありますが、ここで設定したいくつかのプロパティがあります。

yarn-site.xml

<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>32768</value>
</property>

<property>
    <name>yarn.app.mapreduce.am.resource.mb</name>
    <value>4096</value>
</property>

<property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>4096</value>
</property>

mapred-site.xml

<property>
    <name>mapreduce.map.memory.mb</name>
    <value>4096</value>
</property>

<property>
    <name>mapreduce.reduce.memory.mb</name>
    <value>4096</value>
</property>

これらは、起動時にクラッシュするPySpark Shellなど、他のエラーを修正する可能性があります。しかし、私の場合、一部のエラー(MetadataFetchFailedエラーなど)は消えましたが、問題は続きました。正確なエラーは次のとおりです。

org.Apache.spark.shuffle.FetchFailedException:DB-ETA-C/x.x.x.x:34085への接続に失敗しました

すべての可能なYARNとSparkからのプロパティSpark YARNシャッフルサービスへのタイムアウト)で遊んだ後、エラーログで失敗したコンテナがx.x.x.xを探して、ローカル(内部)IPnetstat -tulpn | grep <PORT NUM>の実行中にyyyy:34085を返しました。ここで、yyyyはexternalですIPアドレス:これはメモリの問題ではなく、単にネットワーク構成の問題でした。

ホスト名が/etc/hostsの外部IPに関連付けられていたため、Sparkサービスは外部インターフェイスにバインドされていましたonly)。問題が修正された/etc/hostsファイル。

結論:エラーは明らかに、あるコンテナが別のコンテナに到達できないことを示しています。これは通常、メモリの問題が原因でコンテナの障害が原因ですが、ネットワークの問題でもある可能性があるため、特にノードに複数のインターフェイスがある場合は、それらにも注意してください。

3
Iman Akbari