你好,游客 登录 注册 搜索
背景:
阅读新闻

使用 Docker 搭建本地 Hadoop 集群

[日期:2016-06-01] 来源:稀土掘金  作者: [字体: ]

终于开始学习 hadoop 了,虽然是学校开课了才开始跟着学校的课程学,至少也是开始了。

首先要做的就是搭建好一个 hadoop 的环境,需要三台主机,配置一个 master 两个 slave 的架构。

老师让我们用 vbox 来做,但是个人觉得虚拟机太慢了,而且还要开三个,太亏。刚好最近开始接触 docker ,准备就在 docker 的环境下搭建 hadoop 环境。

安装docker

可以考虑使用国内的加速镜像 daocloud.io 注册后可以看到如何使用

由于我已经通过官网的方法安装了,这里就只记录下我的操作:

curl -fsSL https://get.docker.com/ | sh

这个过程会很漫长,谁让我作死去官网下呢 (-_-)

脚本执行完后就能发现 docker 已经安装好了,而且还添加了一个用户组 docker,可以把自己常用的用户加入到这个组,方便使用。

可以使用 docker version 查看一下版本

$ docker version
Client:
 Version:      1.11.1
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   5604cbe
 Built:        Tue Apr 26 23:43:49 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.11.1
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   5604cbe
 Built:        Tue Apr 26 23:43:49 2016
 OS/Arch:      linux/amd64

拉取镜像

docker 和 git 的命令有些相像,可以使用 pull 命令拉取远程仓库,不过 git拉取的往往是代码,而 docker 拉取的是镜像

从 daocloud 拉取镜像

docker pull daocloud.io/library/centos:centos7

daocloud.io/library/centos 表示镜像的名字

centos7 表示镜像的版本,默认是 latest ,表示最新版

启动镜像

我们可以使用 docker images 命令查看本地镜像列表,选择启动哪一个镜像

$ docker images
REPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/library/centos                   centos7             96eecaf1019a        6 days ago          196.7 MB
daocloud.io/library/centos                   latest              96eecaf1019a        6 days ago          196.7 MB
44mfwmrx.mirror.aliyuncs.com/library/redis   latest              ad6e7427198c        2 weeks ago         184.9 MB
daocloud.io/library/ubuntu                   latest              c5f1cf30c96b        2 weeks ago         120.8 MB
hello-world                                  latest              94df4f0ce8a4        3 weeks ago         967 B
daocloud.io/library/ubuntu                   trusty-20160424     8fa7f61732d6        4 weeks ago         188 MB
daocloud.io/daocloud/daocloud-toolset        latest              1ab33797d8a1        4 weeks ago         150.2 MB

$ docker run -h master --dns=61.139.2.69 -it daocloud.io/library/centos:centos7

这个命令启动一个容器,参数解释如下

参数名参数值参数含义
-h master 指定 hostname
--dns 61.139.2.69 指定 DNS ,默认的是 8.8.8.8 ,国内环境...
-it   以交互模式启动

具体的含义可以使用 docker run --help 查看,这里就不赘述了。

安装需要的软件

安装 wget 等

$ sudo yum install -y wget vim openssh-server openssh-clients net-tools

拉取到本地的镜像是尽可能小的,所以很多命令都没有安装:

  • openssh-server : 安装 sshd 服务
  • openssh-clients : 安装 ssh 命令
  • net-tools : 安装 netstat , ifconfig 等命令

但是安装完后并不会启动 sshd 服务,容器是被 docker 管理的,无法使用一些系统命令,要启动 sshd 需要执行如下命令

/usr/sbin/sshd -D &

后台启动 sshd 服务,之后就可以使用 ssh 命令登录容器了。

因为 ssh 是 hadoop 必需的服务,所以我们要在容器启动是就开启,所以把这条命令写到一个脚本里

$ vim /root/run.sh
$ chmod 750 /root/run.sh
$ cat /root/run.sh
!/bin/bash
/usr/sbin/sshd -D

这里不让其后台运行是为了保证容器不退出,只要容器在后台运行,我们就可以在宿主机上连接容器。

网络配置

本来是要开始下载 jdk 的,但是发现不能上网,测试了一下发现是 dns 的问题。

不怕折腾的我怎么能够忍受每启动一个容器都要带上 --dns 参数呢,一定可以改的。

结果是折腾了半天(真的是半天啊),找到了下面的解决方案。

修改默认 dns

  • 修改 /etc/default/docker
...
DOCKER_NETWORK_OPTIONS="--dns=61.139.2.69"
...
  • 修改 /lib/systemd/system/docker.service
...
[Service]
EnviornmentFile=-/etc/default/docker
ExecStart=/usr/bin/docker daemon -H fd:// $OPTIONS \
          $DOCKER_NETWORK_OPTIONS
...

这里的设置是按照官网的说明来配置的,百度到的东西都不能使参数生效,不知道为什么

官网文档 : http://docs.master.dockerproject.org/engine/admin/systemd/

然后重启 docker

systemctl daemon-reload
systemctl restart docker.service
#使用这个命令可以查看 docker 的启动命令是否生效
$ ps -ef | grep docker
root     ***     1  0 525 ?       00:02:23 /usr/bin/docker daemon -H fd:// --dns=61.139.2.69 --registry-mirror=***

安装JDK8

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.tar.gz
sudo mkdir /usr/java
sudo tar zxf jdk-8u91-linux-x64.tar.gz -C /usr/java
sudo echo "export JAVA_HOME=/usr/java/jdk1.8.0_91" >> /etc/bashrc
sudo "export PATH=$PATH:$JAVA_HOME/bin" >> /etc/bashrc
sudo echo "export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar" >> /etc/bashrc
source /etc/bashrc

