Hadoop 运行Spark作业时出现奇怪的错误

Hadoop 运行Spark作业时出现奇怪的错误,hadoop,bigdata,apache-spark,google-hadoop,Hadoop,Bigdata,Apache Spark,Google Hadoop,我正在运行一个有80台机器的spark cluster。每台机器都是一个具有8核和50GB内存的虚拟机(Spark似乎可以使用41个) 我在几个输入文件夹上运行,我估计输入的大小约为250GB gz压缩 我在驱动程序日志中遇到错误,我不知道该如何处理。示例(按照它们在日志中出现的顺序): 因为我的作业类(Phase0)不是任何堆栈跟踪的一部分,所以我不确定从这些问题源的错误中可以学到什么。有什么建议吗 编辑:特别是,即使在处理几GB的文件夹时,以下异常也会发生在我身上: 271722 [Resu

我正在运行一个有80台机器的spark cluster。每台机器都是一个具有8核和50GB内存的虚拟机(Spark似乎可以使用41个)

我在几个输入文件夹上运行,我估计输入的大小约为250GB gz压缩

我在驱动程序日志中遇到错误,我不知道该如何处理。示例(按照它们在日志中出现的顺序):

因为我的作业类(Phase0)不是任何堆栈跟踪的一部分,所以我不确定从这些问题源的错误中可以学到什么。有什么建议吗

编辑:特别是,即使在处理几GB的文件夹时,以下异常也会发生在我身上:

271722 [Result resolver thread-3] WARN org.apache.spark.scheduler.TaskSetManager  - Lost task 247.0 in stage 2.0 (TID 883, hadoop-w-79.c.taboola-qa-01.internal): java.lang.NullPointerException: 
org.apache.spark.util.collection.ExternalAppendOnlyMap.insertAll(ExternalAppendOnlyMap.scala:153)
            org.apache.spark.Aggregator.combineValuesByKey(Aggregator.scala:58)
            org.apache.spark.shuffle.hash.HashShuffleWriter.write(HashShuffleWriter.scala:55)
            org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:68)
            org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41)
            org.apache.spark.scheduler.Task.run(Task.scala:54)
            org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:177)
            java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
            java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
            java.lang.Thread.run(Thread.java:745)

该解决方案并不特定于此处提到的例外情况,但最终我能够使用以下准则克服Spark中的所有问题:

  • 所有机器都应根据ulimit和进程内存进行调整,如下所示:
  • 将以下内容添加到/etc/security/limits.conf:

    hadoop soft nofile 900000
    root soft nofile 900000
    hadoop hard nofile 990000
    root hard nofile 990000
    hadoop hard memlock unlimited
    root hard memlock unlimited
    hadoop soft memlock unlimited
    root soft memlock unlimited
    
    至/etc/pam.d/common-session和至/etc/pam.d/common-session-noninteractive:

    "session required pam_limits.so"
    
  • 核心使用:如果使用虚拟机,我建议为Spark分配n-1个核心,留下1个核心用于通信和其他任务

  • 分区:我建议使用的分区数量是集群中已用内核数量的5到10倍。如果您看到“内存不足”错误,您需要增加分区的数量(首先通过增加因子,然后通过向集群添加计算机)

  • 按键输出数组-如果您看到诸如“数组大小超过VM限制”之类的错误,则每个键的数据可能太多,因此需要减少每个键的数据量。例如,如果您按照1小时的间隔输出文件,请尝试减少到10分钟,甚至1分钟的间隔

  • 如果您仍然看到错误,请在Spark bug报告中查找错误,您可能希望确保升级到最新的Spark版本。对我来说,目前版本1.2修复了一个会导致我的工作失败的错误

  • 使用Kryo registrator,将所有RDD转换逻辑转换为在单独的类中运行,并确保使用Kryo注册所有这些类


  • 这是哪个Spark版本?我正在运行Spark 1.1
    "session required pam_limits.so"