博客推荐: docker环境下搭建hadoop集群
使用docker搭建hadoop集群,大致分为如下几步:
- 在Linux环境下,安装docker环境;
- 在远程仓库中拉取(pull)hadoop镜像,并安装(指令为docker run -it ......);
- 安装vim,ssh
- 配置无密码登录(原理就是将各节点生成的公钥,全部保存至各节点的/root/.ssh/authorized_keys中,实现免密登录)(每次重启都必须输入/usr/sbin/sshd指令,激活密钥)
- 按照官方说明,配置hadoop文件($HADOOP_HOME/hadoop目录下的hadoop-env.sh、core-site.xml 和 yarn-site.xml 和 mapred-site.xml 及 hdfs-site.xml 文件)几个文件。
- 删除各节点$HADOOP_HOME/hadoop目录下的hdfs文件夹,按照配置规划内容分别创建$HADOOP_HOME/hadoop/hdfs/name or data(规划该结点为data结点则创建data目录,反之亦然)
- 格式化HDFS目录(在Master结点下 hdfs namenode -format)
- 群起集群($HADOOP_HOME/sbin下 start-all.sh)
注意事项:
- 查看docker容器ip:
sudo docker inspect -f='{{.Name}}--{{.NetworkSettings.IPAddress}}' $(sudo docker ps -a -q)
- 在docker容器中不要使用attach指令切换到各个结点,而应该使用 exec指令,原因在于attach指令下crtl+D会直接退出连接并关闭对应的docker容器,而exec指令则不会强行关闭docker容器带来不必要的玛法。
docker exec -it XXX(Master) /bin/bash
- 每次重启docker容器的时候都需要修改/etc/hosts文件
/etc/hosts, /etc/resolv.conf和/etc/hostname,容器中的这三个文件不存在于镜像,在启动容器的时候,通过mount的形式将这些文件挂载到容器内部。因此,如果在容器中修改这些文件的话,修改部分不会存在于容器的top layer,而是直接写入这三个物理文件中。
为什么重启后修改内容不存在了?原因是:每次Docker在启动容器的时候,通过重新构建新的/etc/hosts文件,容器重启,IP地址为改变,hosts文件中原来的IP地址无效,因此理应修改hosts文件,否则会产生脏数据。
- 不要使用sbin/start-all.sh群起集群,此指令hadoop官方已经不再推荐使用了,而应该采用
start-dfs.sh #启动HDFS
start-yarn.sh #启动yarn资源管理
- 习惯性使用jps查看当前结点启动情况
- 查看集群整体情况
hadoop dfsadmin -report
7.50700端口:查看HDFS的整体运行情况,并可以在Browse Directory中查看文件目录
8088 端口:查看MapReduce状态,在配置historyserver以及logs之后可以查看历史记录以及日志
8. 第一次启动的时候记得修改/$HADOOP_HOME/etc/hadoop/slave文件,修改结点名称,不然默认的名称,集群是找不到的(因为在修改配置的时候我们已经更换了结点的名称了~)
- 运行./start-all.sh时,提示spark-worker2/worker1 : ssh : could not resolve hostname spark-worker1/2 : Name or Service not know。
解决方案:
修改$HADOOP_HOME/etc/hadoop下面的slave文件。