lovegigi 发表于 2015-11-11 12:33:46

搭建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镜像:
  sudo docker pull 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>需要集群管理员注意目前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,执行:
   docker login
Register or log in to a Docker registry server, if no server is specified
&quot;https://index.docker.io/v1/&quot; is the default.
-e, --email=&quot;&quot;       Email
-p, --password=&quot;&quot;    Password
-u, --username=&quot;&quot;    Username

登录私人repository
  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:运行
  hadoop jar $HADOOP_PREFIX/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.0.jar \
teragen \
-Dmapreduce.map.env=&quot;yarn.nodemanager.docker-container-executor.image-name=sequenceiq/hadoop-docker:2.4.1&quot; \
-Dyarn.app.mapreduce.am.env=&quot;yarn.nodemanager.docker-container-executor.image-name=sequenceiq/hadoop-docker:2.4.1&quot; \
1000 \
teragen_out_dir

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


  





版权声明:本文为博主原创文章,未经博主允许不得转载。
页: [1]
查看完整版本: 搭建Hadoop Yarn on Docker