在(centos7)搭建基于docker的hadoop集群:一文中,形成了安装有vim、jdk、ssh的centos镜像,现在我们在这个的基础上继续搭建haoop。
在正式开始前,了解一些docker容器的操作命令
docker ps:查看活动的容器
docker ps -a:查看所有的容器(包括终止状态的)
docker images:查看镜像
docker run:基于镜像新建一个容器
docker container start 容器id:启动已经终止的容器,但不会进入容器,容器在后台执行
docker container stop 容器id:终止容器
docker container rm 容器id:删除终止状态的容器
docker image rm 镜像id:删除镜像
进入容器有两个命令:attach和exec
docker attach 容器id:进入容器,使用exit退出时,容器会终止
docker exec -it 容器id bash:进入容器,使用exit退出时,容器不会终止(推荐)
一、安装Hadoop
以之前保存的centos/basic 镜像新建一个名为master的容器,容器中是centos系统,主机名为 master。
命令为:docker run -it -v /home/hadoop/build:/root/build -h master --name master centos/basic /bin/bash
命令 中-v: 表示容器中的centos系统/root/build目录与本地/home/hadoop/build共享;方便包hadoop安装文件从本地上传到Docker内部的centos系统。
打开一个新的终端输入命令docker ps查看开启的名为master的容器
开启系统之后,我们把下载下来的Hadoop安装文件放到共享目录/home/hadoop/build下面,然后在Docker内部centos系统的/root/build目录即可获取到Hadoop安装文件;在Docker内部的Ubuntu系统安装Hadoop和本地安装一样
放好Hadoop的安装文件后,进入Docker内部centos系统的/root/build目录
解压到/usr/local目录下:tar -zxvf hadoop-2.9.0.tar.gz -C /usr/local
进入/usr/local目录下后,并将hadoop-2.9.0目录名重命名为hadoop:mv hadoop-2.9.0 hadoop
如果不是root用户登录的,还要修改hadoop文件权限
chown -R 用户名 hadoop
进入hadoop目录下,使用命令./bin/hadoop version验证是否安装成功
二、配置Hadoop
配置的这些文件都在/usr/local/hadoop/etc/hadoop/目录下
1、修改core-site.xml
hadoop.tmp.dir
file:/usr/local/hadoop/tmp
Abase for other temporary directories.
fs.defaultFS
hdfs://master:9000
2、修改hdfs-site.xml
再打开hdfs-site.xml输入以下内容:
dfs.namenode.name.dir
file:/usr/local/hadoop/namenode_dir
dfs.datanode.data.dir
file:/usr/local/hadoop/datanode_dir
dfs.replication
3
3、修改mapred-site.xml
一开始mapred-site.xml并不不存在,使用命令复制cp mapred-site.xml.template mapred-site.xml得到。然后修改内容
mapreduce.framework.name
yarn
4、修改yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.hostname
master
5、打开hadoop-env.sh
#假设现在/usr/local/hadoop目录下
vim ./etc/hadoop/hadoop-env.sh
# 将export JAVA_HOME=${JAVA_HOME}替换成
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
到此配置完成了,然后将此容器保存为名为centos/hadoop镜像。新开一个终端中如图输入命令:
三、搭建基于docekr的hadoop集群
开启三个新的终端。然后基于centos/hadoop镜像,创建三个容器,容器名分别为master、slave01和slave02
命令: docker run -it -h master --name master centos/hadoop /bin/bash
docker run -it -h slave01 --name slave01 centos/hadoop /bin/bash
docker run -it -h slave02 --name slave02 centos/hadoop /bin/bash
在开启基于centos/hadoop镜像,名为master的容器前,可以先把之前基于centos/basic 镜像,名字也为master的容器终止, 然后删掉;
命令:docker container stop 容器id
docekr container rm 容器id
然后创建基于centos/hadoop镜像,名为master的容器:
docker run -it -h master --name master centos/hadoop /bin/bash
最终主机中共有三个容器,分别为maste、slave01和slave02
在每个容器主机中开启ssh服务
/usr/sbin/sshd -D &
用ssh localhost 查看ssh服务是否开启成功
接着配置master,slave01和slave02的地址信息,这样他们才能找到彼此,分别打开/etc/hosts可以查看本机的ip和主机名信息,最后得到三个ip和主机地址信息如下:
172.17.0.2 master
172.17.0.3 slave01
172.17.0.4 slave02
最后把上述三个地址信息分别复制到master,slave01和slave02的/etc/hosts即可,我们可以用如下命令来检测下是否master是否可以连上slave01和slave02
ssh slave01
ssh slave02
如果出现ssh: connect to host localhost port 22: Connection refused,那么可能是ssh服务没开启
开启ssh服务:/usr/sbin/sshd -D &
ctrl+c可以退出命令。
最后打开master上的slaves文件,输入两个slave的主机名:
vim /usr/local/hadoop/etc/hadoop/slaves
# 将localhost替换成两个slave的主机名
slave01
slave02
在master终端上,首先进入/usr/local/hadoop,然后运行如下命令
cd /usr/local/hadoop
bin/hdfs namenode -format
sbin/start-all.sh
这时Hadoop集群就已经开启,我们可以在master,slave01和slave02上分别运行命令jps查看运行结果;
master节点:
slave01节点
slave02节点
每次关机再开机后,执行start-all.sh后,namenode并没有启动。出现这个问题的主要原因是hadoop的临时文件 默认位置为${HADOOP_HOME}/tmp目录,该目录在系统开机时会自动清空,存储在里面的namenode信息也就丢失了。解决办法:
创建目录比如${HADOOP_HOME}/hadoop.tmp,并修改core-site.xml
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service