我使用Spark和YARN集群管理器。
我从Cassandra表创建一个数据集,其中包含大约700行,其中包含5列,其中一列包含JSON格式的数据。数据量仅以MB为单位。
我用:{/ p>运行spark-shell
我收到此错误:
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
时,显示错误。
答案 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:检查所有工作人员是否有其他服务正在消耗大量资源。