使用 Dockerfile 建立基础镜像

新建 Dockerfilie

FROM ubuntu:14.04

MAINTAINER TripleZ <me@triplez.cn>

WORKDIR /root

# backup old sources.list
RUN cp /etc/apt/sources.list /etc/apt/sources.list.bac

# Change ubuntu repo to mirrors.163.com
RUN echo "deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse" > /etc/apt/sources.list && \
    echo "deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list


# install openssh-server, openjdk and wget
RUN apt-get update && apt-get install -y openssh-server openjdk-7-jdk wget

# install hadoop
RUN wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz && \
    tar -xzvf hadoop-2.7.4.tar.gz && \
    mv hadoop-2.7.4 /usr/local/hadoop && \
    rm hadoop-2.7.4.tar.gz

# set environment variable
ENV JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 
ENV HADOOP_HOME=/usr/local/hadoop 
ENV HADOOP_CONFIG_HOME=/usr/local/hadoop/etc/hadoop
ENV PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin 

# ssh without key
RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && \
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

RUN mkdir -p ~/hdfs/namenode && \ 
    mkdir -p ~/hdfs/datanode && \
    mkdir $HADOOP_HOME/logs

RUN echo "Host localhost \
StrictHostKeyChecking no \
Host 0.0.0.0 \
StrictHostKeyChecking no \
Host hadoop-* \
StrictHostKeyChecking no \
UserKnownHostsFile=/dev/null" > ~/.ssh/config

你也可以在 Github 上获取该 Dockerfile

在同目录下运行 别忘了后面有个点

$ docker build -t ubuntu:hadoop .

经过一段时间等待后,终于看到了镜像装载完成了:

如果你不在某个特殊的国度,可以不更换软件源。

建立桥接网络

由于 Hadoop 节点是要求可以互联的,因此在启动容器之前,还需要新建一个 docker 桥接网络给三个 Hadoop 节点使用。

$ sudo docker network create --driver=bridge hadoop

这样,我们就建立起了一个名字叫做 hadoop 的 docker 桥接网络。

之前配置时忘记截图了,故此新建个新的网络示意。

建立容器

然后我们应该建立容器了。由于 Hadoop 是分布式部署,我需要建立三个容器,分别是 hadoop-master, hadoop-slave1hadoop-slave2

Master 启动会比较复杂,因为我们还需要hadoop-master 进行端口映射,将 500708088 这两个端口映射到宿主机,这样我们才能够在宿主机上看到 Hadoop 的 Web 管理界面。

$ docker run -itd --net=hadoop -p 50070:50070 -p 8088:8088 --name hadoop-master --hostname hadoop-master ubuntu:hadoop

Slave 节点的启动就相对简单,没有 Master 那么多的额外配置:

$ docker run -itd --net=hadoop --name hadoop-slave1 --hostname hadoop-slave1 ubuntu:hadoop
$ docker run -itd --net=hadoop --name hadoop-slave2 --hostname hadoop-slave2 ubuntu:hadoop

这样我们就把三个 Hadoop 节点容器全部建立好了!

关闭容器:

$ docker stop hadoop-master hadoop-slave1 hadoop-slave2
  

启动容器:

$ docker start hadoop-master hadoop-slave1 hadoop-slave2
  

进入 Master 容器:

$ docker exec -it hadoop-master bash
  

进入 Slave 同理。

配置 Hadoop

现在我们进入 hadoop-master 容器,输入:

root@hadoop-master:~# cd $HADOOP_CONFIG_HOME

就会进入到 Hadoop 的配置目录中。这里有很多的配置文件,我们需要更改的是 core-site.xml , hdfs-site.xml , slaves ,mapred-site.xml, yarn-site.xml 这五个文件。如果配置出错,90%问题都是因为这五个文件.

core-site.xml

Hadoop 的核心配置文件,规定了临时存储文件目录以及文件系统管理信息。

<?xml version="1.0"?>
<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop-master:9000/</value>
    </property>
</configuration>

hdfs-site.xml

HDFS 配置文件,定义 DatanodeNamenode 目录地址以及该 HDFS 的数据备份数。

<?xml version="1.0"?>
<configuration>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/root/hdfs/namenode</value>
        <description>NameNode directory for namespace and transaction logs storaa
ge.</description>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/root/hdfs/datanode</value>
        <description>DataNode directory</description>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
</configuration>

mapred-site.xml

MapReduce 配置文件,HadoopMapReduce 任务交给 Yarn 管理。

<?xml version="1.0"?>
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

yarn-site.xml

Yarn 配置文件,负责管理整个 Hadoop 的层级以及确定 Master 节点主机。

<?xml version="1.0"?>
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop-master</value>
    </property>
</configuration>

slaves

Slave 管理文件,用于确定 slave 节点主机。

hadoop-slave1
hadoop-slave2

hadoop-master 配置好后,hadoop-slave1hadoop-slave2 这两个节点也必须使用相同的配置。

这五个文件在每个节点上一定要一样!务必仔细确认!

启动 Hadoop

配置完重要的五个文件之后,就可以开始测试我们的 Hadoop 分布式集群是否能够正常工作了。

先格式化 NameNode

root@hadoop-master:~# hdfs namenode -format

继续在 hadoop-master 中执行:

root@hadoop-master:~# $HADOOP_HOME/sbin/start-dfs.sh
root@hadoop-master:~# $HADOOP_HOME/sbin/start-yarn.sh

若无特别提示,则 Hadoop 应已正常启动。

在宿主机浏览器地址栏中输入 http://localhost:8088 和 http://localhost:50070 可以看到 YarnHDFS 的管理 Web 界面。

8088: Yarn Web

HDFS Webk

不建议使用 start-all.shstop-all.sh 来开启停止 Hadoop 集群,这两个脚本已不再进行维护。

"This script is Deprecated." -- Apache Hadoop.

常见错误

DFS 没有空间;找不到 DataNode

DFS has no space

可能是由启动多次 Hadoop 而配置出错导致的。请先重新确认配置文件,然后做以下操作:

  • 停止所有 Hadoop 服务;
    root@hadoop-master:~# $HADOOP_HOME/sbin/stop-yarn.sh
      root@hadoop-master:~# $HADOOP_HOME/sbin/stop-dfs.sh
      
  • 删除 hadoop-master 节点的 $HADOOP_HOME/tmp 文件夹;
    root@hadoop-master:~# rm -r $HADOOP_HOME/tmp
      
  • 删除所有节点存有 datanode 信息的文件夹;

    位置取决于 hdfs-site.xml 中配置的 dfs.datanode.data.dir 值。

  • 重新格式化 NameNode
    root@hadoop-master:~# hdfs namenode -format
      
    分享到:
分类: Cloud Computing

发表评论

电子邮件地址不会被公开。 必填项已用*标注

验证码 *