本地机器: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
- 下载java:java
- id获取:
docker ps
- java复制到虚拟机中:5016972d8541是id
docker cp C:\Users\wxl\Downloads\jdk-8u333-linux-x64.tar.gz 5016972d8541:/software
- 解压
tar -zxvf jdk-8u65-linux-x64.tar.gz
- 环境变量
2. 网络问题和创建容器
macos
windows
- hadoop镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/san-namespaces/san-registry:hadoop-3.2.1
- 创建自定义网络
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
- 创建容器
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文件中开启:```pythonPubkeyAuthentication yes```
2. 重启ssh服务```pythonsystemctl restart sshd.service```
3. 创建ssh key```pythonssh-keygen -t rsa```
连续回车,最终会在/root/.ssh目录下生成id_rsa和 id_rsa.pub文件。
上述操作每台机器执行一次(1-3)4. 合并公钥
登陆hadoop-master,在/root/.ssh目录下执行以下命令,将a0的公钥追加到authorized_keys文件中(如果authorized_keys不存在会新建):```pythoncat id_rsa.pub>> authorized_keys```将hadoop-slave1的公钥加到hadoop-master中。```pythonssh 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://img-blog.csdnimg.cn/4292ab36bf104942be2a19fe05d96b81.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
- start-dfs.sh,stop-dfs.sh(前者已有,后者需添加)添加以下:
HDFS_DATANODE_USER=root HDFS_DATANODE_SECURE_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root
- 修改start-yarn.sh,stop-yarn.sh
YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root
格式化并启动hdfs
- 首先配一下环境变量
source /etc/profile
cd /opt/software/hadoop/hadoop-3.2.1/
- 格式化
hadoop namenode -format
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
- 下载java:java
- id获取:
docker ps
- java复制到虚拟机中:5016972d8541是id
docker cp C:\Users\wxl\Downloads\jdk-8u333-linux-x64.tar.gz 5016972d8541:/software
- 解压
tar -zxvf jdk-8u65-linux-x64.tar.gz
- 环境变量
2. 网络问题和创建容器
macos
windows
- hadoop镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/san-namespaces/san-registry:hadoop-3.2.1
- 创建自定义网络
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
- 创建容器
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
- 修改密码
passwd root
- 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
配置机器间免密登陆
- 修改ssh配置
/etc/ssh/sshd_config文件中开启:PubkeyAuthentication yes
- 重启ssh服务
systemctl restart sshd.service
- 创建ssh key
ssh-keygen -t rsa
连续回车,最终会在/root/.ssh目录下生成id_rsa和 id_rsa.pub文件。
上述操作每台机器执行一次(1-3)
-
合并公钥
登陆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
- start-dfs.sh,stop-dfs.sh(前者已有,后者需添加)添加以下:
HDFS_DATANODE_USER=root HDFS_DATANODE_SECURE_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root
- 修改start-yarn.sh,stop-yarn.sh
YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root
格式化并启动hdfs
- 首先配一下环境变量
source /etc/profile
cd /opt/software/hadoop/hadoop-3.2.1/
- 格式化
hadoop namenode -format
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,此时是集群模式……
不是我以为的单机
宿主机连接容器网络
宿主机连接容器网络
- 找到宿主机中docker的网络:172.29.16.1 掩码未255.255.240.0
- 在docker的设置中找到子网设置:设为172.29.16.0/28。和1的掩码一致
- 管理员模式设置route:
route -p ADD 192.168.0.0 MASK 255.255.255.240 172.29.16.2
注意这里的172.29.16.2 - 设置成功后,相当于docker0=172.29.16.1
通过这个ip,可在宿主机中访问容器,在容器中访问宿主机,都是可以ping通这个ip的 - 在宿主机的网页中,此时可以访问页面了,前面创建时,已经设置了端口映射
http://172.29.16.1:8088/cluster
端口:
docker网络介绍
宿主机ssh访问容器:172.29.16.1:1022
需要添加端口映射-p 1022:22