使用docker部署hadoop集群的详细教程
最近要在公司里搭建一个hadoop测试集群,于是采用docker来快速部署hadoop集群。
0.写在前面
网上也已经有很多教程了,但是其中都有不少坑,在此记录一下自己安装的过程。
目标:使用docker搭建一个一主两从三台机器的hadoop2.7.7版本的集群
准备:
首先要有一台内存8G以上的centos7机器,我用的是阿里云主机。
其次将jdk和hadoop包上传到服务器中。
我安装的是hadoop2.7.7。包给大家准备好了,链接:https://pan.baidu.com/s/15n_W-1rqOd2cUzhfvbkH4g提取码:vmzw。
1.步骤
大致分以下几步:
- 安装docker
- 基础环境准备
- 配置网络,并启动docker容器
- 配置host及ssh免密登录
- 安装配置hadoop
1.1安装docker
依次执行如下步骤安装docker。如果有docker环境的可以跳过。
yumupdate yuminstall-yyum-utilsdevice-mapper-persistent-datalvm2 yum-config-manager--add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yuminstall-ydocker-ce systemctlstartdocker docker-v
1.2基础环境准备
1.2.1创建基础的centos7镜像拉取官方centos7镜像
dockerpullcentos
通过buildDockfile生成带ssh功能的centos镜像
创建Dockerfile文件
viDockerfile
将如下内容写入Dockerfile
FROMcentos MAINTAINERmwf RUNyuminstall-yopenssh-serversudo RUNsed-i's/UsePAMyes/UsePAMno/g'/etc/ssh/sshd_config RUNyuminstall-yopenssh-clients RUNecho"root:qwe123"|chpasswd RUNecho"rootALL=(ALL)ALL">>/etc/sudoers RUNssh-keygen-tdsa-f/etc/ssh/ssh_host_dsa_key RUNssh-keygen-trsa-f/etc/ssh/ssh_host_rsa_key RUNmkdir/var/run/sshd EXPOSE22 CMD["/usr/sbin/sshd","-D"]
上述内容大概意思是:以centos镜像为基础,设置密码为wqe123,安装ssh服务并启动
构建Dockerfile
dockerbuild-t="centos7-ssh".
将生成一个名为centos7-ssh的镜像,可以通过dockerimages查看
1.2.2生成有hadoop和jdk环境的镜像
- 将准备好的包放在当前目录下。hadoop-2.7.7.tar.gz和jdk-8u202-linux-x64.tar.gz
- 通过buildDockfile生成带hadoop和jdk环境的centos镜像
刚才已经创建了一个Dockerfile了,先将他移开。mvDockerfileDockerfile.bak
创建Dockerfile
viDockerfile
将以下内容写入:
FROMcentos7-ssh ADDjdk-8u202-linux-x64.tar.gz/usr/local/ RUNmv/usr/local/jdk1.8.0_202/usr/local/jdk1.8 ENVJAVA_HOME/usr/local/jdk1.8 ENVPATH$JAVA_HOME/bin:$PATH ADDhadoop-2.7.7.tar.gz/usr/local RUNmv/usr/local/hadoop-2.7.7/usr/local/hadoop ENVHADOOP_HOME/usr/local/hadoop ENVPATH$HADOOP_HOME/bin:$PATH RUNyuminstall-ywhichsudo
上述内容大概意思是:以上面生成的centos7-ssh为基础,将hadoop和jdk包放进去,然后配好环境变量。
构建Dockerfile
dockerbuild-t="hadoop".
将生成一个名为hadoop的镜像
1.3配置网络,并启动docker容器
因为集群间必须要能网络连通,所以要先配置好网络。
创建网络
dockernetworkcreate--driverbridgehadoop-br
以上命令创建了一个名为hadoop-br的bridge类型的网络
启动docker时指定网络
dockerrun-itd--networkhadoop-br--namehadoop1-p50070:50070-p8088:8088hadoop dockerrun-itd--networkhadoop-br--namehadoop2hadoop dockerrun-itd--networkhadoop-br--namehadoop3hadoop
以上命令启动了3台机器,网络都指定为hadoop-br,hadoop1还开启了端口映射。
查看网络情况
dockernetworkinspecthadoop-br
执行以上命令就可以看到对应的网络信息:
[ { "Name":"hadoop-br", "Id":"88b7839f412a140462b87a353769e8091e92b5451c47b5c6e7b44a1879bc7c9a", "Containers":{ "86e52eb15351114d45fdad4462cc2050c05202554849bedb8702822945268631":{ "Name":"hadoop1", "IPv4Address":"172.18.0.2/16", "IPv6Address":"" }, "9baa1ff183f557f180da2b7af8366759a0d70834f43d6b60fba2e64f340e0558":{ "Name":"hadoop2", "IPv4Address":"172.18.0.3/16", "IPv6Address":"" },"e18a3166e965a81d28b4fe5168d1f0c3df1cb9f7e0cbe0673864779b224c8a7f":{ "Name":"hadoop3", "IPv4Address":"172.18.0.4/16", "IPv6Address":"" } }, } ]
我们可以得知3台机器对应的ip:
172.18.0.2hadoop1 172.18.0.3hadoop2 172.18.0.4hadoop3
登录docker容器,互相之间就可以ping通了。
dockerexec-ithadoop1bash dockerexec-ithadoop2bash dockerexec-ithadoop3bash
1.4配置host及ssh免密登录
1.4.1配置host
分别在每台修改每台机器的host
vi/etc/hosts
将以下内容写入(注:docker分出来的ip对于每个人可能不一样,填你自己的):
172.18.0.2hadoop1 172.18.0.3hadoop2 172.18.0.4hadoop3
1.4.2ssh免密登录
因为上面在镜像中已经安装了ssh服务,所以直接分别在每台机器上执行以下命令:
ssh-keygen 一路回车 ssh-copy-id-i/root/.ssh/id_rsa-p22root@hadoop1 输入密码,如果按我的来得话就是qwe123 ssh-copy-id-i/root/.ssh/id_rsa-p22root@hadoop2 输入密码,如果按我的来得话就是qwe123 ssh-copy-id-i/root/.ssh/id_rsa-p22root@hadoop3 输入密码,如果按我的来得话就是qwe123
1.4.3测试是否配置成功
pinghadoop1 pinghadoop2 pinghadoop3 sshhadoop1 sshhadoop2 sshhadoop3
1.5安装配置hadoop
1.5.1在hadoop1上操作
进入hadoop1
dockerexec-ithadoop1bash
创建一些文件夹,一会在配置中要用到
mkdir/home/hadoop mkdir/home/hadoop/tmp/home/hadoop/hdfs_name/home/hadoop/hdfs_data
切换到hadoop配置的目录
cd$HADOOP_HOME/etc/hadoop/
编辑core-site.xml
fs.defaultFS hdfs://hadoop1:9000 hadoop.tmp.dir file:/home/hadoop/tmp io.file.buffer.size 131702
编辑hdfs-site.xml
dfs.namenode.name.dir file:/home/hadoop/hdfs_name dfs.datanode.data.dir file:/home/hadoop/hdfs_data dfs.replication 2 dfs.namenode.secondary.http-address hadoop1:9001 dfs.webhdfs.enabled true
编辑mapred-site.xml
mapred-site.xml默认不存在,要执行cpmapred-site.xml.templatemapred-site.xml
mapreduce.framework.name yarn mapreduce.jobhistory.address hadoop1:10020 mapreduce.jobhistory.webapp.address hadoop1:19888
编辑yarn-site.xml
yarn.nodemanager.aux-services mapreduce_shuffle yarn.nodemanager.auxservices.mapreduce.shuffle.class org.apache.hadoop.mapred.ShuffleHandler yarn.resourcemanager.address hadoop1:8032 yarn.resourcemanager.scheduler.address hadoop1:8030 yarn.resourcemanager.resource-tracker.address hadoop1:8031 yarn.resourcemanager.admin.address hadoop1:8033 yarn.resourcemanager.webapp.address hadoop1:8088
编辑slaves
我这里把hadoop1当成主节点,hadoop2、3作为从节点
hadoop2 hadoop3
把文件拷贝到hadoop2和hadoop3上
依次执行以下命令:
scp-r$HADOOP_HOME/hadoop2:/usr/local/ scp-r$HADOOP_HOME/hadoop3:/usr/local/ scp-r/home/hadoophadoop2:/ scp-r/home/hadoophadoop3:/
1.5.2在每台机器上操作
分别连接每台机器
dockerexec-ithadoop1bash dockerexec-ithadoop2bash dockerexec-ithadoop3bash
配置hadoopsbin目录的环境变量
因为hadoopbin目录在之前创建镜像时就配好了,但是sbin目录没有配,所以要单独配置。分配为每台机器配置:
vi~/.bashrc
追加如下内容:
exportPATH=$PATH:$HADOOP_HOME/sbin
执行:
source~/.bashrc
1.5.3启动hadoop
在hadoop1上执行以下命令:
格式化hdfs
hdfsnamenode-format
一键启动
start-all.sh
不出错的话,就可以庆祝一下了。出错的话,加油。
1.6测试使用hadoopjps
#hadoop1 1748Jps 490NameNode 846ResourceManager 686SecondaryNameNode #hadoop2 400DataNode 721Jps 509NodeManager #hadoop3 425NodeManager 316DataNode 591Jps
上传文件
hdfsdfs-mkdir/mwf echohello>a.txt hdfsdfs-puta.txt/mwf hdfsdfs-ls/mwf Found1items drwxr-xr-x-rootsupergroup02020-09-0411:14/mwf
由于是云服务器,不想配端口,就不看ui界面了。
2.最后
以上是我安装成功之后总结的过程,应该没有问题,也可能有遗漏。
3.参考
https://cloud.tencent.com/developer/article/1084166
https://cloud.tencent.com/developer/article/1084157?from=10680
https://blog.csdn.net/ifenggege/article/details/108396249
到此这篇关于使用docker部署hadoop集群的详细教程的文章就介绍到这了,更多相关docker部署hadoop集群内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。