在nm启动container的过程中,有一个步骤是把当前的tokens写入本地目录,默认情况下具体的调用的方法是在DefaultContainerExecutor类的startLocalizer 方法中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  public synchronized void startLocalizer (Path nmPrivateContainerTokensPath,
      InetSocketAddress nmAddr, String user, String appId, String locId,
      List<String> localDirs, List<String> logDirs)
      throws IOException, InterruptedException {
    ContainerLocalizer localizer =
        new ContainerLocalizer( lfs, user, appId, locId, getPaths(localDirs),
            RecordFactoryProvider.getRecordFactory(getConf()));
    createUserLocalDirs(localDirs, user); //Initialize the local directories for a particular user,create $local.dir/usercache/$user and its immediate parent
    createUserCacheDirs(localDirs, user); //Initialize the local cache directories for a particular user.$local.dir/usercache/$user,$local.dir/usercache/$user/appcache,$local.dir/usercache/$user/filecache
    createAppDirs(localDirs, user, appId); //Initialize the local directories for a particular user.$local.dir/usercache/$user/appcache/$appi
    createAppLogDirs(appId, logDirs); //Create application log directories on all disks.create $log.dir/$appid
    // TODO : Why pick first app dir. The same in LCE why not random?
    Path appStorageDir = getFirstApplicationDir (localDirs, user, appId);
    String tokenFn = String.format(ContainerLocalizer.TOKEN_FILE_NAME_FMT, locId);
    Path tokenDst = new Path (appStorageDir, tokenFn);
    lfs.util().copy(nmPrivateContainerTokensPath, tokenDst);
    LOG.info( "Copying from " + nmPrivateContainerTokensPath + " to " + tokenDst);
    lfs.setWorkingDirectory(appStorageDir);
    LOG.info( "CWD set to " + appStorageDir + " = " + lfs.getWorkingDirectory());
    // TODO : DO it over RPC for maintaining similarity?
    localizer.runLocalization(nmAddr);
  }

主要注意 getFirstApplicationDir (localDirs, user, appId)这一段,先生成token文件的名称,然后调用copy的操作把具体的token文件cp到yarn的本地工作目录。

这里getFirstApplicationDir 方法,传入的第一个参数是yarn写临时数据的目录,和

1
yarn.nodemanager.local-dirs(List of directories to store localized files in.)

相关

1
2
3
4
  private Path getFirstApplicationDir (List<String> localDirs, String user,
      String appId) {
    return getApplicationDir( new Path(localDirs.get(0)), user, appId);
  }

而这里使用了localDirs.get(0),再来看下localDirs的生成:

localDirs的获取定义在ResourceLocalizationService内部类LocalizerRunner类的run方法中:

1
2
3
4
 private LocalDirsHandlerService dirsHandler;
....
        List<String> localDirs = dirsHandler.getLocalDirs();
        List<String> logDirs = dirsHandler.getLogDirs();

调用LocalDirsHandlerService 类:

1
2
3
4
5
6
7
8
  /** Local dirs to store localized files in */
  private DirectoryCollection localDirs = null;
  /** storage for container logs*/
  private DirectoryCollection logDirs = null;
      localDirs = new DirectoryCollection(
          validatePaths(conf.getTrimmedStrings(YarnConfiguration.NM_LOCAL_DIRS)));
      logDirs = new DirectoryCollection(
          validatePaths(conf.getTrimmedStrings(YarnConfiguration.NM_LOG_DIRS)));

这里localDirs 是通过解析yarn.nodemanager.local-dirs配置项的值获取的,因为配置项是一定的,这就导致得出的localDirs 一直是同一个List,从而导致写入token的目录一直是同一个目录,这其实是一个bug:

https://issues.apache.org/jira/browse/YARN-2566

导致在写入token文件时,所有的container的token都会写到同一个目录,解决的方法其实是使用了随机数的方式,具体可以看patch.

本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1585277,如需转载请自行联系原作者

