YARN学习总结-第十九节-YARN-Service

YARN-Service

YARN-Service提供一流的支持和API用户托管长期运行的服务。简而言之,它充当容器编排平台管理容器化服务。同时支持Docker容器和传统在YARN之上基于进程的容器。

这个框架的功能包括执行配置解决方案和挂载,生命周期管理,例如停止、启动、删除服务,伸缩服务组件,滚动更新,监控服务健康。

YARN-Service框架主要包括如下组件:

1.一个核心框架(AM)扮演容器编排,负责所有的服务的生命周期管理。

2.RESTful服务器用于用户交互 ,部署、管理服务。

3.DNS服务依赖YARN Service Registry允许发现服务。

为什么使用YARN Service 框架?

YARN Service框架使得将已有服务迁移到YARN上变的容易。它隐藏了所有复杂的底层细节,包括应用管理,用户不需要去写信的代码。新服务的开发者不需要担心YARN内部机制,只需要专注服务的容器化。

长远来看,这个功能的另一个巨大的胜利是你既可以运行传统批处理程序,也可以运行长期服务,在一个单个平台上。组合这些功能的好处有下面两方面:

1.就像操作单个集群那样操作集群。

2.使得批处理和永久服务可以很好的共享集群资源,提升利用率。

如何使用YARN Service framework部署服务

配置、启动HDFS和YARN组件

像正常一样启动HDFS和YARN组件。启动YARN Service framework,把下列配置添加到yarn-site.xml并且重启RM或者在启动RM之前设置属性。

  
    
      Enable services rest api on ResourceManager.
    
    yarn.webapp.api-service.enable
    true
  

Example service

{
  "name": "sleeper-service",
  "components" : 
    [
      {
        "name": "sleeper",
        "number_of_containers": 1,
        "launch_command": "sleep 900000",
        "resource": {
          "cpus": 1, 
          "memory": "256"
       }
      }
    ]
}

明确运行预构建案例

yarn app -launch  
yarn app -launch my-sleeper sleeper

通过CLI管理services

部署service

yarn app -launch ${SERVICE_NAME} ${PATH_TO_SERVICE_DEF_FILE}

对于当前用户,SERVICE_NAME必须唯一,PATH_TO_SERVICE_DEF_FILE是一个JSON格式的定义文件。

例如:

yarn app -launch sleeper-service /path/to/local/sleeper.json

伸缩服务

yarn app -flex ${SERVICE_NAME} -component ${COMPONENT_NAME} ${NUMBER_OF_CONTAINERS}

yarn app -flex sleeper-service -component sleeper 2

同时支持相对改变,例如+2 or -2

停止服务

停止服务会停止服务的所有容器和AM,但是不会删除服务的状态,例如,在hdfs上的服务根目录。

yarn app -stop ${SERVICE_NAME}

启动服务

yarn app -start ${SERVICE_NAME}

销毁服务

yarn app -destroy ${SERVICE_NAME}

通过API管理服务

如果yarn.webapp.api-service.enable=true,则可以通过API来管理YARN Service

部署一个服务

POST http://localhost:8088/app/v1/services

获取一个服务

GET http://localhost:8088/app/v1/services/${SERVICE_NAME}

伸缩一个服务

PUT http://localhost:8088/app/v1/services/${SERVICE_NAME}/components/${COMPONENT_NAME}

{
    "name": "${COMPONENT_NAME}",
    "number_of_containers": ${COUNT}
}
{
    "name": "sleeper",
    "number_of_containers": 2
}

停止一个服务

PUT http://localhost:8088/app/v1/services/${SERVICE_NAME}

{
  "name": "${SERVICE_NAME}",
  "state": "STOPPED"
}

重启一个服务

PUT http://localhost:8088/app/v1/services/${SERVICE_NAME}

{
  "name": "${SERVICE_NAME}",
  "state": "STARTED"
}

销毁一个服务

DELETE http://localhost:8088/app/v1/services/${SERVICE_NAME}

一个新的service tab会被添加到YARN UI2,服务框架会把数据送到timeline server,然后ui 从timeline server读取

开启timeline server

开启yarn ui ,修改yarn-site.xml,


    To enable RM web ui2 application.
    yarn.webapp.ui2.enable
    true
  

YARN Service 框架支持kerberized环境,需要指定principal和keytab

