我有一个包含terasort的火花工作台,当数据只有几百GB时它可以正常运行,但是当我生成更多数据(例如1 TB)时,它在某些步骤中出错了。以下是我的代码:
import org.apache.spark.rdd._
import org.apache.spark._
import org.apache.spark.SparkContext._
object ScalaTeraSort{
def main(args: Array[String]){
if (args.length < 2){
System.err.println(
s"Usage: $ScalaTeraSort <INPUT_HDFS> <OUTPUT_HDFS>"
)
System.exit(1)
}
val sparkConf = new SparkConf().setAppName("ScalaTeraSort")
val sc = new SparkContext(sparkConf)
val file = sc.textFile(args(0))
val data = file.map(line => (line.substring(0, 10), line.substring(10)))
.sortByKey().map{case(k, v) => k + v}
data.saveAsTextFile(args(1))
sc.stop()
}
}
此代码主要包括3个步骤:sortByKey,map和saveAsTextFile。似乎前两步没有错,但是当涉及第三步时,它一直出错,然后重试第二步。第三步出错是因为 “FetchFailed(BlockManagerId(40,sr232,44815,0),shuffleId = 0,mapId = 11825,reduceId = 0)”
答案 0 :(得分:4)
我发现原因,基本问题是: java.io.IOException:sendMessage可能因为未在60秒内收到确认而失败
也就是说,你必须设置属性&#34; spark.core.connection.ack.wait.timeout&#34;更大的值,默认情况下它是60秒。另外,由于长时间没有回应,舞台会失败。