先把坑放在着,大家注意踩一下

1、修改浏览器所在系统的host文件 Mac可以安装 switchhosts 配置系统的hosts 127.0.0.1 hadoop001 127.0.0.1 hadoop002 127.0.0.1 hadoop003 2、启动doker容器时尽量暴露相关的必要端口 docker run -it —network hadoop -h hadoop003 —name “hadoop003” -p 9868:9868 modelhadoop:2.0 /bin/bash docker run -it —network hadoop -h hadoop002 —name “hadoop002” —iptables false -p 8088:8088 -p 9864:9864 modelhadoop:2.0 /bin/bash docker run -it —network hadoop -h hadoop001 —name “hadoop001” —iptables false -p 9870:9870 -p 19888:19888 -p 9866:9866 -p 9820:9820 -p 10020:10020 -p 8042:8042 modelhadoop:2.0 /bin/bash -v /Users/iflytek/Documents/dockersoft:/usr/local/software docker run -d —name centos7 —privileged=true modelhadoop:2.0 /usr/sbin/init 3、集群中三个节点主要部署方式 hadoop001 hadoop002 hadoop003 NameNode DataNode SecondaryNameNode DataNode NodeManager DataNode NodeManager ResourceManager NodeManager historyserver

一、准备服务器镜像

1、docker镜像仓库地址,可以在这里检索你所需要的镜像版本,本次集群搭建使用是的centos7.5 https://hub.docker.com/

  1. docker pull centos:7.5.1804

2、为hadoop集群单独构建虚拟网络

  1. docker network create --driver=bridge hadoop

3、查看 Docker 中的网络

  1. docker network ls
  2. NETWORK ID NAME DRIVER SCOPE
  3. e1b9158cfb33 bridge bridge local
  4. 4f6e1564b511 hadoop bridge local
  5. dab2ec29b3c6 host host local
  6. bd255529ccad none null local

4、查看已经下载的镜像

  1. iflytek@iflytek ~ % dodocker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. modelhadoop 2.0 dd78b33dfe4a 17 hours ago 1.87GB
  4. docker/desktop-git-helper 5a4fca126aadcd3f6cc3a011aa991de982ae7000 efe2d67c403b 7 months ago 44.2MB
  5. centos centos7.5.1804 cf49811e3cdb 2 years ago 200MB
  6. redis 3.2 87856cc39862 3 years ago 76MB

5、根据镜像启动一个容器,可以看出 shell 已经是容器的 shell 了(第二行开头,已经是root用户了):

  1. iflytek@iflytek ~ % docker run -it centos:centos7.5.1804 /bin/bash
  2. [root@a605e443c2b7 /]#

6、退出虚拟机:输入exit

  1. [root@a605e443c2b7 /]# exit
  2. exit
  3. iflytek@iflytek ~ %

二、安装JDK和hadoop

1、启动容器

由于镜像中不包含wget,也没有预先安装sshd,传统的scp与http方式均无法传输,需要通过bind mount的方式启动镜像,来完成文件传输.
此处使用本机的/Users/iflytek/Documents/dockersoft目录

  1. docker run -it --name hadoop -v /Users/iflytek/Documents/dockersoft:/usr/local/software modelhadoop:2.0

2、软件安装

将软件包放置到/Users/iflytek/Documents/dockersoft可以在容器/usr/local/software看到对应安装包
目录规划:

  1. /usr/local/bigdata/jdk 作为jdk目录
  2. /usr/local/bigdata/hadoop hadoop的目录 包含jar 启动脚本 hadoop配置等
  3. /usr/local/bigdata/logs 存放日志,方便查阅 这个后边用hadoop用户创建

解压软件包:

  1. ## 创建目录并拷贝软件包
  2. mkdir /usr/local/bigdata
  3. cp /usr/local/software /usr/local/bigdata
  4. cd /usr/local/bigdata
  5. ## 解压后重命名
  6. tar -zxvf hadoop-3.1.3.tar.gz
  7. tar -zxvf jdk-8u161-linux-x64.tar.gz
  8. mv hadoop-3.1.3 hadoop
  9. mv jdk1.8.0_281/ jdk
  10. ## 清理安装包 减小容器大小
  11. rm -f hadoop-3.1.3.tar.gz
  12. rm -f jdk-8u161-linux-x64.tar.gz

三、安装SSHD和network_tools

hadoop节点间通过ssh操作,默认镜像中并不包含sshd服务,因为需要安装.

  1. yum update
  2. #一路Y回车.更新完yum后安装sshd
  3. yum install -y openssl openssh-server
  4. yum install openssh*
  5. #一路回车,创建密钥并启动ssh服务
  6. ssh-keygen -t rsa
  7. ssh-keygen -t dsa
  8. ssh-keygen -t ecdsa
  9. ssh-keygen -t ed25519
  10. cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

