代码之家  ›  专栏  ›  技术社区  ›  Umesh K

如何避免Spark执行器由于内存限制而丢失和纱线容器杀死它?

  •  18
  • Umesh K  · 技术社区  · 9 年前

    我有以下代码 hiveContext.sql() 大多数时候。我的任务是为所有配置单元表分区创建几个表并在处理后将值插入。

    所以我先开火 show partitions 在for循环中使用它的输出,我调用一些方法来创建表(如果它不存在),并使用 hiveContext.sql .

    现在,我们无法执行 hiveContext 在一个执行器中,所以我必须在驱动程序的for循环中执行它,并且应该一个接一个地串行运行。当我在YARN集群中提交这个Spark作业时,几乎所有时候我的执行器都会因为shuffle未找到异常而丢失。

    现在发生这种情况是因为YARN因为内存过载而杀死了我的执行器。我不明白为什么,因为每个蜂巢分区都有一个非常小的数据集,但它仍然会导致YARN杀死我的执行器。

    下面的代码是否会并行执行所有操作并同时在内存中容纳所有配置单元分区数据?

    public static void main(String[] args) throws IOException {   
        SparkConf conf = new SparkConf(); 
        SparkContext sc = new SparkContext(conf); 
        HiveContext hc = new HiveContext(sc); 
    
        DataFrame partitionFrame = hiveContext.sql(" show partitions dbdata partition(date="2015-08-05")"); 
      
        Row[] rowArr = partitionFrame.collect(); 
        for(Row row : rowArr) { 
            String[] splitArr = row.getString(0).split("/"); 
            String server = splitArr[0].split("=")[1]; 
            String date =  splitArr[1].split("=")[1]; 
            String csvPath = "hdfs:///user/db/ext/"+server+".csv"; 
            if(fs.exists(new Path(csvPath))) { 
                hiveContext.sql("ADD FILE " + csvPath); 
            } 
            createInsertIntoTableABC(hc,entity, date); 
            createInsertIntoTableDEF(hc,entity, date); 
            createInsertIntoTableGHI(hc,entity,date); 
            createInsertIntoTableJKL(hc,entity, date); 
            createInsertIntoTableMNO(hc,entity,date); 
       } 
    }
    
    2 回复  |  直到 8 年前
        1
  •  19
  •   gsamaras    8 年前

    通常,您应该始终深入日志以获取真正的异常(至少在Spark 1.3.1中)。

    tl;博士
    Spark under Yarn的安全配置
    spark.shuffle.memoryFraction=0.5 -这将允许无序使用更多分配的内存
    spark.yarn.executor.memoryOverhead=1024 -这是以MB为单位设置的。当内存使用量大于(executor memory+executor.memoryOverhead)时,Yarn会杀死执行器

    更多信息

    通过阅读你的问题,你提到你得到了洗牌没有找到例外。

    万一 org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 你应该增加 spark.shuffle.memoryFraction ,例如0.5

    Yarn杀死我的执行者最常见的原因是内存使用超出了预期。 为了避免增加 spark.yarn.executor.memoryOverhead ,我将其设置为1024,即使我的执行者只使用2-3G内存。

        2
  •  0
  •   Paul Roub Mark Dail    5 年前

    这是我的假设:您的集群上必须有有限的执行者,并且作业可能在共享环境中运行。

    正如您所说,您的文件大小很小,您可以设置较少的执行器数量,增加执行器核心,并设置 memoryOverhead 财产在这里很重要。

    1. 设置执行者数量=5
    2. 设置执行器内核数=4
    3. 设置内存开销=2G
    4. shuffle分区=20(根据执行器和内核使用最大并行度)

    使用上述属性,我确信您可以避免任何执行器内存不足的问题,而不会影响性能。