安装Hadoop

下载与环境变量

wget http://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz
sudo mkdir /usr/local/hadoop
sudo tar zxf hadoop-2.7.2.tar.gz -C /usr/local/hadoop
sudo echo "export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.2" >> /etc/bashrc
sudo echo "export HADOOP_CONFIG_HOME=$HADOOP_HOME/etc/hadoop" >> /etc/bashrc
sudo echo "export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin" >> /etc/bashrc
source /etc/bashrc

配置

对于 hadoop ,我还是个初学者,下面的配置是在网上借鉴的别人的文章

  • 首先在 HADOOP_HOME 目录下创建如下目录

    • tmp :临时目录
    • namenode :NameNode 存放目录
    • datanode :DataNode 存放目录
  • 切换到 HADOOP_CONFIG_HOME 目录

cp mapred-site.xml.template mapred-site.xml
  • 配置 core-site.xml
<configuration>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop/hadoop-2.7.2/tmp</value>
    <description>A base for other temporary dirctories.</description>
  </property>

  <property>
    <name>fs.default.name</name>
    <value>hdfs://master:9000</value>
    <final>true</final>
    <description>The name of the default file system.
    A URI whose scheme and authority determine the FileSystem implemntation.
    The uri's scheme determines the config property (fs.SCHEME.impl) naming the FileSystem implemnetation class.
    The uri's authority is used to determine the host, port, etc. for a filesystem.</description>
  </property>
</configuration>

这里指定了缓存目录 $HADOOP_HOME/tmp 和默认文件系统

  • 配置 hdfs-site.xml
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>2</value>
    <final>true</final>
    <description>Default block replication.
    The actual number of replications can be specified when the file is created.
    The default is used if replication is not specified in create time.
    </description>
  </property>

  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/usr/local/hadoop/hadoop-2.7.2/namenode</value>
    <final>true</final>
  </property>

  <property>
    <name>dfs.datenode.data.dir</name>
    <value>/usr/local/hadoop/hadoop-2.7.2/datanode</value>
    <final>true</final>
  </property>
</configuration>

这里指定了备份的数目、 namenode 和 datanode 的目录

  • 配置 mapred-site.xml
<configuration>
  <property>
    <name>maperd.job.tracker</name>
    <value>master:9001</value>
    <description>The host and port that the MapReduce job tracker runs at.
    IF "local", then jobs are run in-process as a single map and reduce task</description>
  </property>
</configuration>

这里指定了 MapReduce 作业调度程序的工作主机和端口。

配置免密码登录

ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
cd ~/.ssh
#获取宿主机的公钥,方便宿主机登录
scp melo@172.17.0.1:~/.ssh/id_rsa.pub authorized_keys
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys

还有一个细节,因为后面运行时,如果每次都从镜像启动,那都是全新的环境,使用 ssh 登录时是需要确认的。

为了避免不必要的麻烦,特意查了资料,找到解决办法。

想要达到连接新主机时不用确认的效果,就需要修改客户端的 ssh 配置的StrictHostKeyChecking 。该参数默认为 ask ,修改为 no

Host *
  StrictHostKeyChecking no

感谢@GotGit的文章 http://www.worldhello.net/2010/04/08/1026.html

Docker配置

保存Container

docker commit -m "hadoop installed" <container id|container name> centos:hadoop

#启动 Hadoop

一开始没有理清 hadoop 的网络模型,以为需要每个节点都需要知道其他所有节点的地址,一直在配置固定 IP 。

但认真想一下, hadoop 并没有这样的需求,它只需要 master 知道其他节点在哪里就行了, slave 之间根本不需要通信。

所以上面创建的镜像已经可以使用了。

启动容器

$ docker run -d --name slave1 centos:hadoop /root/run.sh
$ docker run -d --name slave2 centos:hadoop /root/run.sh
$ docker run -d --name master -h master -P --link slave1:slave1 --link slave2:slave2 centos:hadoop /root/run.sh

我将以上三个命令写到了一个启动脚本里,直接就可以启动了,然后在用 ssh 登录到 master 上启动 hadoop 
因为使用的是 docker 的默认网络,所有可以算出 master 的 IP 地址,当然,也可以通过 docker netword inspect bridge 命令去获取

启动 Hadoop

切换到 $HADOOP_HOME 目录,首先格式化 namenode :

./bin/hadoop namenode -format

看到如下信息,说明格式化成功了。

然后就可以启动 Hadoop 了

$ ./sbin/start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting namenodes on [master]
master: Warning: Permanently added 'master,172.17.0.4' (RSA) to the list of known hosts.
master: starting namenode, logging to /usr/local/hadoop/hadoop-2.7.2/logs/hadoop-root-namenode-master.out
localhost: starting datanode, logging to /usr/local/hadoop/hadoop-2.7.2/logs/hadoop-root-datanode-master.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: Warning: Permanently added '0.0.0.0' (RSA) to the list of known hosts.
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/hadoop-2.7.2/logs/hadoop-root-secondarynamenode-master.out
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/hadoop-2.7.2/logs/yarn-root-resourcemanager-master.out
localhost: starting nodemanager, logging to /usr/local/hadoop/hadoop-2.7.2/logs/yarn-root-nodemanager-master.out
#使用 jps 查看进程
$ jps
480 SecondaryNameNode
640 ResourceManager
737 NodeManager
290 DataNode
195 NameNode
1192 Jps

使用浏览器查看 web 管理接口





收藏 推荐 打印 | 录入:elainebo | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款