• Spark任务执行期间写临时文件报错导致失败


    spark任务在执行期间,有时候会遇到临时目录创建失败,导致任务执行错误。

    java.io.IOException: Failed to create local dir in ……
    

    spark执行过程的文件夹

    1. spark创建临时文件机制
      spark作为并行计算框架,同一个作业会被划分为多个任务在多个节点执行,reduce的输入可能存在于多个节点,因此需要shuffle将所有reduce的输入汇总起来;而shuffle时需要通过diskBlockManage将map结果写入本地,优先写入memory store,在memore store空间不足时会创建临时文件。
    2. 临时文件夹配置
      memory store的大小取决于spark.excutor.memory参数,默认为spark.excutor.memory*0.6;可通过spark.env中添加配置SPARK_LOCAL_DIRS或程序中设定spark.local.dir,可配置多个路径,逗号分隔增强io效率。
        SPARK_LOCAL_DIRS:
        Directory to use for "scratch" space in Spark, including map output files and RDDs that get stored on disk. 
        This should be on a fast, local disk in your system. 
        It can also be a comma-separated list of multiple  directories on different disks.
    

    原因分析

    常见原因包括

    1. 临时目录文件过多导致,当一个spark任务执行失败时,之前创建的临时文件不会被删除,就会残留下来,spark任务失败次数越多,就越可能导致临时目录故障。
    2. 磁盘空间、inode资源、权限(比如巡检项修改)等

    主要排查手段

    进入临时目录,查看下临时目录当前状况,尝试手动创建是否ok。
    
    1. 磁盘空间问题。
      排查:磁盘空间不足,或者磁盘掉载;通过df -hdu -sh或者fdisk查询磁盘空间。
      解决:删除旧文件释放空间;或者挂载新盘。

    2. 目录权限不对。
      排查:进入spark.local.dir临时目录,查询权限。
      解决:修改成正确权限。

    3. 临时目录文件过多。
      在spark.local.dir手动创建临时目录时,报错Too many links……
      排查:查询文件目录下是否文件/目录个数超限,ll | wc -l
      解决:删除旧文件释放空间;或者挂载新盘。

      linux ext2/ext3单个目录下子目录+文件个数不能超过32000,除去默认子目录当前目录(.)和上级目录(..)之外,一个目录下最多能创建31998个(子目录+文件)。而ext4系统无此限制。可以通过命令df -lhT查询。
      include/linux/ext2_fs.h:#define EXT2_LINK_MAX           32000
      include/linux/ext3_fs.h:#define EXT3_LINK_MAX           32000
      
    4. inode资源不足
      排查:查询磁盘inode资源使用,df -i
      解决:删除旧文件释放空间;或者挂载新盘。

  • 相关阅读:
    第六章类(十一)构造函数4对象初始化器和集合初始化器
    第六章类(十)构造函数3new
    第六章类(九)构造函数2默认构造函数
    Javascript---- 练习八(字符串操作)
    图解CSS3----white-space空白符处理
    图解CSS3----word-break单词断行
    图解CSS3----word-wrap(单词换行)
    图解CSS3----text-overflow(文本溢出属性)
    图解CSS3----vertical-align(文本垂直对齐方式)
    Javascript---- 练习五(函数,事件绑定)
  • 原文地址:https://www.cnblogs.com/HopkinsCybn/p/10087336.html
Copyright © 2020-2023  润新知