yarn container写token目录选择bug

简介:

在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,如需转载请自行联系原作者

相关文章
|
SQL 资源调度 安全
开启 Kerberos 安全的大数据环境中,Yarn Container 启动失败导致作业失败
开启 Kerberos 安全的大数据环境中,Yarn Container 启动失败导致作业失败
|
分布式计算 监控 Java
0019-Yarn的JobHistory目录权限问题导致MapReduce作业异常
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 1.问题描述 Hive的MapReduce作业无法正常运行,日志如下: 0: jdbc:hive2://localhost:10000_>_select count(*) from student; … command(queryId.
1356 0
|
资源调度 分布式计算 Hadoop
[YARN] 2.2 GB of 2.1 GB virtual memory used. Killing container.
Spark程序在yarn的集群运行,出现 Current usage: 105.9 MB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual memory used. Killing Container. 错误。
3700 0
|
3月前
|
资源调度 分布式计算 Hadoop
YARN(Hadoop操作系统)的架构
本文详细解释了YARN(Hadoop操作系统)的架构,包括其主要组件如ResourceManager、NodeManager和ApplicationMaster的作用以及它们如何协同工作来管理Hadoop集群中的资源和调度作业。
149 3
YARN(Hadoop操作系统)的架构
|
3月前
|
资源调度 分布式计算 Hadoop
使用YARN命令管理Hadoop作业
本文介绍了如何使用YARN命令来管理Hadoop作业,包括查看作业列表、检查作业状态、杀死作业、获取作业日志以及检查节点和队列状态等操作。
58 1
使用YARN命令管理Hadoop作业
|
4月前
|
资源调度 分布式计算 算法
【揭秘Yarn调度秘籍】打破资源分配的枷锁,Hadoop Yarn权重调度全攻略!
【8月更文挑战第24天】在大数据处理领域,Hadoop Yarn 是一种关键的作业调度与集群资源管理工具。它支持多种调度器以适应不同需求,默认采用FIFO调度器,但可通过引入基于权重的调度算法来提高资源利用率。该算法根据作业或用户的权重值决定资源分配比例,权重高的可获得更多计算资源,特别适合多用户共享环境。管理员需在Yarn配置文件中启用特定调度器(如CapacityScheduler),并通过设置队列权重来实现资源的动态调整。合理配置权重有助于避免资源浪费,确保集群高效运行,满足不同用户需求。
56 3
|
7月前
|
资源调度 分布式计算 Hadoop
Hadoop Yarn 核心调优参数
这是一个关于测试集群环境的配置说明,包括3台服务器(master, slave1, slave2)运行CentOS 7.5,每台有4核CPU和4GB内存。集群使用Hadoop 3.1.3,JDK1.8。Yarn核心配置涉及调度器选择、ResourceManager线程数、节点检测、逻辑处理器使用、核心转换乘数、NodeManager内存和CPU设置,以及容器的内存和CPU限制。配置完成后,需要重启Hadoop并检查yarn配置。
121 4
|
7月前
|
SQL 分布式计算 资源调度
Hadoop Yarn 配置多队列的容量调度器
配置Hadoop多队列容量调度器,编辑`capacity-scheduler.xml`,新增`hive`队列,`default`队列占总内存40%,最大60%;`hive`队列占60%,最大80%。配置包括队列容量、用户权限和应用生存时间等,配置后使用`yarn rmadmin -refreshQueues`刷新队列,无需重启集群。多队列配置可在Yarn WEB界面查看。
100 4
|
6月前
|
资源调度 分布式计算 Hadoop
实时计算 Flink版产品使用问题之yarn session模式中启动的任务链接是http IP,想把IP映射为主机hadoop,该怎么操作
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
7月前
|
分布式计算 资源调度 Hadoop
Hadoop【基础知识 03+04】【Hadoop集群资源管理器yarn】(图片来源于网络)(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
【4月更文挑战第5天】Hadoop【基础知识 03】【Hadoop集群资源管理器yarn】(图片来源于网络)Hadoop【基础知识 04】【HDFS常用shell命令】(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
155 9