修改sshd的配置文件:

  1. vi /etc/ssh/sshd_config

修改部分为:

  1. ### 原内容
  2. HostKey /etc/ssh/ssh_host_rsa_key
  3. HostKey /etc/ssh/ssh_host_ecdsa_key
  4. HostKey /etc/ssh/ssh_host_ed25519_key
  5. ### 修改为
  6. HostKey /root/.ssh/id_rsa
  7. HostKey /root/.ssh/id_ecdsa
  8. HostKey /root/.ssh/id_ed25519
  9. HostKey /root/.ssh/id_dsa

允许远程登陆:

  1. vi /etc/pam.d/sshd
  2. # 使用#注释掉此行
  3. # account required pam_nologin.so

启动sshd服务并查看状态:

  1. /usr/sbin/sshd
  2. ps -ef | grep sshd
  3. root 411 1 0 05:02 ? 00:00:00 /usr/sbin/sshd
  4. root 8168 8038 0 08:04 pts/7 00:00:00 grep --color=auto sshd

安装net-tools

  1. yum install net-tools

四、配置服务器环境变量以及hadoop核心配置文件

1、环境变量配置

  1. vi ~/.bash_profile
  2. 替换内容如下
  3. # .bashrc
  4. # Source global definitions
  5. if [ -f /etc/bashrc ]; then
  6. . /etc/bashrc
  7. fi
  8. # User specific environment
  9. if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
  10. then
  11. PATH="$HOME/.local/bin:$HOME/bin:$PATH"
  12. fi
  13. export JAVA_HOME=/usr/local/bigdata/jdk
  14. export CLASSPATH=$JAVA_HOME/lib
  15. export PATH=$PATH:$JAVA_HOME/bin
  16. # hadoop env
  17. export HADOOP_HOME=/usr/local/bigdata/hadoop
  18. export HADOOP_COMMON_HOME=$HADOOP_HOME
  19. export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  20. export HADOOP_COMMON_HOME=$HADOOP_HOME
  21. export HADOOP_HDFS_HOME=$HADOOP_HOME
  22. export HADOOP_MAPRED_HOME=$HADOOP_HOME
  23. export HADOOP_YARN_HOME=$HADOOP_HOME
  24. export HADOOP_INSTALL=$HADOOP_HOME
  25. export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
  26. export HADOOP_LIBEXEC_DIR=$HADOOP_HOME/libexec
  27. #export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
  28. #export HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop
  29. export HDFS_DATANODE_USER=root
  30. export HDFS_DATANODE_SECURE_USER=root
  31. export HDFS_SECONDARYNAMENODE_USER=root
  32. export HDFS_NAMENODE_USER=root
  33. export YARN_RESOURCEMANAGER_USER=root
  34. export YARN_NODEMANAGER_USER=root
  35. PATH=$PATH:$HOME/bin
  36. export PATH
  37. # Uncomment the following line if you don't like systemctl's auto-paging feature:
  38. # export SYSTEMD_PAGER=
  39. # User specific aliases and functions

:wq保存,更新环境变量
source ~/.bash_profile

2、配置Hadoop环境(重点来了)

Hadoop配置中,有5个文件是重点配置的,分别是:core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、workers,下面就一个个开始配置:
hadoop相关组件的配置文件所在目录如下:/usr/local/bigdata/hadoop/etc/hadoop
WX20220228-171039.png

1、修改core-site.xml

  1. <configuration>  <!--指定nameNode的地址-->
  2. <property>
  3. <name>fs.defaultFS</name>
  4. <value>hdfs://hadoop001:8020</value>
  5. </property>
  6.   <!--指定Hadoop数据的存储目录-->
  7. <property>
  8. <name>hadoop.tmp.dir</name>
  9. <value>/usr/local/bigdata/hadoop/data</value>
  10. </property>
  11.   <!--配置HDFS网页登陆使用的静态用户,配置这个之后才有权限可以在网页端删除文件、文件夹-->
  12. <property>
  13. <name>hadoop.http.staticuser.user</name>
  14. <value>root</value>
  15. </property>
  16. </configuration>

2、修改 hadoop-env.sh 文件,在文件末尾添加以下信息(JAVA_HOME根据自己的修改)

  1. export JAVA_HOME=/usr/local/bigdata/jdk
  2. export HDFS_NAMENODE_USER=root
  3. export HDFS_DATANODE_USER=root
  4. export HDFS_SECONDARYNAMENODE_USER=root
  5. export YARN_RESOURCEMANAGER_USER=root
  6. export YARN_NODEMANAGER_USER=root

