【hadoop3.2.1】windows10 docker学习环境创建,windows和容器bridge模式下联网,测试例子

本地机器:windows10
虚拟机:centOS7.9
docker创建hadoop学习环境

1.创建docker镜像(hadoop)

下载centos镜像: docker pull centos
启动一个容器:docker run -td --name base -i centos bash
进入容器,安装jdk及hadoop,方法和主机一样
容器中安装ssh:yum install openssh-server openssh-clients
设置免密登录: ssh-keygen -t rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
保存容器修改:docker commit base hadoop:4

docker安装java

docker安装java

  1. 下载java:java
  2. id获取:docker ps
  3. java复制到虚拟机中:5016972d8541是id
    docker cp C:\Users\wxl\Downloads\jdk-8u333-linux-x64.tar.gz 5016972d8541:/software
    
  4. 解压tar -zxvf jdk-8u65-linux-x64.tar.gz
  5. 环境变量

2. 网络问题和创建容器

macos
windows

  1. hadoop镜像:docker pull registry.cn-hangzhou.aliyuncs.com/san-namespaces/san-registry:hadoop-3.2.1
  2. 创建自定义网络
    docker network create --subnet=192.168.0.0/16 -d nat mynetwork# error 说没有nat?
    docker network create --subnet=192.168.0.0/16 -d bridge mynetwork
    docker network ls
    # NETWORK ID     NAME      DRIVER    SCOPE
    # 62710c6cefa1   bridge    bridge    local #默认连这个网络
    # 5a81d1387e99   host      host      local
    # 79d021dcdc7f   none      null      local
    
  3. 创建容器
    docker run -h hadoop-master --name hadoop-master -p 8088:8088 -p 9870:9870 -p 9868:9868 -p 1022:22 -itd --privileged=true --net mynetwork --ip 192.168.0.4 4eba2c1559c7 /usr/sbin/init
    docker run -h hadoop-slave1 --name hadoop-slave1 -itd  --privileged=true --net mynetwork -p 10221:22 --ip 192.168.0.5 4eba2c1559c7 /usr/sbin/init
    docker run -h hadoop-slave2 --name hadoop-slave2 -itd  --privileged=true --net mynetwork -p 10222:22  --ip 192.168.0.6 4eba2c1559c7 /usr/sbin/init
    
https://blog.csdn.net/qq_42511420/article/details/124926620 

4. 修改密码`passwd root`
5. cat /etc/hosts

> 192.168.0.4     hadoop-master
192.168.0.5     hadoop-slave1
192.168.0.6     hadoop-slave2

重启时自动添加:`cat ~/.bashrc`

> :>/etc/hosts cat >>/etc/hosts<<EOF
> 127.0.0.1  localhost
> 192.168.0.4   hadoop-master
> 192.168.0.5   hadoop-slave1
> 192.168.0.6   hadoop-slave2 EOF
## 配置机器间免密登陆
1. 修改ssh配置
/etc/ssh/sshd_config文件中开启:
	```python
	PubkeyAuthentication yes
	```
2. 重启ssh服务
	```python
	systemctl restart sshd.service
	```
3. 创建ssh key
	```python
	ssh-keygen -t rsa
	```
连续回车,最终会在/root/.ssh目录下生成id_rsa和 id_rsa.pub文件。
上述操作每台机器执行一次(1-3)

4. 合并公钥
登陆hadoop-master,在/root/.ssh目录下执行以下命令,将a0的公钥追加到authorized_keys文件中(如果authorized_keys不存在会新建):
	```python
	cat id_rsa.pub>> authorized_keys
	```
	将hadoop-slave1的公钥加到hadoop-master中。
	```python
	ssh root@192.168.0.5 cat ~/.ssh/id_rsa.pub>> authorized_keys
	```
	输入hadoop-slave1的密码即可拷贝公钥到hadoop-master的authorized_keys中。同上拷贝hadoop-slave2的公钥到hadoop-master中。

	此时vim /root/.ssh/authorized_keys 如下图所示:

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d4dd51e3be4d6772008218b8dbc47eed.png)

	将hadoop-master中的公钥发送至两台从节点。完成免密登陆配置。
如果authorized_keys不生效,再使用:`ssh-copy-id -i root@ip_address`

## 配置hadoop
hadoop安装目录:/opt/software/hadoop/hadoop-3.2.1
java目录:/opt/software/java/jdk1.8.0_181
版本:3.2.1
$HADOOP_HOME/etc/hadoop