yarn container写token目录选择bug相关推荐

  1. 如何查看yarn container日志 查看yarn任务所有container信息 yarn gc日志的查看和简单分析

    查看yarn任务日志 任务运行中和结束时查看container的日志 GC日志的简单分析 文章目录 一.shell和yarn基础命令准备 二.app日志查看 1. 直接使用yarn logs,可选择指 ...

  2. 盘点程序员写过的惊天 Bug

    欢迎关注方志朋的博客,回复"666"获面试宝典 博雯 发自 凹非寺 量子位 报道 | 公众号 QbitAI 一个Bug就地蒸发5亿美元: 软件设计层面出Bug致6人死亡: DeBu ...

  3. 盘点程序员写过的惊天Bug:亏损30亿、致6人死亡,甚至差点毁灭世界

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨量子位 编辑丨极市平台 导读 "你们的程序员生涯中写 ...

  4. 迄今为止程序员写过的最大Bug:亏损30亿、致6人死亡,甚至差点毁灭世界

    一个Bug就地蒸发5亿美元: 软件设计层面出Bug致6人死亡: DeBug不成功直接世界毁灭. 你职业生涯中写过最大的Bug是什么? 在这个问题上,勇敢的码农们,总是能不断地创造奇迹. 这不禁让路过的 ...

  5. 【Flink】Unauthorized request to start container. This token is expired. current time is

    1.概述 转载:https://blog.csdn.net/weixin_43970890/article/details/102483720 org.apache.hadoop.yarn.excep ...

  6. 嘿~你想写出五彩斑斓的BUG吗

    如果代码的颜色有助于提升效率,那么往下看,如果觉得晃眼睛就没必要往下看了(可能也没机会往下了> _ <) 网盘下载插件:all-color-themes.jar(提取码:gf2x) git ...

  7. 【错误记录】IntelliJ IDEA 中右键点击源码目录选择 New 选项 没有创建 Java Class 选项 ( 将对应的源码目录标记为 Sources 选项 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 右键点击源码目录 , 选择 New 选项创建源码 , 没有任何源码创建选项 ; 二.解决方案 右键点击源码根目录 , 在弹出的菜单中选择 " ...

  8. 通过yarn上的applicationId杀死hadoop中的任务,或通过hadoop job命令停止任务、yarn container 的日志路径

    示例: $ yarn application -kill application_Id hadoop命令行 与job相关的: 命令行工具 • 1.查看 Job 信息: hadoop job -list ...

  9. python 选择文件对话框插件_[ PyQt入门教程 ] PyQt5基本控件使用:消息弹出、用户输入、文件/目录选择对话框...

    本文主要介绍PyQt界面实现中常用的消息弹出对话框.提供用户输入的输入框.打开文件获取文件/目录路径的文件对话框.学习这三种控件前,先想一下它们使用的主要场景: 1.消息弹出对话框.程序遇到问题需要退 ...

最新文章

  1. 2012年11月14日学习研究报告
  2. 从PC中向Android模拟器中复制文件
  3. java中的静态初始化是什么意思,Java中static静态变量的初始化完全解析
  4. java程序设计复习题_java程序设计复习大全(100题及答案).doc
  5. show open tables命令 mysql查看哪些表加锁了
  6. 2014 网选 5024 Wang Xifeng's Little Plot
  7. Oracle的dbms_jobs 自动计划
  8. Python strip()与split()方法
  9. DSDT/SSDT综合教程
  10. 初学者福利:机器学习项目清单
  11. 应用ruby打造个性化的有道单词本 (二)
  12. wifi技术扫盲-MIMO
  13. TwinCAT软件的帮助如何使用
  14. 基于vue的前端UI表单设计器
  15. CSS中的filter与backdrop-filter属性的异同点
  16. 腾讯T-Star高校挑战赛
  17. 学java被“劝退”的第九天
  18. RAID 1 的优点缺点和应用场景
  19. 达梦数据库除法保留小数
  20. 暑期练习web25:web code(i春秋)index.php文件包含、base64图片加密

热门文章

  1. 透明轮播原生JavaScript实现
  2. element ui表单验证
  3. 页面加载完成之后,开始显示内容
  4. 利用ES6-Promise()方法封装原始jsonp实现跨域请求公用方法(告别使用JQuery封装好的jsonp)
  5. VScode 汉化以及侧栏npm脚本显示
  6. vs2012下 error4996
  7. react-redux简版实现
  8. JAVA ReentrantLock 分析
  9. 面试题:sql数据查询
  10. IOS研究之App转让流程须知具体介绍