{
  "name": "sample-service",
  ...
  ...
  "kerberos_principal" : {
    "principal_name" : "hdfs-demo/[email protected]",
    "keytab" : "file:///etc/security/keytabs/hdfs.headless.keytab"
  }
}

上述例子,也可以通过Docker实现,只需要改变Artifact类型为DOCKER,id为镜像id即可。

Artifact of a service component,如果不指定,则运行一个裸的命令。

Artifact id : 包的uri,docker的镜像名,服务名

type:docker,tarball。

Component:

服务的一个或者多个组件。

创建一个单组件服务,使用绝大多数属性

POST URL - http://localhost:8088/app/v1/service

{
  "name": "hello-world",
  "version": "1.0.0",
  "description": "hello world example",
  "components" :
    [
      {
        "name": "hello",
        "number_of_containers": 2,
        "artifact": {
          "id": "nginx:latest",
          "type": "DOCKER"
        },
        "launch_command": "./start_nginx.sh",
        "resource": {
          "cpus": 1,
          "memory": "256"
        }
      }
    ]
}

获取信息

GET URL - http://localhost:8088/app/v1/services/hello-worl

{
    "name": "hello-world",
    "version": "1.0.0",
    "description": "hello world example",
    "id": "application_1503963985568_0002",
    "lifetime": -1,
    "state": "STABLE",
    "components": [
        {
            "name": "hello",
            "state": "STABLE",
            "resource": {
                "cpus": 1,
                "memory": "256"
            },
            "configuration": {
                "properties": {},
                "env": {},
                "files": []
            },
            "quicklinks": [],
            "containers": [
                {
                    "id": "container_e03_1503963985568_0002_01_000002",
                    "ip": "10.22.8.143",
                    "hostname": "ctr-e03-1503963985568-0002-01-000002.example.site",
                    "state": "READY",
                    "launch_time": 1504051512412,
                    "bare_host": "host100.cloud.com",
                    "component_instance_name": "hello-0"
                },
                {
                    "id": "container_e03_1503963985568_0002_01_000003",
                    "ip": "10.22.8.144",
                    "hostname": "ctr-e03-1503963985568-0002-01-000003.example.site",
                    "state": "READY",
                    "launch_time": 1504051536450,
                    "bare_host": "host100.cloud.com",
                    "component_instance_name": "hello-1"
                }
            ],
            "launch_command": "./start_nginx.sh",
            "number_of_containers": 1,
            "run_privileged_container": false
        }
    ],
    "configuration": {
        "properties": {},
        "env": {},
        "files": []
    },
    "quicklinks": {}
}

修改生命周期时间

PUT URL - http://localhost:8088/app/v1/services/hello-world

{
  "lifetime": 3600
}

创建一个复杂的HBase服务

POST URL - http://localhost:8088:/app/v1/services/hbase-app-1

