火花故障:由以下原因引起:org.apache.spark.shuffle.FetchFailedException:框架太大:5454002341

时间:2018-07-11 06:06:21

标签: apache-spark apache-spark-sql yarn

我正在为确定父级孩子的表生成层次结构。

以下是所使用的配置,即使在收到有关太大框架的错误之后:

火花属性

--conf spark.yarn.executor.memoryOverhead=1024mb --conf 
yarn.nodemanager.resource.memory-mb=12288mb  --driver-memory 32g --driver- 
cores  8 --executor-cores 32 --num-executors 8 --executor-memory  256g --conf 
spark.maxRemoteBlockSizeFetchToMem=15g

import org.apache.log4j.{Level, Logger};
import org.apache.spark.SparkContext;
import org.apache.spark.sql.{DataFrame, SparkSession};
import org.apache.spark.sql.functions._;
import org.apache.spark.sql.expressions._;


lazy val sparkSession = SparkSession.builder.enableHiveSupport().getOrCreate();

import spark.implicits._;

val hiveEmp: DataFrame = sparkSession.sql("select * from db.employee");
hiveEmp.repartition(300);
import org.apache.spark.sql.functions._;

val nestedLevel = 3;

val empHierarchy = (1 to nestedLevel).foldLeft(hiveEmp.as("wd0")) { (wDf, i) =>
val j = i - 1
wDf.join(hiveEmp.as(s"wd$i"), col(s"wd$j.parent_id".trim) === col(s"wd$i.id".trim), "left_outer")
}.select(
col("wd0.id") :: col("wd0.parent_id") ::
col("wd0.amount").as("amount") :: col("wd0.payment_id").as("payment_id") :: (
(1 to nestedLevel).toList.map(i => col(s"wd$i.amount").as(s"amount_$i")) :::
(1 to nestedLevel).toList.map(i => col(s"wd$i.payment_id").as(s"payment_id_$i"))

): _*);

empHierarchy.write.saveAsTable("employee4");

错误

Caused by: org.apache.spark.SparkException: Task failed while writing rows
   at org.apache.spark.sql.execution.datasources.FileFormatWriter$.org$apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask(FileFormatWriter.scala:204)
   at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$write$1$$anonfun$3.apply(FileFormatWriter.scala:129)
   at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$write$1$$anonfun$3.apply(FileFormatWriter.scala:128)
   at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
   at org.apache.spark.scheduler.Task.run(Task.scala:99)
   at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:322)
   ... 3 more
Caused by: org.apache.spark.shuffle.FetchFailedException: Too large frame: 5454002341
   at org.apache.spark.storage.ShuffleBlockFetcherIterator.throwFetchFailedException(ShuffleBlockFetcherIterator.scala:361)
   at org.apache.spark.storage.ShuffleBlockFetcherIterator.next(ShuffleBlockFetcherIterator.scala:336)

5 个答案:

答案 0 :(得分:3)

使用此spark配置,spark.maxRemoteBlockSizeFetchToMem <2g

由于2G分区存在很多问题(无法随机播放,无法在磁盘上缓存),因此它会抛出failedfetchedexception太大的数据帧。

答案 1 :(得分:3)

Suresh是正确的。这是他的答案的格式更好的文档,带有一些有用的背景信息:

如果您使用的是2.2.x或2.3.x版本,则可以通过将config的值设置为Int.MaxValue - 512,即设置spark.maxRemoteBlockSizeFetchToMem=2147483135来达到相同的效果。有关截至2019年9月使用的default value的信息,请参见此处。

答案 2 :(得分:1)

这意味着数据集分区的大小巨大。您需要将数据集重新分区为更多分区。

您可以使用

favoriteJsonArray

在这里,mAdapter.notifyDataSetChanged()取决于数据集的大小。

答案 3 :(得分:1)

尝试回填几年的数据时,得到了完全相同的错误。原来,这是因为您的分区大小> 2gb。

  1. 您可以提高分区数量(使用repartition()),以使分区小于2GB。 (将分区保持在128mb至256mb左右,即接近HDFS块大小)

  2. 或者如上所述,您可以将随机播放限制提高到> 2GB。 (避开它)。另外,具有大量数据的分区将导致任务花费很长时间才能完成。

注意:在写入s3 / hdfs期间,重新分区(n)将导致每个分区 n 个零件文件。

阅读此以获取更多信息: http://www.russellspitzer.com/2018/05/10/SparkPartitions/

答案 4 :(得分:0)

在处理约700GB数据集时,我遇到了同样的问题。减少spark.maxRemoteBlockSizeFetchToMem对我的情况没有帮助。此外,我无法增加分区数量。

执行以下操作对我有用:

  1. 增加spark.network.timeout(Spark 2.3中的默认值为120秒)会影响以下内容:
spark.core.connection.ack.wait.timeout
spark.storage.blockManagerSlaveTimeoutMs
spark.shuffle.io.connectionTimeout
spark.rpc.askTimeout
spark.rpc.lookupTimeout
  1. 设置spark.network.timeout=600s(在Spark 2.3中默认为120秒)

  2. 设置spark.io.compression.lz4.blockSize=512k(在Spark 2.3中默认为32k)

  3. 设置spark.shuffle.file.buffer=1024k(在Spark 2.3中默认为32k)