从Resource Manager中获取一个新的Application ID

前提:有一个hadoop集群,并且拷贝core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml到classpath下,可以使src/main/resources

1.获取一个GetNewApplicationRequest,实例是protobuf的类GetNewApplicationRequestPBImpl,未来会支持其他序列化方式。序列化方式决定了RPC工厂,产生哪种可序列化类。

Records.newRecord,就是实例化一个protobuf类,注意如果自己写代码,对protobuf的后缀命名有一些规则,必须是"PBImpl"结尾,package命名必须以"impl.pb";结尾,否则找不到对应的protobuf class

GetNewApplicationRequest request = Records
                .newRecord(GetNewApplicationRequest.class);Configuration conf = new Configuration();

2.获取resouceManager所在的ip和端口

InetSocketAddress rmAddress = conf.getSocketAddr(
                YarnConfiguration.RM_ADDRESS,
                YarnConfiguration.DEFAULT_RM_ADDRESS,
                YarnConfiguration.DEFAULT_RM_PORT);

3.新建一个YarnRPC实例,默认用的是该类:org.apache.hadoop.yarn.ipc.HadoopYarnProtoRPC,并且获取

ApplicationClientProtocol实例,默认类是ApplicationClientProtocolPBClientImpl

紧接着调用获取一个新的appID

// get Yarn RPC
        YarnRPC rpc = YarnRPC.create(conf);
        // get a proxy from yarn rpc, yarn rpc is a factory, can produce some protocol
        rmClientProtocol = (ApplicationClientProtocol) (rpc.getProxy(
                ApplicationClientProtocol.class, rmAddress, conf));
        // get response from yarn rpc proxy with sending the GetNewApplicationRequest
        // which contains a protobuf object.
        GetNewApplicationResponse newApp = rmClientProtocol
                .getNewApplication(request);

        System.err.println("get a new application id:"
                + newApp.getApplicationId());

具体proxy里面做了如何初始化哪些类,还需要进一步研究。

总结就是目前hadoop支持Protobuf作为默认序列化框架,目前YARN 的RPC都采用的是protobuf的工厂。

下面是完整代码

package com.jarvis.yarnapp;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.yarn.api.ApplicationClientProtocol;
import org.apache.hadoop.yarn.api.protocolrecords.GetNewApplicationRequest;
import org.apache.hadoop.yarn.api.protocolrecords.GetNewApplicationResponse;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.exceptions.YarnException;
import org.apache.hadoop.yarn.ipc.YarnRPC;
import org.apache.hadoop.yarn.util.Records;

public class ZJXClient {
    private ApplicationClientProtocol rmClientProtocol;

    public void run() throws YarnException, IOException {

        // get a request for communicate with yarn
        GetNewApplicationRequest request = Records
                .newRecord(GetNewApplicationRequest.class);
        Configuration conf = new Configuration();
        // get resouce manager address
        InetSocketAddress rmAddress = conf.getSocketAddr(
                YarnConfiguration.RM_ADDRESS,
                YarnConfiguration.DEFAULT_RM_ADDRESS,
                YarnConfiguration.DEFAULT_RM_PORT);

        // get Yarn RPC
        YarnRPC rpc = YarnRPC.create(conf);
        // get a proxy from yarn rpc, yarn rpc is a factory, can produce some protocol
        rmClientProtocol = (ApplicationClientProtocol) (rpc.getProxy(
                ApplicationClientProtocol.class, rmAddress, conf));
        // get response from yarn rpc proxy with sending the GetNewApplicationRequest
        // which contains a protobuf object.
        GetNewApplicationResponse newApp = rmClientProtocol
                .getNewApplication(request);

        System.err.println("get a new application id:"
                + newApp.getApplicationId());
    }

    public static void main(String[] args) throws YarnException, IOException {
        ZJXClient zjxClient = new ZJXClient();
        zjxClient.run();
    }
}
时间: 2024-10-24 21:05:22

从Resource Manager中获取一个新的Application ID的相关文章

在PE文件中插入一个新节

