spark报错:Missing an output location for shuffle(已解决)

现象

执行大数据量的join等操作时出现:
1.Missing an output location for shuffle;
2.Failed to connect to bigdata030015/100.103.131.13:38742;
3.FileNotFoundException……(not such file or directory)。
4.Container killed on request. Exit code is 143

产生原因

原因:shuffle分为shuffle write和shuffle read两部分。shuffle write的分区数由上一阶段的RDD分区数控制,shuffle read的分区数则是由Spark提供的一些参数控制。shuffle write可以简单理解为类似于saveAsLocalDiskFile的操作,将计算的中间结果按某种规则临时放到各个executor所在的本地磁盘上。
shuffle read的时候数据的分区数则是由spark提供的一些参数控制。可以想到的是,如果这个参数值设置的很小,同时shuffle read的量很大,那么将会导致一个task需要处理的数据非常大。结果导致JVM crash(OOM),从而导致取shuffle数据失败,同时executor也丢失了,看到Failed to connect to host的错误,也就是executor lost的意思。有时候即使不会导致JVM crash也会造成长时间的gc

解决方案

  1. 调优sql。
  2. SparkSQL和DataFrame的join,group by等操作通过spark.sql.shuffle.partitions控制分区数,默认为200,根据shuffle的量以及计算的复杂度提高这个值。
  3. Rdd的join,groupBy,reduceByKey等操作,通过spark.default.parallelism控制shuffle read与reduce处理的分区数,设置大一点。
  4. 通过提高executor的内存设置spark.executor.memory适当提高executor的memory值。
赞(2) 打赏
特别声明:除特殊标注,本站文章均为原创,遵循CC BY-NC 3.0,转载请注明出处。三伏磨 » spark报错:Missing an output location for shuffle(已解决)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