> 在$HADOOP_HOME/etc/hadoop下包括hdfs-site.xml、core-site.xml、yarn-site.xml、mapred-site.xml、master、workers、hadoop-evn.xml。

配置文件修改可参照官方文档按需要配置,也可以参照网上基本配置(注意:hadoop版本不同,服务端口有变化,2.X与3.X相同页面服务,端口不同。master、workers文件名称亦有变化。自行查找配置)

初始镜像里没有hadoop和java的环境变量,是否需要配置?

### 配置hadoop

各文件部分已配置,修改一下
[hadoop配置多机](https://blog.csdn.net/sanhongbo/article/details/114440664)
以下修改操作均在hadoop-master上进行
#### 修改hadoop-env.sh文件
```python
export JAVA_HOME=/usr/local/src/jdk1.8 
export HADOOP_LOG_DIR=/data/hadoop_repo/logs/hadoop #添加这个
修改core-site.xml文件(不用改)
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop-master:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/tmp/hadoop</value>
    </property>
</configuration>
hdfs-site.xml(不用改,保持)
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop-master:9868</value>
    </property>
</configuration>
mapred-site.xml(不用改)
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
yarn-site.xml(部分修改)
<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.env-whitelist</name>
	<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop-master</value>
  </property>
</configuration>

修改workers文件(已有)
hadoop-slave1
hadoop-slave2

修改启动脚本

hadoop启动脚本修改

cd /opt/software/hadoop/hadoop-3.2.1/sbin

在这里插入图片描述

  1. start-dfs.sh,stop-dfs.sh(前者已有,后者需添加)添加以下:
    HDFS_DATANODE_USER=root
    HDFS_DATANODE_SECURE_USER=hdfs
    HDFS_NAMENODE_USER=root
    HDFS_SECONDARYNAMENODE_USER=root
    
  2. 修改start-yarn.sh,stop-yarn.sh
    YARN_RESOURCEMANAGER_USER=root
    HADOOP_SECURE_DN_USER=yarn
    YARN_NODEMANAGER_USER=root
    

格式化并启动hdfs

  1. 首先配一下环境变量source /etc/profile
  2. cd /opt/software/hadoop/hadoop-3.2.1/
  3. 格式化 hadoop namenode -format
  4. cd /opt/software/hadoop/hadoop-3.2.1/sbin

关闭防火墙

关闭防火墙
镜像里没防火墙,装上试试
(不装也打不开网页……)
resource

多种模式

在这里插入图片描述

单机模式

[本地模式环境搭建](https://blog.csdn.net/Yal_insist/article/details/123750149)
官方配置教程

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount ./wcinput ./wcoutput

mkdir input
cp etc/hadoop/.xml input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar grep input output ‘dfs[a-z.]+’
$ cat output/

hadoop-mapreduce-examples-3.1.3.jar:一个案例,里面有多个函数
wordcount包中的其中一个功能
./wcinput输入文件
./wcoutput输出文件
都在本地,无需设置

问题1:找不到本地lib
解决1:设置环境变量

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_HOME=/home/hadoop/hadoop-3.2.1
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR:$HADOOP_HOME/share/hadoop"

解决了warn,但仍无法运行
报错:

java.io.IOException: Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the correspond server addresses.                                 
at org.apache.hadoop.mapreduce.Cluster.initialize(Cluster.java:116)                  
at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:109)
...
 at org.apache.hadoop.util.RunJar.run(RunJar.java:323)                                
 at org.apache.hadoop.util.RunJar.main(RunJar.java:236)

解决:添加配置:etc/hadoop/mapred-site.xml

<property>
       <name>mapreduce.application.classpath</name>
       <value>$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/mapreduce/lib/*</value>
</property>

问题3:datanode未启动
解决:hdfs --daemon start datanode

问题4:.InvalidInputException: Input path does not exist

hadoop fs -put wcintput /

上传成功了,但还是找不到。。。。

宿主机连接容器网络

宿主机连接容器网络

本地机器:windows10
虚拟机:centOS7.9
docker创建hadoop学习环境

1.创建docker镜像(hadoop)

下载centos镜像: docker pull centos
启动一个容器:docker run -td --name base -i centos bash
进入容器,安装jdk及hadoop,方法和主机一样
容器中安装ssh:yum install openssh-server openssh-clients
设置免密登录: ssh-keygen -t rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
保存容器修改:docker commit base hadoop:4

docker安装java

docker安装java

  1. 下载java:java
  2. id获取:docker ps
  3. java复制到虚拟机中:5016972d8541是id
    docker cp C:\Users\wxl\Downloads\jdk-8u333-linux-x64.tar.gz 5016972d8541:/software
    
  4. 解压tar -zxvf jdk-8u65-linux-x64.tar.gz
  5. 环境变量

2. 网络问题和创建容器

macos
windows

  1. hadoop镜像:docker pull registry.cn-hangzhou.aliyuncs.com/san-namespaces/san-registry:hadoop-3.2.1
  2. 创建自定义网络
    docker network create --subnet=192.168.0.0/16 -d nat mynetwork# error 说没有nat?
    docker network create --subnet=192.168.0.0/16 -d bridge mynetwork
    docker network ls
    # NETWORK ID     NAME      DRIVER    SCOPE
    # 62710c6cefa1   bridge    bridge    local #默认连这个网络
    # 5a81d1387e99   host      host      local
    # 79d021dcdc7f   none      null      local
    
  3. 创建容器
    docker run -h hadoop-master --name hadoop-master -p 8088:8088 -p 9870:9870 -p 9868:9868 -p 1022:22 -itd --privileged=true --net mynetwork --ip 192.168.0.4 4eba2c1559c7 /usr/sbin/init
    docker run -h hadoop-slave1 --name hadoop-slave1 -itd  --privileged=true --net mynetwork --ip 192.168.0.5 4eba2c1559c7 /usr/sbin/init
    docker run -h hadoop-slave2 --name hadoop-slave2 -itd  --privileged=true --net mynetwork --ip 192.168.0.6 4eba2c1559c7 /usr/sbin/init
    
  4. 修改密码passwd root
  5. cat /etc/hosts

192.168.0.4 hadoop-master
192.168.0.5 hadoop-slave1
192.168.0.6 hadoop-slave2

重启时自动添加:cat ~/.bashrc

:>/etc/hosts cat >>/etc/hosts<<EOF
127.0.0.1 localhost
192.168.0.4 hadoop-master
192.168.0.5 hadoop-slave1
192.168.0.6 hadoop-slave2 EOF

配置机器间免密登陆

  1. 修改ssh配置
    /etc/ssh/sshd_config文件中开启:
    PubkeyAuthentication yes
    
  2. 重启ssh服务
    systemctl restart sshd.service
    
  3. 创建ssh key
    ssh-keygen -t rsa
    

连续回车,最终会在/root/.ssh目录下生成id_rsa和 id_rsa.pub文件。
上述操作每台机器执行一次(1-3)

  1. 合并公钥
    登陆hadoop-master,在/root/.ssh目录下执行以下命令,将a0的公钥追加到authorized_keys文件中(如果authorized_keys不存在会新建):

    cat id_rsa.pub>> authorized_keys
    

    将hadoop-slave1的公钥加到hadoop-master中。

    ssh root@192.168.0.5 cat ~/.ssh/id_rsa.pub>> authorized_keys
    

    输入hadoop-slave1的密码即可拷贝公钥到hadoop-master的authorized_keys中。同上拷贝hadoop-slave2的公钥到hadoop-master中。

    此时vim /root/.ssh/authorized_keys 如下图所示:

在这里插入图片描述

将hadoop-master中的公钥发送至两台从节点。完成免密登陆配置。

如果authorized_keys不生效,再使用:ssh-copy-id -i root@ip_address

配置hadoop

hadoop安装目录:/opt/software/hadoop/hadoop-3.2.1
java目录:/opt/software/java/jdk1.8.0_181
版本:3.2.1
$HADOOP_HOME/etc/hadoop

在$HADOOP_HOME/etc/hadoop下包括hdfs-site.xml、core-site.xml、yarn-site.xml、mapred-site.xml、master、workers、hadoop-evn.xml。

配置文件修改可参照官方文档按需要配置,也可以参照网上基本配置(注意:hadoop版本不同,服务端口有变化,2.X与3.X相同页面服务,端口不同。master、workers文件名称亦有变化。自行查找配置)

初始镜像里没有hadoop和java的环境变量,是否需要配置?

配置hadoop

各文件部分已配置,修改一下
hadoop配置多机
以下修改操作均在hadoop-master上进行

修改hadoop-env.sh文件
export JAVA_HOME=/usr/local/src/jdk1.8 
export HADOOP_LOG_DIR=/data/hadoop_repo/logs/hadoop #添加这个
修改core-site.xml文件(不用改)
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop-master:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/tmp/hadoop</value>
    </property>
</configuration>
hdfs-site.xml(不用改,保持)
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop-master:9868</value>
    </property>
</configuration>
mapred-site.xml(不用改)
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
yarn-site.xml(部分修改)
<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.env-whitelist</name>
	<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop-master</value>
  </property>
</configuration>

修改workers文件(已有)
hadoop-slave1
hadoop-slave2

修改启动脚本

hadoop启动脚本修改

cd /opt/software/hadoop/hadoop-3.2.1/sbin

在这里插入图片描述

  1. start-dfs.sh,stop-dfs.sh(前者已有,后者需添加)添加以下:
    HDFS_DATANODE_USER=root
    HDFS_DATANODE_SECURE_USER=hdfs
    HDFS_NAMENODE_USER=root
    HDFS_SECONDARYNAMENODE_USER=root
    
  2. 修改start-yarn.sh,stop-yarn.sh
    YARN_RESOURCEMANAGER_USER=root
    HADOOP_SECURE_DN_USER=yarn
    YARN_NODEMANAGER_USER=root
    

格式化并启动hdfs

  1. 首先配一下环境变量source /etc/profile
  2. cd /opt/software/hadoop/hadoop-3.2.1/
  3. 格式化 hadoop namenode -format
  4. cd /opt/software/hadoop/hadoop-3.2.1/sbin

关闭防火墙

关闭防火墙
镜像里没防火墙,装上试试
(不装也打不开网页……)
resource

多种模式

在这里插入图片描述

单机模式

[本地模式环境搭建](https://blog.csdn.net/Yal_insist/article/details/123750149)
官方配置教程

测试例子

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount ./wcinput ./wcoutput

mkdir input
cp etc/hadoop/.xml input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar grep input output ‘dfs[a-z.]+’
$ cat output/

hadoop-mapreduce-examples-3.1.3.jar:一个案例,里面有多个函数
wordcount包中的其中一个功能
./wcinput输入文件
./wcoutput输出文件
都在本地,无需设置

问题1:找不到本地lib
解决1:设置环境变量

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_HOME=/home/hadoop/hadoop-3.2.1
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR:$HADOOP_HOME/share/hadoop"

解决了warn,但仍无法运行
报错:

java.io.IOException: Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the correspond server addresses.                                 
at org.apache.hadoop.mapreduce.Cluster.initialize(Cluster.java:116)                  
at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:109)
...
 at org.apache.hadoop.util.RunJar.run(RunJar.java:323)                                
 at org.apache.hadoop.util.RunJar.main(RunJar.java:236)

解决:添加配置:etc/hadoop/mapred-site.xml

<property>
       <name>mapreduce.application.classpath</name>
       <value>$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/mapreduce/lib/*</value>
</property>

问题3:datanode未启动
解决:hdfs --daemon start datanode

问题4:.InvalidInputException: Input path does not exist

hadoop fs -put wcintput /

上传成功了,但还是找不到。。。。
此时文件在:hdfs://hadoop-master:9000/wcinput

hadoop fs -put wcintput /user/root

上传成功了,这个是hadoop jar默认找的路径

以及因为没有成功关掉slave1和slave2中的nodemanager,此时是集群模式……
不是我以为的单机

宿主机连接容器网络

宿主机连接容器网络

  1. 找到宿主机中docker的网络:172.29.16.1 掩码未255.255.240.0
    在这里插入图片描述
  2. 在docker的设置中找到子网设置:设为172.29.16.0/28。和1的掩码一致
    在这里插入图片描述
  3. 管理员模式设置route:route -p ADD 192.168.0.0 MASK 255.255.255.240 172.29.16.2 注意这里的172.29.16.2
  4. 设置成功后,相当于docker0=172.29.16.1
    通过这个ip,可在宿主机中访问容器,在容器中访问宿主机,都是可以ping通这个ip的
  5. 在宿主机的网页中,此时可以访问页面了,前面创建时,已经设置了端口映射

http://172.29.16.1:8088/cluster
在这里插入图片描述
端口:
在这里插入图片描述

docker网络介绍
宿主机ssh访问容器:172.29.16.1:1022
需要添加端口映射-p 1022:22

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值