Win10 Docker 搭建Hadoop集群

发布于 2020-04-25  117 次阅读


创建一个基础基础环境

docker run -d --name hadoop-base --privileged=true -v F:\Users\MyLord\Docker\data:/home/wrj/data centos:7 /usr/sbin/init

进入/bin/bash

docker exec -it hadoop-base /bin/bash
-d detach 分离终端
--name 命名
--pirvileged 特权模式
-v 与主机共享空间

必要环境

  1. JDK,因为hadoop是用java写的
  2. hadoop
  3. ssh,便于master容器访问node容器
  4. vim,容器是纯净的,之后修改配置文件需要编辑器

先安装VIM

yum install vim-enhanced

mark

安装ssh

yum install openssh-server -y
yum install openssh-clients -y

安装service

yum install initscripts

安装JDK

参考很多人都是先配置好JDK和ssh,然后配置hadoop,我这里先把环境变量全配置了。
jdk和hadoop自行下载,我使用的版本是jdk1.8.0_202,hadoop是hadoop-2.6.0-cdh5.7.0
把jdk和hadoop放到之前设置的共享目录F:\Users\MyLord\Docker\data下,去/home/wrj/data 下,解压文件到/opt

tar -zxvf jdk-8u202-linux-x64.tar.gz -C /opt/
tar -zxvf hadoop-2.6.0-cdh5.7.0.tar.gz -C /opt/
mv /opt/hadoop-2.6.0-cdh5.7.0 /opt/hadoop-2.6.0

设置环境变量,修改~/.bashrc,添加

JAVA_HOME=/opt/jdk1.8.0_202
JRE_HOME=/opt/jdk1.8.0_202/jre

HADOOP_HOME=/opt/hadoop-2.6.0
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export JAVA_HOME JRE_HOME CLASSPATH HADOOP_HOME PATH

使环境变量生效

source ~/.bashrc

测试是否配置好
jdk-hadoop

配置ssh免密登录

用ssh-keygen生成密钥对,在~/.ssh目录下,把公钥(.pub结尾)拷贝到authorized_keys中

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

测试ssh是否可以使用

service sshd start 
# systemctl start ssh
ssh bb752ccc9778(本机host)

ssh-login

配置hadoop

创建hadoop需要的工作目录
cd /opt
mkdir tmp
mkdir -p hdfs/name
mkdir hdfs/data

进入/opt/hadoop-2.6.0/etc/hadoop,修改hadoop-env.sh、yarn-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、slaves配置文件

修改hadoop-env.sh,yarn-env.sh,把JAVA_HOME设置成
export JAVA_HOME=/opt/jdk1.8.0_202/
修改core-site.xml
<configuration>
        <property>
                <name> fs.default.name </name>
                <value>hdfs://master:9000</value>
        </property>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://master:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/opt/tmp</value>
        </property>
</configuration>
修改hdfs-site.xml
<configuration>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:/opt/hdfs/name</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:/opt/hdfs/data</value>
        </property>
        <property>
                <name>dfs.replication</name>
                <value>2</value>
                <description>副本个数(每个本分割的文件会存储在几台datanode上,默认是3),这个数量应该小于datanode机器数</description>
        </property>
        <property>
                <name>dfs.permissions.enabled</name>
                <value>false</value>
        </property>
</configuration>
修改mapred-site.xml

目录下没有这个文件但有一个.template结尾的,我们先执行

cp mapred-site.xml.template mapred-site.xml

然后修改为

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
                <description>mapreduce's framework is yarm</description>
        </property>
</configuration>
修改yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>master</value>
                <description>yarn resourcemanager hostname is master</description>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
                <description>just mapreduce_shuffle can run MapReduce</description>
        </property>
</configuration>
修改slaves

增加datanode节点的hostname

node1
node2
node3

我们的基础容器就建好了,接下来直接以他为镜像,建立master,node1,node2,node3

docker ps查看当前运行容器的ID,提交为一个镜像,执行

docker commit bb752ccc9778(hadoop-base容器ID) wrj/hadoop-distributed-base

容器list

开始构建集群

创建master

docker run -d --name hadoop-master --privileged=true `
-p 50010:50010 `
-p 50020:50020 `
-p 50070:50070 `
-p 50075:50075 `
-p 50090:50090 `
-p 8020:8020 `
-p 9000:9000 `
-p 10020:10020 `
-p 8030:8030 `
-p 19888:19888 `
-p 8031:8031 `
-p 8032:8032 `
-p 8033:8033 `
-p 8040:8040 `
-p 8042:8042 `
-p 8088:8088 `
-p 49707:49707 `
-p 2122:2122 `
-v F:\Users\MyLord\Docker\data:/home/wrj/data `
-h master wrj/hadoop-distributed-base /usr/sbin/init

再确认ssh和java,hadoop是否可以使用,ip addr记下master的ip一般是172.17.0.2或者172.17.0.3

docker exec -it hadoop-master /bin/bash
ssh master
java -version
hadoop version
ip addr

ssh-java-hadoop-test

创建node

docker run -d --name hadoop-node1 --privileged=true `
-p 50010 `
-p 50020 `
-p 50070 `
-p 50075 `
-p 50090 `
-p 8020 `
-p 9000 `
-p 10020 `
-p 8030 `
-p 19888 `
-p 8031 `
-p 8032 `
-p 8033 `
-p 8040 `
-p 8042 `
-p 8088 `
-p 49707 `
-p 2122 `
-v F:\Users\MyLord\Docker\data:/home/wrj/data `
-h node1 wrj/hadoop-distributed-base /usr/sbin/init

把测试node,把master的ip放到/etc/hosts

docker exec -it hadoop-node1 /bin/bash
vim /etc/hosts

加上

172.17.0.3(master ip)   master

测试ssh

ssh master

同理创建node2,node3,把数字改掉即可

在node3中 ssh master 修改 master的hosts文件为

172.17.0.4    node1
172.17.0.5    node2
172.17.0.6    node3

执行

hadoop namenode -format

hadoop-format

如果出现其他status,看日志解决,或者清空tmp文件夹,重新配置文件,再format

启动集群

去/opt/hadoop-2.6.0/sbin 目录下,jps查看启动状况

./start-dfs.sh
./start-yarn.sh
jps

jps
符合配置文件

进入http://127.0.0.1:50070

hadoop-50070

关闭集群

执行执行/opt/hadoop-2.6.0/sbin 目录下的stop-all.sh

./stop-yarn.sh
./stop-dfs.sh

zookeeper

待续

hbase

待续

可能遇到的问题

当启动master时,提示TCP端口被占用

方案一

执行 netstat -ano | findstr [占用的端口]
如果找到了,用其PID(最后一列)去任务管理器中找到,对应占用程序,end task
找不到用方案二
暴力一点

先执行 tasklist|findstr PID 找到 进程名称(第一列)
然后 taskkill /f /t /im [进程名称]

方案二

找不到对应端口又提示占用了,那就是被藏起来了

退出docker关闭hyper-v
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
重启后开启需要的端口
netsh int ipv4 add excludedportrange protocol=tcp startport=49707 numberofports=1
启动 hyper-v,重启
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

参考链接

https://www.jianshu.com/p/7ab2b6168cc9
https://github.com/docker/for-win/issues/3171
https://blog.csdn.net/weixin_41010198/article/details/90172933


天空没有鸟的痕迹,但我已飞过。