3、修改hdfs-site.xml,修改为:

  1. <configuration>  <!--文件的存储个数-->
  2. <property>
  3. <name>dfs.replication</name>
  4. <value>3</value>
  5. </property>  <!--nn web端访问地址,使用网页访问HDFS文件系统就是这个端口-->
  6. <property>
  7. <name>dfs.namenode.http-address</name>
  8. <value>hadoop001:9870</value>
  9. </property>  <!--2nn web端访问地址-->
  10. <property>
  11. <name>dfs.namenode.secondary.http-address</name>
  12. <value>hadoop001:9868</value>
  13. </property>  <!--网页查看HDFS文件内容,出现Couldnt preview the file报错,需要配置的参数-->
  14. <property>
  15. <name>dfs.webhdfs.enabled</name>
  16. <value>true</value>
  17. </property>
  18. </configuration>

4、修改mapred-site.xml,修改为

  1. <configuration>  <!--指定MapReduce程序运行在Yarn上-->
  2. <property>
  3. <name>mapreduce.framework.name</name>
  4. <value>yarn</value>
  5. </property>
  6. </configuration>

5、修改yarn-site.xml,修改为

  1. <configuration>
  2.   <!--指定MR shuffle-->
  3. <property>
  4. <name>yarn.nodemanager.aux-services</name>
  5. <value>mapreduce_shuffle</value>
  6. </property>
  7.   <!--指定ResourceManager的地址-->
  8. <property>
  9. <name>yarn.resourcemanager.hostname</name>
  10. <value>hadoop001</value>
  11. </property>
  12.   <!--环境变量的继承-->
  13. <property>
  14. <name>yarn.nodemanager.env-whitelist</name>
  15. <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
  16. </property>
  17. </configuration>

6、修改workers,修改为:

  1. hadoop001
  2. hadoop002
  3. hadoop003

注意:hadoop001这些后面不要有空格!hadoop003后面,不要有空的行!自己准备起多少集群,就在这里写几个,要是准备起5个集群,就写到hadoop005。

五、docker中启动集群

1、先将当前容器 导出为镜像(使用自己的centos容器id),并查看当前镜像

image.png

2、启动3个终端(注意,是要开3个终端!!!)

  • 第一条命令启动的是 hadoop001 是做 master 节点的,所以暴露了端口,以供访问 web 页面

    1. docker run -it --network hadoop -h hadoop001 --name "hadoop001" -p 9870:9870 -p 19888:19888 -v /Users/iflytek/Documents/dockersoft:/usr/local/software hadoop001:2.0 /bin/bash
  • 后面几条命令就基本类似,第二条命令

    1. docker run -it --network hadoop -h hadoop002 --name "hadoop002" -p 8088:8088 -pm 8032:8032 hadoop001:2.0 /bin/bash
  • 第三条命令

    1. docker run -it --network hadoop -h hadoop003 --name "hadoop003" modelhadoop /bin/bash

    3、在 hadoop001主机中,启动 Haddop 集群

  • 先进行格式化操作,不格式化操作,hdfs起不来:

    1. [root@hadoop001 hadoop]# ./bin/hdfs namenode -format
  • 然后启动HDFS集群:

    1. [root@hadoop001 hadoop]# ./sbin/start-dfs.sh
  • 最后,启动yarn集群管理节点:

    1. [root@hadoop001 hadoop]# ./sbin/start-yarn.sh
  • 都启动完成后,使用 jps 命令查看:

    1. [root@hadoop001 hadoop]# jps
    2. 7328 NodeManager
    3. 8336 Jps
    4. 2709 NameNode
    5. 3084 SecondaryNameNode
    6. 2876 DataNode
    7. 7181 ResourceManager

    可以看到,除了Jps,一共有5个进程,因为这里没有将 nameNode、ResourceManager、SecondaryNameNode分开部署,所以都在 h01这一台机器上,实际生产中,应该是需要分开部署的。
    至此,Hadoop 集群已经构建好了。

    六、网页访问、Hadoop命令

    1.浏览器访问本机的9870端口,可以看到Hadoop的文件管理系统:

    hadoop.png

2.浏览器访问本机的8088端口,可以看到Hadoop中 Yarn的资源调度系统:

yarn.png

3.在 HDFS 中创建 input 文件夹:

hdfs.png

4、上传文件

  1. [root@hadoop001 hadoop]# ls
  2. LICENSE.txt NOTICE.txt README.txt bin data etc include lib libexec logs sbin share
  3. [root@hadoop001 hadoop]# ./bin/hadoop fs -put ./README.txt /input