YARN任务运行中的Token

上一篇文章中,主要讲解了token的一些通用知识,以及hadoop中,token的实现和通用数据结构及流程。

本文主要讲述yarn任务提交运行过程中涉及的几个重要token:AMRMToken,NMToken,ContainerToken。

【AMRMToken】


用于保证ApplicationMaster(下面均简称AM)与RM之间的安全通信,即AM向RM注册,以及后续向RM申请资源的rpc请求,都会带上该token。

AMRMToken在客户端向RM提交任务后,由RM创建生成,然后通过rpc请求传递给NM;NM通过将token持久化到本地文件,让AM启动后从对应文件中加载到token,这样AM就可以使用正确的token向RM注册并完成rpc请求交互了。接下来就展开说明下。

1)token的生成

客户端提交任务请求后,RM在内部的处理中,为AM构造对应的container启动上下文时,创建了AMRMToken,相关代码如下所示:

// AMLauncher.java
private void launch() throws IOException, YarnException {
    ...
    // 构造 container 启动上下文
    ContainerLaunchContext launchContext = 
        createAMContainerLaunchContext(applicationContext, masterContainerID);
    ...
}

private ContainerLaunchContext createAMContainerLaunchContext(
    ApplicationSubmissionContext applicationMasterContext,
    ContainerId containerID) throws IOException {
    ...
    setupTokens(container, containerID);
    ...
}

protected void setupTokens(ContainerLaunchContext container, ContainerId, containerID) 
    throws IOException {
    ...
    // 构造 AMRMToken
    Token<AMRMTokenIdentifier> amrmToken = createAndSetAMRMToken();
    if (amrmToken != null) {
        credentials.addToken(amrmToken.getService(), amrmToken);
    }
    ...
}

protected Token<AMRMTokenIdentifier> createAndSetAMRMToken() {
    Token<AMRMTokenIdentifier> amrmToken =
        this.rmContext.getAMRMTokenSecretManager()
            .createAndGetAMRMToken(application.getAppAttemptId());
    ((RMAppAttemptImpl)application).setAMRMToken(amrmToken);
    return amrmToken;
}

2)AMRMToken的传递

a. RM --> NM

在构造完container启动上下文后,将启动上下文随container启动请求(StartContainerRequest)发送给NM。

b. NM --> AM

NM收到请求后,内部构造Container实例对象,并从请求中取出credential保存在实例对象中,在真正需要启动AM时,将token信息写到本地文件中。

// ContainerLauncher.java
public Integer call() {
    // token存储在 nmPrivate 中的路径
    Path nmPrivateTokensPath = 
        dirsHandler.getLocalPathForWrite(
            getContainerPrivateDir(appIdStr, containerIdStr) + Path.SEPARATOR +
            String.format(TOKEN_FILE_NAME_FMT, containerIdStr));
    // Set th token location too.
    // 为AM设置环境变量
    addToEnvMap(
        environment, nmEnvVars,
        ApplicationConstants.CONTAINER_TOKEN_FILE_ENV_NAME,
        new Path(
            containerWorkDir,
            FINAL_CONTAINER_TOKENS_FILE).toUri().getPath());
    // 将token写入文件中
    try (DataOutputStream tokensOutStream = 
        lfs.create(nmPrivateTokensPath, EnumSet.of(CREATE, OVERWRITE))) {
        Credentials creds = container.getCredentials();
        creds.writeTokenStorageToStream(tokensOutStream);
    }
    ...
}

//DefaultContainerExecutor.java
public int launchContainer(ContainerStartContext ct
### Flink Standalone Deployment Without YARN Flink 可以通过独立(Standalone)模式部署,而无需依赖于 YARN 或其他资源管理器。这种模式适用于小型集群或测试环境,在此模式下,Flink 的 JobManager 和 TaskManager 是作为独立进程运行的。 #### 配置文件调整 为了实现 Standalone 模式的部署,需要编辑 `conf/flink-conf.yaml` 文件并设置必要的参数[^2]。以下是几个重要的配置项: - **jobmanager.rpc.address**: 设置 JobManager 的主机名或 IP 地址。 - **jobmanager.memory.process.size**: 定义 JobManager 进程所需的内存大小。 - **taskmanager.numberOfTaskSlots**: 指定每个 TaskManager 提供的任务槽位数量。 - **parallelism.default**: 默认的作业并行度。 这些参数可以通过手动修改配置文件完成,也可以在启动脚本中动态传递。 #### 启动 Flink Cluster 要启动一个 Standalone 模式的 Flink 集群,可以按照以下方式操作: 1. 使用内置的启动脚本来初始化集群: ```bash ./bin/start-cluster.sh ``` 此命令会在本地机器上启动一个 JobManager 和若干 TaskManager 实例。如果是在分布式环境中,则需要确保所有节点能够相互通信,并且已经正确设置了 `hosts` 文件中的映射关系[^3]。 2. 如果希望自定义资源配置或者增加更多 TaskManager 节点,可单独启动它们: ```bash ./bin/taskmanager.sh start ``` #### 提交任务到 Standalone 集群 当集群成功启动后,可通过以下命令提交应用程序至该集群: ```bash ./bin/flink run -d -m <JobManager-Address>:<Port> /path/to/your/application.jar ``` 其中 `-d` 参数表示后台运行任务,`-m` 则指定了目标 JobManager 的地址和端口。 #### 停止集群服务 一旦不再需要使用当前集群实例,可以通过如下指令安全关闭它: ```bash ./bin/stop-cluster.sh ``` 这将终止所有的 JobManager 和 TaskManager 进程。 --- ### 示例代码展示 下面是一个简单的 WordCount 程序用于演示如何编写并提交给 Standalone 集群执行: ```java import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.DataSet; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.util.Collector; public class WordCount { public static void main(String[] args) throws Exception { final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); DataSet<String> text = env.fromElements( "Apache Flink is great", "We love processing data" ); text.flatMap(new Tokenizer()) .groupBy(0) .sum(1) .print(); } public static final class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> { @Override public void flatMap(String value, Collector<Tuple2<String, Integer>> out) { String[] tokens = value.toLowerCase().split("\\W+"); for (String token : tokens) { if (token.length() > 0) { out.collect(new Tuple2<>(token, 1)); } } } } } ``` 上述程序可以直接打包成 JAR 文件并通过前面提到的方式提交到 Standalone 集群中去运行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值