这篇文章写如何在exe文件中插入一个新节,并且让它还能继续运行.这个节里保存的是导入表信息,指向一个自己写的动态库.在PE头中修改导入表地址位自己新构建的导入表. 能够实现这些需要对PE文件结构有着熟悉的掌握,可参考<Windows PE权威指南>.当初我看这本书的时候觉得很枯燥,结构信息不太好记.但是经过这个项目和一个自己实现LoadLibrary函数的项目后对PE文件结构就有了较熟悉的掌握. 首先,通过内存映射将目标EXE文件映射到内存中,保存原始结构,然后将原来的PE头部写入新文件. 之

Fragment中启动一个新的Activity

最近遇到一个小问题,就是我在主界面中用的是Fragment,其中四个Fragment,然后打算在其中一个里边,写一个TextView(准确地说是Linearout)的单击事件,然后跳转到另外一个Activity,但是问题来了,不知道在哪个函数中去写. 平时我们的Activity都是重载onCreate()函数,但是在Fragment中重载的是onCreateView()函数,后来查了很多资料,大多都是两行代码或者几行代码,也弄不清具体怎么写,知道看到了一个博主的博客,Ta贴出来的整个代码(这里还

向Dialog中添加一个新的Menu

1.创建一个新的Menu,在资源管理视图中,右键Menu-->传入Menu 2.设计新Menu,ID为IDR_MENU1 3.在该Dialog的源文件中,找到CTest001Dlg::OnInitDialog()方法,添加如下代码: CDialogEx::OnInitDialog(); CMenu menu; menu.LoadMenu(IDR_MENU1); SetMenu(&menu); 4.添加工具栏完成

shell 中获取一个uuid

写shell脚本时,有时想要制造一个唯一的ID(例如临时文件)可以用以下命令获取一个UUID cat /proc/sys/kernel/random/uuid 当然通常用一个随机的数字或者随机字符串基本也可以满足一个唯一性较好的临时名字了.不过用uuid可能更加保险一点.

Python:如何获取一个用户名的组ID

getpwname只能得到gid一个username. import pwd myGroupId = pwd.getpwnam(username).pw_gid getgroups只能获取groups脚本用户. import os myGroupIds = os.getgroups() 我怎么能得到所有groups的任意一个username,比如id -Gn命令? id -Gn `whoami` 解决方案 #!/usr/bin/env python import grp, pwd user =

在centos7中添加一个新用户并授权

参考地址:http://www.cnblogs.com/woshimrf/p/5906084.html 创建新用户 创建一个用户名为:zhangbiao [[email protected] ~]# adduser zhangbiao 为这个用户初始化密码,linux会判断密码复杂度,不过可以强行忽略: [[email protected] ~]# passwd zhangbiao 更改用户 zhangbiao 的密码 . 新的 密码: 无效的密码: 密码未通过字典检查 - 过于简单化/系统化

LoadRunner中获取一个场景运行时的唯一值

/* * 本代码产生一个从1970年1月1日0时开始累计以毫秒为单位的数值, * 在需要唯一值的地方使用时前缀上VuserID以保证场景运行期内该值为唯一 * (局限:不适用于脚本单次执行时间小于1毫秒的情况,当然该情况非常罕见,所以请放心使用) */ int a; int b; typedef long time_t; struct _timeb { time_t time; unsigned short millitm; short timezone; short dstflag; }; s

在链表中获取一个数据、查找操作C语言实现

SN *Get_S_Node ( SN *head ) { /* head 为要查询的链表的头指针 */ SN *Get_S_Node = NULL; INT32 OSM = 1,i32i = 0, data_num = 0; /* OSM是标志符,i32i是一个循环体内的变量,data为要获取的元素的序号 */ Get_S_Node = ( SN * )malloc( sizeof (SN) ); Get_S_Node = head; /* 输入要获取的数据 */ OSM = OSM_Prin

【centos】centos中添加一个新用户,并授权

前言 有时候给root用户不太方便,新建一个用于并赋予权限这个做法相对好些 创建新用户 创建一个用户名为:cmj [[email protected] ~]# adduser cmj 为这个用户初始化密码,linux会判断密码复杂度,不过可以强行忽略: [[email protected] ~]# passwd cmj 更改用户 cmj 的密码 新的 密码: 无效的密码: 密码未通过字典检查 - 过于简单化/系统化 重新输入新的 密码: passwd:所有的身份验证令牌已经成功更新. 授权 个人