在Spark中获取错误:执行程序丢失

时间:2015-10-12 06:08:19

标签: python apache-spark rdd

我有一个主服务器和两个服务器,每个服务器运行在32 GB的RAM上,我正在读取一个包含大约1800万条记录的csv文件(第一行是列的标题)。

这是我用来运行作业的命令

./spark-submit --master yarn --deploy-mode client --executor-memory 10g <path/to/.py file>

我做了以下

rdd = sc.textFile("<path/to/file>")
h = rdd.first()
header_rdd = rdd.map(lambda l: h in l)
data_rdd = rdd.subtract(header_rdd)
data_rdd.first()

我收到以下错误消息 -

15/10/12 13:52:03 WARN cluster.YarnSchedulerBackend$YarnSchedulerEndpoint: ApplicationMaster has disassociated: 192.168.1.114:51058
15/10/12 13:52:03 WARN cluster.YarnSchedulerBackend$YarnSchedulerEndpoint: ApplicationMaster has disassociated: 192.168.1.114:51058
15/10/12 13:52:03 WARN remote.ReliableDeliverySupervisor: Association with remote system [akka.tcp://sparkYarnAM@192.168.1.114:51058] has failed, address is now gated for [5000] ms. Reason: [Disassociated]
15/10/12 13:52:03 ERROR cluster.YarnScheduler: Lost executor 1 on hslave2: remote Rpc client disassociated
15/10/12 13:52:03 INFO scheduler.TaskSetManager: Re-queueing tasks for 1 from TaskSet 3.0
15/10/12 13:52:03 WARN remote.ReliableDeliverySupervisor: Association with remote system [akka.tcp://sparkExecutor@hslave2:58555] has failed, address is now gated for [5000] ms. Reason: [Disassociated]
15/10/12 13:52:03 WARN scheduler.TaskSetManager: Lost task 6.6 in stage 3.0 (TID 208, hslave2): ExecutorLostFailure (executor 1 lost)

rdd.subtract()运行时出现此错误。然后,我修改了代码并删除了rdd.subtract()并将其替换为rdd.filter()

修改后的代码 - &gt;

rdd = sc.textFile("<path/to/file>")
h = rdd.first()
data_rdd = rdd.filter(lambda l: h not in l)

但我得到了同样的错误。

有谁知道遗嘱执行人丢失的原因是什么?

是否是因为运行群集的计算机内存不足?

2 个答案:

答案 0 :(得分:4)

这不是一个Spark bug本身,但可能与您对Java,Yarn和Spark-config文件的设置有关。

请参阅http://apache-spark-user-list.1001560.n3.nabble.com/Executor-Lost-Failure-td18486.html

您希望增加Java内存,增加akka帧大小,增加akka超时设置等。

尝试以下spark.conf:

spark.master                       yarn-cluster
spark.yarn.historyServer.address   <your cluster url>
spark.eventLog.enabled             true
spark.eventLog.dir                 hdfs://<your history directory>
spark.driver.extraJavaOptions      -Xmx20480m -XX:MaxPermSize=2048m -XX:ReservedCodeCacheSize=2048m
spark.checkpointDir                hdfs://<your checkpoint directory>
yarn.log-aggregation-enable        true
spark.shuffle.service.enabled      true
spark.shuffle.service.port         7337
spark.shuffle.consolidateFiles     true
spark.sql.parquet.binaryAsString   true
spark.speculation                  false
spark.yarn.maxAppAttempts          1
spark.akka.askTimeout              1000
spark.akka.timeout                 1000
spark.akka.frameSize               1000
spark.rdd.compress true
spark.storage.memoryFraction 1
spark.core.connection.ack.wait.timeout 600
spark.driver.maxResultSize         0
spark.task.maxFailures             20
spark.shuffle.io.maxRetries        20

您可能还想在Spark程序中使用多少分区请求,并且您可能希望在RDD中添加一些partitionBy(分区程序)语句,因此您的代码可能是这样的:

myPartitioner = new HashPartitioner(<your number of partitions>)

rdd = sc.textFile("<path/to/file>").partitionBy(myPartitioner)
h = rdd.first()
header_rdd = rdd.map(lambda l: h in l)
data_rdd = rdd.subtract(header_rdd)
data_rdd.first()

最后,您可能需要使用spark-submit命令并添加执行程序数,执行程序内存和驱动程序内存的参数

./spark-submit --master yarn --deploy-mode client --num-executors 100 --driver-memory 20G --executor-memory 10g <path/to/.py file>

答案 1 :(得分:2)

我有一个执行程序丢失错误,因为我正在使用sc.wholeTextFiles()调用,我的一个输入文件很大,为149M。它导致执行程序失败。我不认为149M实际上非常大,但却导致它失败。