前情提要:因为mac上docker ping不通容器,后装了一个docker-mac-network进行转发,但是速度太慢,web界面都没办法打开,所以就没办法使用hdfs客户端,最后还是转投了parallel装虚拟机进行学习,大部分内容还是可以用的。
1.以centos7为基础创建centos7-ssh镜像
创建Dockerfile文件
vi Dockerfile
将如下内容写入Dockerfile
FROM centos:centos7
MAINTAINER wr
RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN yum install -y openssh-clients
RUN echo "root:123456" | chpasswd
RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
上述内容大概意思是:以centos镜像为基础,设置密码为123456,安装ssh服务并启动
构建Dockerfile(注意有个“点”)
docker build -t="centos7-ssh" .
将生成一个名为centos7-ssh的镜像,可以通过docker images查看'
2.准备好hadoop和jdk,以centos7-ssh为基础构建centos7-hadoop镜像
hadoop-2.10.1.tar.gz
jdk-8u281-linux-x64.tar.gz
创建新的Dockerfile
vi Dockerfile
将以下内容写入:
FROM centos7-ssh
ADD jdk-8u281-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_281 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
ADD hadoop-2.10.1.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.10.1 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH
RUN yum install -y which sudo
上述内容大概意思是:以上面生成的centos7-ssh为基础,将hadoop和jdk包放进去,然后配好环境变量。
构建Dockerfile
将生成一个名为hadoop的镜像
3.配置docker网桥,启动镜像
1.创建网络
docker network create --driver bridge bridge_hadoop
以上命令创建了一个名为hadoop-br的bridge类型的网络
2.启动docker时指定网络
docker run -itd --network bridge_hadoop --name hadoop1 -p 50070:50070 -p 8088:8088 hadoop
docker run -itd --network bridge_hadoop --name hadoop2 hadoop
docker run -itd --network bridge_hadoop --name hadoop3 hadoop
以上命令启动了3台机器,网络都指定为bridge_hadoop,hadoop1还开启了端口映射。
3.查看网络情况
docker network inspect bridge_hadoop
4.登录docker容器,互相之间就可以ping通了。
docker exec -it hadoop1 /bin/bash
docker exec -it hadoop2 /bin/bash
docker exec -it hadoop3 /bin/bash
4.配置host及ssh免密登录
1.分别在每台修改每台机器的host
vi /etc/hosts
将以下内容写入(注:docker分出来的ip对于每个人可能不一样,填你自己的):
${ip1} hadoop1
${ip1} hadoop2
${ip1} hadoop3
2.因为上面在镜像中已经安装了ssh服务,所以直接分别在每台机器上执行以下命令:
ssh-keygen
一路回车
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop1
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop2
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop3
3.测试是否配置成功
ping hadoop1
ping hadoop2
ping hadoop3
ssh hadoop1
ssh hadoop2
ssh hadoop3
5.配置hadoop
1.创建一些文件夹,一会在配置中要用到
mkdir /home/hadoop
mkdir /home/hadoop/tmp /home/hadoop/hdfs_name /home/hadoop/hdfs_data
2.切换到hadoop配置的目录
cd $HADOOP_HOME/etc/hadoop/
3.编辑core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131702</value>
</property>
4.编辑hdfs-site.xml
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/hdfs_name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/hdfs_data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop1:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
5.编辑mapred-site.xml
mapred-site.xml默认不存在,要执行
cp mapred-site.xml.template mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop1:19888</value>
</property>
6.编辑yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop1:8088</value>
</property>
7.编辑slaves
我这里把hadoop1当成主节点,hadoop2、3作为从节点
hadoop2
hadoop3
8.把文件拷贝到hadoop2和hadoop3上
依次执行以下命令:
scp -r $HADOOP_HOME/ hadoop2:/usr/local/
scp -r $HADOOP_HOME/ hadoop3:/usr/local/
scp -r /home/hadoop hadoop2:/
scp -r /home/hadoop hadoop3:/
9.分别连接每台机器,配置hadoop sbin目录的环境变量
docker exec -it hadoop1 bash
docker exec -it hadoop2 bash
docker exec -it hadoop3 bash
因为hadoop bin目录在之前创建镜像时就配好了,但是sbin目录没有配,所以要单独配置。分配为每台机器配置:
vi ~/.bashrc
追加如下内容:
export PATH=$PATH:$HADOOP_HOME/sbin
执行:
source ~/.bashrc
6.启动
在hadoop1上执行以下命令:
格式化hdfs
hdfs namenode -format
一键启动
start-all.sh
不出错的话,就可以庆祝一下了。
Hadoop启动报Error: JAVA_HOME is not set and could not be found解决办法
修改/etc/hadoop/hadoop-env.sh中设JAVA_HOME。
应当使用绝对路径。
export JAVA_HOME=$JAVA_HOME //错误,不能这么改
export JAVA_HOME=/usr/java/jdk1.6.0_45 //正确,应该这么改
测试使用hadoop
jps
# hadoop1
1748 Jps
490 NameNode
846 ResourceManager
686 SecondaryNameNode
# hadoop2
400 DataNode
721 Jps
509 NodeManager
# hadoop3
425 NodeManager
316 DataNode
591 Jps
上传文件
hdfs dfs -mkdir /mwf
echo hello > a.txt
hdfs dfs -put a.txt /mwf
hdfs dfs -ls /mwf
Found 1 items
drwxr-xr-x - root supergroup 0 2020-09-04 11:14 /mwf
7.运行wordcount
把license作为需要统计的文件
root@h01:/usr/local/hadoop# cat LICENSE.txt > file1.txt
root@h01:/usr/local/hadoop# ls
在 HDFS 中创建 input 文件夹
root@h01:/usr/local/hadoop/bin# ./hadoop fs -mkdir /input
root@h01:/usr/local/hadoop/bin#
上传 file1.txt 文件到 HDFS 中
root@h01:/usr/local/hadoop/bin# ./hadoop fs -put ../file1.txt /input
root@h01:/usr/local/hadoop/bin#
查看 HDFS 中 input 文件夹里的内容
root@h01:/usr/local/hadoop/bin# ./hadoop fs -ls /input
Found 1 items
-rw-r--r-- 2 root supergroup 150569 2019-03-19 11:13 /input/file1.txt
root@h01:/usr/local/hadoop/bin#
运作 wordcount 例子程序
root@h01:/usr/local/hadoop/bin# ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.0.jar wordcount /input /output