{
  "name": "hbase-app-1",
  "version": "1.0.0",
  "description": "hbase service",
  "lifetime": "3600",
  "components": [
    {
      "name": "hbasemaster",
      "number_of_containers": 1,
      "artifact": {
        "id": "hbase:latest",
        "type": "DOCKER"
      },
      "launch_command": "/usr/hdp/current/hbase-master/bin/hbase master start",
      "resource": {
        "cpus": 1,
        "memory": "2048"
      },
      "configuration": {
        "env": {
          "HBASE_LOG_DIR": ""
        },
        "files": [
          {
            "type": "XML",
            "dest_file": "/etc/hadoop/conf/core-site.xml",
            "properties": {
              "fs.defaultFS": "${CLUSTER_FS_URI}"
            }
          },
          {
            "type": "XML",
            "dest_file": "/etc/hbase/conf/hbase-site.xml",
            "properties": {
              "hbase.cluster.distributed": "true",
              "hbase.zookeeper.quorum": "${CLUSTER_ZK_QUORUM}",
              "hbase.rootdir": "${SERVICE_HDFS_DIR}/hbase",
              "zookeeper.znode.parent": "${SERVICE_ZK_PATH}",
              "hbase.master.hostname": "hbasemaster.${SERVICE_NAME}.${USER}.${DOMAIN}",
              "hbase.master.info.port": "16010"
            }
          }
        ]
      }
    },
    {
      "name": "regionserver",
      "number_of_containers": 3,
      "artifact": {
        "id": "hbase:latest",
        "type": "DOCKER"
      },
      "launch_command": "/usr/hdp/current/hbase-regionserver/bin/hbase regionserver start",
      "resource": {
        "cpus": 1,
        "memory": "2048"
      },
      "configuration": {
        "env": {
          "HBASE_LOG_DIR": ""
        },
        "files": [
          {
            "type": "XML",
            "dest_file": "/etc/hadoop/conf/core-site.xml",
            "properties": {
              "fs.defaultFS": "${CLUSTER_FS_URI}"
            }
          },
          {
            "type": "XML",
            "dest_file": "/etc/hbase/conf/hbase-site.xml",
            "properties": {
              "hbase.cluster.distributed": "true",
              "hbase.zookeeper.quorum": "${CLUSTER_ZK_QUORUM}",
              "hbase.rootdir": "${SERVICE_HDFS_DIR}/hbase",
              "zookeeper.znode.parent": "${SERVICE_ZK_PATH}",
              "hbase.master.hostname": "hbasemaster.${SERVICE_NAME}.${USER}.${DOMAIN}",
              "hbase.master.info.port": "16010",
              "hbase.regionserver.hostname": "${COMPONENT_INSTANCE_NAME}.${SERVICE_NAME}.${USER}.${DOMAIN}"
            }
          }
        ]
      }
    }
  ],
  "quicklinks": {
    "HBase Master Status UI": "http://hbasemaster0.${SERVICE_NAME}.${USER}.${DOMAIN}:16010/master-status",
    "Proxied HBase Master Status UI": "http://app-proxy/${DOMAIN}/${USER}/${SERVICE_NAME}/hbasemaster/16010/"
  }
}

Service Discovery

有了DNS支持,用户可以通过定义友好的名称去访问服务

${COMPONENT_INSTANCE_NAME}.${SERVICE_NAME}.${USER}.${DOMAIN}

配置Registry DNS

  
    The domain name for Hadoop cluster associated records.
    hadoop.registry.dns.domain-name
    ycluster
  

  
    The port number for the DNS listener. The default port is 5335.
    If the standard privileged port 53 is used, make sure start the DNS with jsvc support.
    hadoop.registry.dns.bind-port
    5335
  

  
    The DNS functionality is enabled for the cluster. Default is false.
    hadoop.registry.dns.enabled
    true
  

  
    Address associated with the network interface to which the DNS listener should bind.
    hadoop.registry.dns.bind-address
    localhost
  

  
     A comma separated list of hostname:port pairs defining the zookeeper quorum for the YARN registry
    hadoop.registry.zk.quorum
    localhost:2181
  

配置解析网段

 
    The network mask associated with the zone IP range. If specified, it is utilized to ascertain the
    IP range possible and come up with an appropriate reverse zone name.
    hadoop.registry.dns.zone-mask
    255.255.255.0
  

  
    An indicator of the IP range associated with the cluster containers. The setting is utilized for the
     generation of the reverse zone name.
    hadoop.registry.dns.zone-subnet
    172.17.0.0
  

启动Registry DNS Server

yarn --daemon start registrydns

DNS Service提供以下功能:

1.通过DNS暴露存在的服务发现信息

2.容器到IP映射

配置属性

hadoop.registry.zk.quorum:

hadoop.registry.dns.enabled

hadoop.registry.dns.domain-name

hadoop.registry.dns.bind-address

hadoop.registry.dns.bind-port

hadoop.registry.dns.dnssec.enabled

hadoop.registry.dns.private-key-file

hadoop.registry.dns-ttl

hadoop.registry.dns.zone-subnet

hadoop.registry.dns.zone-mask

hadoop.registry.dns.zones-dir

 
    The domain name for Hadoop cluster associated records.
    hadoop.registry.dns.domain-name
    ycluster
  

  
    The port number for the DNS listener. The default port is 5335.
    If the standard privileged port 53 is used, make sure start the DNS with jsvc support.
    hadoop.registry.dns.bind-port
    5335
  

  
    The DNS functionality is enabled for the cluster. Default is false.
    hadoop.registry.dns.enabled
    true
  

  
    Address associated with the network interface to which the DNS listener should bind.
    hadoop.registry.dns.bind-address
    localhost
  

  
    A comma separated list of hostname:port pairs defining the zookeeper quorum for the YARN registry
    hadoop.registry.zk.quorum
    localhost:2181
  

 

你可能感兴趣的:(大数据)