为什么收集数据集会因org.apache.spark.shuffle.FetchFailedException而失败?

时间:2017-05-31 12:10:44

标签: scala apache-spark apache-spark-sql spark-cassandra-connector

我使用Spark和YARN集群管理器。

我从Cassandra表创建一个数据集,其中包含大约700行,其中包含5列,其中一列包含JSON格式的数据。数据量仅以MB为单位。

我用:{/ p>运行spark-shell

  • spark.executor.memory =4克
  • spark.driver.memory =2克

我收到此错误:

  

org.apache.spark.shuffle.FetchFailedException:无法连接到org.apache.spark.storage.ShuffleBlockFetcherIterator.throwFetchFailedException(ShuffleBlockFetcherIterator.scala:323)中的bosirahtaicas02.bscuat.local / 172.17.0.1:53093

我正在尝试从dataFrame

收集数据

我直接在spark-shell中逐行运行以下代码:

import org.apache.spark.sql._
import org.apache.spark.sql.cassandra._

import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.SparkContext

import com.datastax.spark.connector.cql._
import com.datastax.spark.connector._

import org.json._
import java.sql.Timestamp

val sqc = new SQLContext(sc)
val csc = new CassandraSQLContext(sc)

val allRecordsDF = sqc.read.format("org.apache.spark.sql.cassandra").
    option("table", "xyz").
    option("keyspace", 'pqr").load().cache()

val allRowsDF = allRecordsDF.select(allRecordsDF.col("record_type"), allRecordsDF.col("process_time"))

val allPatientsTS = allRowsDF.where(allRowsDF("record_type") === "patient").select("process_time").sort("process_time")

当我尝试收集allPatientsTS Dataframe时,显示错误。

2 个答案:

答案 0 :(得分:2)

引用我关于FetchFailedException的说明:

  任务运行时可能会抛出

FetchFailedException异常(ShuffleBlockFetcherIterator无法获取随机块)。

FetchFailedException的根本原因通常是 ,因为执行者(使用用于随机块的BlockManager)由于以下原因而丢失(即不再可用):

  • 可能会抛出OutOfMemoryError(也就是OOMed)或其他一些未处理的异常。

  • 使用Spark应用程序的执行程序管理工作程序的集群管理器,例如YARN(这是这里的情况),强制执行容器内存限制,并最终因内存使用过多而决定终止执行程序。

您应该使用Web UI,Spark History Server或特定于群集的工具(例如Hadoop YARN的yarn logs -applicationId)查看Spark应用程序的日志。

解决方案通常是 来调整Spark应用程序的内存。

正如您所看到的,如果没有对数据集进行全面审查(最重要的是它在Spark上的大小和分区方案)并在YARN中登录,很难确切地说出导致FetchFailedException的原因。

答案 1 :(得分:1)

我也遇到过类似的问题。为了找到解决方案,我花了几周的时间来实现许多建议,这些建议包括:配置,分区,内存份额增加,网络超时等。但是,所有人都没有为我提供解决方案。

最后,我在小型集群中找到了问题。 worker节点的RAM大小为8 GB,并且我已经在.conf文件中将worker内存配置为6 GB(用于更大的开销)。不幸的是,其中一名工作人员的后台服务正在消耗3 GB的内存,这就是发生此问题的原因(因为所有工作人员都试图为每个工作人员映射6GB的内存)。我在spark-defaults.conf文件中将工作内存降级为4GB,现在我没有遇到这个问题。 N.B:检查所有工作人员是否有其他服务正在消耗大量资源。