基于docker技术搭建hadoop与mapreduce分布式环境
基于docker技术搭建hadoop与mapreduce分布式环境
基于docker技术搭建hadoop与mapreduce分布式环境
一、安装doker
1. 宿主环境确认
-
(如果没有的话)安装lsb-relaease工具
apt install lsb-release
-
检查版本
lsb_release -a
2. 整备安装环境
-
更新系统
sudo apt update
sudo apt upgrade
-
下载curl:
sudo apt install curl
3. 安装docker
-
通过curl工具安装docker
curl -fssl https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
-
确认docker的安装
sudo docker version
-
(可选)安装docker-compose,当前最新版本为1.29.2
可以先行访问 https://github.com/docker/compose/releases/ 确认版本号
sudo curl -l "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
-
添加国内的docker镜像cdn
sudo vi /etc/docker/daemon.json
{ "registry-mirrors":["https://kfp63jaj.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com","http://hub-mirror.c.163.com"] }
-
重载docker使cdn生效:
sudo systemctl daemon-reload
sudo systemctl restart docker
重启docker但遇到问题(如上图)
为了方便,我先安装一个vim(实在不会用vi)
于是我删除了docker,并重新安装之后问题解决
-
测试docker能否正常抓取镜像和运行
-
运行hello-world测试案例
sudo docker run hello-world
-
-
查看hello-world镜像的运行记录
sudo docker ps -a
二、基于docker技术搭建hadoop与mapreduce
1. 整备容器环境
-
抓取ubuntu 18.04的镜像作为基础搭建hadoop环境
sudo docker pull ubuntu:18.04
-
查看镜像是否抓取成功
sudo docker images
-
使用该ubuntu镜像启动一个容器
将<host-share-path>与<container-share-path>连通
sudo docker run -it -v ~/hadoop/build:/home/hadoop/build ubuntu
似乎总是会在前几个cdn里面找不到镜像,然后报一个错,然后在后面的cdn里面找到镜像
容器启动后,会自动进入容器的控制台
-
在容器的控制台安装所需软件
apt-get update
apt-get upgrade
-
需要安装net-tools(网络管理工具)、vim(命令行文本编辑器)和ssh(远程登录协议)
apt-get install net-tools vim openssh-server
2. 配置ssh服务器
-
让ssh服务器自动启动
vim ~/.bashrc
在文件的最末尾按o进入编辑模式,加上:
/etc/init.d/ssh start
按esc返回命令模式,输入:wq保存并退出
-
让修改即刻生效
source ~/.bashrc
-
配置ssh的无密码访问
ssh-keygen -t rsa
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
3. 安装jdk8
(注意:hadoop3.x目前仅支持jdk7,8)
-
安装jdk8
apt-get install openjdk-8-jdk
-
在环境变量中英勇jdk,编辑bash命令行配置文件
vim ~/.bashrc
在文件的最末尾加上:
export java_home=/usr/lib/jvm/java-8-openjdk-amd64/ export path=$path:$java_home/bin
-
让jdk配置即刻生效
source ~/.bashrc
-
测试jdk正常运作
java -version
4. 保存镜像
-
(可选)登陆docker,需要事先在docker网站上注册账号,好处是可以将自己做好的镜像提交到网上
sudo docker login
-
查询container id
sudo docker ps -a
-
将当前容器保存为镜像
sudo docker commit <container id> <image name>
-
容器太多时可以通过以下命令删除容器
docker rm -f <containerid>
5. 安装hadoop
-
在宿主控制台上下载hadoop二进制压缩包
本文使用的hadoop版本为3.2.1,目前最新版本:3.3.2
其他版本可以在apache hadoop官网下载: https://hadoop.apache.org/releases.html
cd /<host-share-path>
<host-share-path>指的是创建容器的时候的前面的路径:~/hadoop/build
wget https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz
(这里下载的只是网页,没有用,因此hadoop压缩包还是得自己去下,懂吧!)
-
在容器控制台上解压hadoop
如果容器名字不喜欢或者不好打,可以给他重命名
docker rename <原名> <新名>
打开容器
docker exec -it <容器名或容器id> /bin/bash
如果容器没有启动,需要先启动容器
docker start <容器名或容器id>
cd /<container-share-path>
<container -share-path>指的是创建容器的时候的前面的路径:/home/hadoop/build
tar -zxvf hadoop-3.3.2.tar.gz -c /usr/local
(注意,使用hadoop-3.2.3.tar.gz时我出现了解压有问题的情况,因此更换了hadoop-3.3.2.tar.gz)
-
安装完成了,查看hadoop版本
-
配置环境变量
export hadoop_home=/usr/local/hadoop-3.3.2 export hadoop_yarn_home=$hadoop_home
-
测试
cd /usr/local/hadoop-3.3.2
./bin/hadoop version
-
-
为hadoop指定jdk位置
-
修改配置文件
在hadoop安装目录下执行
vim etc/hadoop/hadoop-env.sh
查找到被注释掉的java_home配置位置,更改为刚才设定的jdk位置
export java_home=/usr/lib/jvm/java-8-openjdk-amd64/
-
-
hadoop联机配置
-
配置core-site.xml文件
在hadoop安装目录下执行
vim etc/hadoop/core-site.xml
加入
<configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop-3.2.1/tmp</value> <description>abase for other temporary directories.</description> </property> <!-- 配置文件系统的uri,代码中可以通过该地址访问文件系统,使用 hdfsoperator.hdfs_uri 调用 --> <property> <name>fs.defaultfs</name> <value>hdfs://master:9000</value> </property> </configuration>
-
配合hdfs-site.xml文件
在hadoop安装目录下执行
vim etc/hadoop/hdfs-site.xml
加入
<configuration> <!-- 配置保存fsimage位置 --> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop-3.2.1/namenode_dir</value> </property> <!-- 配置保存数据文件的位置 --> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop-3.2.1/datanode_dir</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> </configuration>
-
mapreduce配置
该配置文件的定义说明参考:
https://hadoop.apache.org/docs/r<hadoop版本号>/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
-
配置mapred-site.xml
在hadoop安装目录下执行
vim etc/hadoop/mapred-site.xml
加入
<configuration> <!-- mapreduce框架的名字 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- 设定hadoop的位置给yarn和mapreduce程序 --> <property> <name>yarn.app.mapreduce.am.env</name> <value>hadoop_mapred_home=${hadoop_home}</value> </property> <property> <name>mapreduce.map.env</name> <value>hadoop_mapred_home=${hadoop_home}</value> </property> <property> <name>mapreduce.reduce.env</name> <value>hadoop_mapred_home=${hadoop_home}</value> </property> </configuration>
-
配置yarn-site.xml文件
在hadoop安装目录下执行
vim etc/hadoop/yarn-site.xml
加入
<configuration> <!-- site specific yarn configuration properties --> <!-- 辅助服务,数据混洗 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 设定资源管理服务器的host名称,这个名称(master)将在下个小节中设定--> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property> </configuration>
-
-
服务启动权限配置
-
配置start-dfs.sh与stop-dfs.sh文件
在hadoop安装目录下执行
vim sbin/start-dfs.sh
和
vim sbin/stop-dfs.sh
在文件开头加入
HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root
-
配置start-yarn.sh与stop-yarn.sh文件
在hadoop安装目录下执行
vim sbin/start-yarn.sh
和
vim sbin/stop-yarn.sh
在文件开头加入
YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root
-
配置完成,保存镜像
-
返回宿主机
exit
-
查看容器
docker ps
-
上传容器
docker commit <container id> <image name>
-
-
-
启动hadoop,并进行网络配置
-
打开三个宿主控制台,启动一主两从三个容器:
-
master
打开端口映射:8088=>8080
sudo docker run -p 8088:8080 -it -h master –-name master <image name>
-
worker01
sudo docker run -it -h worker01 –-name worker01 <image name>
-
worker02
sudo docker run -it -h worker02 –-name worker02 <image name>
-
分别打开三个容器的/etc/hosts,将彼此的ip地址与主机名的映射信息补全(三个容器均需要如此配置)
vim /etc/hosts
(需要时也可以使用一下命令查询ip: ifconfig<if和config中间不要有空格,否则就是另一个命令>)
添加信息(每次容器启动该文件都需要调整)
<master的实际ip> master <worker01的实际ip> worker01 <worker02的实际ip> worker02
三台的hosts文件内容都一样
-
检查配置是否有效
ssh master
ssh worker01
ssh worker02
-
-
在master容器上配置worker容器的主机名
cd /usr/local/hadoop-3.3.2
vim etc/hadoop/workers
删除localhost,加入
worker01 worker02
网络配置完成
-
启动hadoop
-
在master主机上,启动hadoop
cd /usr/local/hadoop-3.3.2
./bin/hdfs namenode -format
./sbin/start-all.sh
-
在hdfs上建立一个目录存放文件
假设要创建的目录为:/home/hadoop/input
./bin/hdfs dfs -mkdir -p /home/hadoop/input
./bin/hdfs dfs -put ./etc/hadoop/*.xml /home/hadoop/input
-
查看分发复制是否正常
./bin/hdfs dfs -ls /home/hadoop/input
-
-
运行mapreduce自带的示例例程序
-
运行程序
-
新建目录/home/hadoop/wordcount
./bin/hdfs dfs -mkdir /home/hadoop/wordcount
-
新建输入文件hello.txt并放在/home/hadoop/wordcount/目录下
-
执行程序
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.2.jar wordcount /home/hadoop/wordcount /home/hadoop/wordcount/output
-
-
-
运行结束后,查看输出结果
(由于原先提供的任务我的云服务器跑不出来,因此我换成了wordcount任务)
./bin/hdfs dfs -ls /home/hadoop/wordcount/output
./bin/hdfs dfs -cat /home/hadoop/wordcount/output/*
三、Q&A
Q1:如何让name node退出安全模式。
A1:关闭容器前,没有执行stop-all.sh命令会导致name node进入安全模式。退出安全模式命令如下
./bin/hadoop dfsadmin -safemode leave
Q2:如何批量删除已经退出的容器。
A2:
sudo docker container prune
Q3:启动hadoop服务时出现connect to host <docker node> port 22: connection refused的错误。
A3:ssh服务器没有启动,使用下面的命令启动ssh服务器
/etc/init.d/ssh start
更多推荐
所有评论(0)