zoukankan      html  css  js  c++  java
  • YARN on Docker

    搭建Hadoop Yarn on Docker

    一、概览

    Docker基于Linux Container技术整合了一堆易用的接口用于构建非常轻量级的虚拟机。Docker Container Executor(DCE)使得Yarn NodeManager服务可以将其container进程运行在Docker容器中。用户可以自定义运行Yarn container的Docker镜像。这些container提供了自定义的、与外部NodeManger隔离的运行环境,还可以指定安装与NodeManager不同版本的软件包,如Perl、Python、Java等,甚至可以运行与NodeManager不同的Linux发行版本。为了实现这些,Yarn container必须指定运行作业所需要的环境和依赖库,NodeManager之间不会共享这些信息。


    二、集群配置

    Docker Container Executor只能在非kerberos(安全)模式的Yarn和HDFS中运行,一旦DCE检测到运行在安全模式下,服务会立刻退出。

    DCE需要NodeManager节点上运行着docker服务和docker client用于启动docker container。为了避免超时,作业依赖的docker镜像必须在NodeManager启动前预先下载好,运行以下命令下载hadoop docker镜像:

    [java] view plain copy
    1. sudo docker pull sequenceiq/hadoop-docker:2.4.1  
    同时在yarn-site.xml中增加配置:

    [html] view plain copy
    1. <property>  
    2.  <name>yarn.nodemanager.docker-container-executor.exec-name</name>  
    3.   <value>/usr/bin/docker</value>  
    4.   <description>  
    5.      Name or path to the Docker client. This is a required parameter. If this is empty,  
    6.      user must pass an image name as part of the job invocation(see below).  
    7.   </description>  
    8. </property>  
    9.   
    10. <property>  
    11.   <name>yarn.nodemanager.container-executor.class</name>  
    12.   <value>org.apache.hadoop.yarn.server.nodemanager.DockerContainerExecutor</value>  
    13.   <description>  
    14.      This is the container executor setting that ensures that all  
    15. jobs are started with the DockerContainerExecutor.  
    16.   </description>  
    17. </property>  
    需要集群管理员注意目前DCE不提供用户命名空间隔离,这意味着在Yarn container中以root用户运行的程序会获得NodeManager的root权限,换句话说,DCE目前没有提供比Yarn默认的Container Executor更好的安全保证。


    三、连接安全docker repository技巧

    默认情况下,docker从docker官方公共repository下载镜像。docker镜像的url格式为username/image_name,比如说sequenceiq/hadoop-docker:2.4.1是公共镜像仓库中的一个镜像,其中包括java和hadoop软件。

    如果用户希望使用私人仓库,需要提供repository url替换username部分,因此镜像url变成private_repo_url/image_name,比如说私人仓库地址是localhost:8080,那镜像URL就是 localhost:8080/hadoop-docker。


    登录公共docker repository,执行:

    [html] view plain copy
    1. docker login [OPTIONS] [SERVER]  
    2.   
    3.    Register or log in to a Docker registry server, if no server is specified  
    4.    "https://index.docker.io/v1/" is the default.  
    5.   
    6.  -e, --email=""       Email  
    7.  -p, --password=""    Password  
    8.  -u, --username=""    Username  

    登录私人repository

    [html] view plain copy
    1. docker login <private_repo_url>  

    以上这些需要作为NodeManager启动的一部分,建议作为一个crontab任务来避免登录session超时。用户可以在同一台NodeManager上同时登录多个docker repository,但是这会导致集群中所有用户都可以访问所有的repository,目前DCE不支持为每个job指定docker login


    四、作业配置

    目前用户无法在job配置中指定docker配置,用户可以提供Mapper、Reducer和ApplicationMaster环境去覆盖docker镜像中的环境,分别使用以下三个JVM参数:

    • mapreduce.map.env: You can override the mapper’s image by passing yarn.nodemanager.docker-container-executor.image-name=your_image_name to this JVM property.

    • mapreduce.reduce.env: You can override the reducer’s image by passing yarn.nodemanager.docker-container-executor.image-name=your_image_name to this JVM property.

    • yarn.app.mapreduce.am.env: You can override the ApplicationMaster’s image by passing yarn.nodemanager.docker-container-executor.image-name=your_image_name to this JVM property.


    五、docker镜像要求

    Yarn container使用的docker镜像有以下要求:

    Docker镜像系统的发行版和版本可以和Nodemanager不同,然而,如果你在使用MapReduce计算框架,那么你的镜像需要配置可以运行hadoop,必须安装java以及定义以下环境变量JAVA_HOME, HADOOP_COMMON_PATH, HADOOP_HDFS_HOME, HADOOP_MAPRED_HOME, HADOOP_YARN_HOME, and HADOOP_CONF_DIR。


    六、示例实战

    示例说明如何使用DockerContainerExecutor运行作业

    Step1:确保yarn-site.xml已经配置完成

    Step2:选择一个docker镜像,在这个例子中,我们使用公共仓库中的sequenceiq/hadoop-docker:2.4.1镜像,其中预装了JDK、Hadoop以及上述的环境变量。

    Step3:运行

    [java] view plain copy
    1. hadoop jar $HADOOP_PREFIX/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.0.jar   
    2.   teragen   
    3.      -Dmapreduce.map.env="yarn.nodemanager.docker-container-executor.image-name=sequenceiq/hadoop-docker:2.4.1"   
    4.    -Dyarn.app.mapreduce.am.env="yarn.nodemanager.docker-container-executor.image-name=sequenceiq/hadoop-docker:2.4.1"   
    5.   1000   
    6.   teragen_out_dir  

    执行成功后,可以在yarn的日志中验证docker启动的containers

    Docker Container Executor (DCE) 是 Hadoop 2.6.0 包含的一个重要特性:至此,大数据的巨人 Hadoop 也终于可以利用当前虚拟化/云计算领域的宠儿 Docker 的强大能力了。


    对于 Docker 概念介绍的文章已经非常多了,因此本文就不再赘述,仅仅直接引用 Hadoop 社区里对其的描述:“Docker (https://www.docker.io/) combines an easy-to-use interface to Linux containers with easy-to-construct image files for those containers. In short, Docker launches very light weight virtual machines.” 而 Hadoop 使用 Docker 能力主要是借助其的新组件 Docker Container Executor (DCE)。利用 DCE,YARN NodeManager 可以将 YARN 容器执行于 Docker 容器中。


    根据 Hadoop 社区的文章http://hadoop.apache.org/docs/r2.6.0/hadoop-yarn/hadoop-yarn-site/DockerContainerExecutor.html, 我们可以试用该功能。在试用前,需要事先安装好docker组件,并下载 docker image sequenceiq/hadoop-docker:2.4.1。


    另外,也要更改 yarn-site.xml 配置:

    <property>
     <name>yarn.nodemanager.docker-container-executor.exec-name</name>
      <value>/usr/bin/docker</value>
      <description>
         Name or path to the Docker client. This is a required parameter. If this is empty,
         user must pass an image name as part of the job invocation(see below).
      </description>
    </property>
    
    <property>
      <name>yarn.nodemanager.container-executor.class</name>
      <value>org.apache.hadoop.yarn.server.nodemanager.DockerContainerExecutor</value>
      <description>
         This is the container executor setting that ensures that all
    jobs are started with the DockerContainerExecutor.
      </description>
    </property>
    

    最后,可以通过命令提交 Hadoop MapReduce job teragen 到 resourcemanger:“hadoop jarshare/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar teragen-Dmapreduce.map.env="yarn.nodemanager.docker-container-executor.image-name=sequenceiq/hadoop-docker:2.4.1"-Dyarn.app.mapreduce.am.env="yarn.nodemanager.docker-container-executor.image-name=sequenceiq/hadoop-docker:2.4.1"10000 /tmp/teragen”。

    MapReduce Job 执行:

    技术分享

    在 MR job 运行期间,我们能观察到有3个 docker container 也在被执行—— MR job 正式运行于它们之中:

    技术分享

    当然,成功执行完后也能从 ResourceManger web console上面看到执行结果:

    技术分享




    正因为当初对未来做了太多的憧憬,所以对现在的自己尤其失望。生命中曾经有过的所有灿烂,终究都需要用寂寞来偿还。
  • 相关阅读:
    Python——pygame入门实例
    Python——基础函数2
    Python——面向对象的三特征
    201521123083《Java程序设计》第四周学习总结
    201521123083《Java程序设计》第二周学习总结
    201521123083 《Java程序设计》第6周学习总结
    《Java程序设计》第1周学习总结
    201521123083《Java程序设计》第5周学习总结
    《Java程序设计》第3周学习总结
    201521123083 《Java程序设计》第7周学习总结
  • 原文地址:https://www.cnblogs.com/candlia/p/11920281.html
Copyright © 2011-2022 走看看