Hadoop 集群部署实训任务单(学生用) ================================================================ 姓名:____________ 班级:____________ 学号:____________ 日期:__________ 实验环境:3 台 CentOS 7 虚拟机 master01 / worker01 / worker02 IP 依次为 192.168.137.211 / 192.168.137.212 / 192.168.137.213 三台统一使用 root 用户登录(密码 123456),root 可以直接改系统配置, 不需要加 sudo Hadoop 版本:3.1.1(安装包 hadoop-3.1.1.tar.gz 已放在 /opt 下) JDK:OpenJDK 1.8(用 yum 安装,机房用本地源,不需要联网) 实验目标:把伪分布式部署里学过的步骤,在三台机器上完整做一遍, 得到一个可以正常运行的 Hadoop 集群。 最终形态:master01 上跑 NameNode + SecondaryNameNode + ResourceManager, worker01 / worker02 上各跑 DataNode + NodeManager,副本数为 2。 【操作前先熟悉终端】 · 页面上方 master01 / worker01 / worker02 是三个标签,点一下切换机器。 · Tab 补全命令和文件名;↑ ↓ 翻历史命令;Ctrl+L 清屏;Ctrl+C 中断。 · vim 打开编辑窗口后:按 i 进入插入模式 → 改内容 → Esc → 输入 :wq 回车保存退出。 也可以直接用鼠标在窗口里编辑,改完点【:wq 保存并退出】。 · 想跳到另一台机器上操作,就在终端里输入 ssh worker01,返回用 exit。 · 页面左侧任务清单会自动打勾,做完一项看一眼对不对。 · 命令不要求跟书上逐字一样,做出同样的效果就算完成 (例如 hostname master01 和 hostnamectl set-hostname master01 都算对)。 ================================================================ 一、操作系统准备 ================================================================ 任务 1 配置 IP 地址(先核对,错了再改) 查看网卡:ip a 编辑配置:vim /etc/sysconfig/network-scripts/ifcfg-ens192 三台机器分别写自己的 IP(出厂已经配好,核对无误即可): master01:IPADDR=192.168.137.211 worker01:IPADDR=192.168.137.212 worker02:IPADDR=192.168.137.213 文件里这几行必须是: BOOTPROTO=static ONBOOT=yes NETMASK=255.255.255.0 GATEWAY=192.168.137.2 NAME=ens192 DEVICE=ens192 改完重启网络:systemctl restart network 验证:ip a 能看到自己的 IP 任务 2 生成 SSH 密钥(三台机器都做) ssh-keygen -t rsa 一路回车 验证:ls -l /root/.ssh 能看到 id_rsa 和 id_rsa.pub,id_rsa 权限是 600 任务 3 分发公钥,配置免密登录 在 master01 上执行(三条都要做,写 IP 或主机名都可以): ssh-copy-id 192.168.137.211 ssh-copy-id 192.168.137.212 ssh-copy-id 192.168.137.213 验证:master01 上执行 ssh worker01 hostname,不再需要密码,返回 worker01 思考:为什么 Hadoop 的启动脚本 start-all.sh 必须依赖免密登录? (提示:它要用 ssh 到 workers 里列的每台机器上启动进程) 任务 4 修改主机名(每台机器改成自己的名字) hostnamectl set-hostname master01 ← master01 上执行 hostnamectl set-hostname worker01 ← worker01 上执行 hostnamectl set-hostname worker02 ← worker02 上执行 验证:hostname 应该显示刚设置的名字 说明:写成 hostname master01 也算完成。 任务 5 配置主机名与 IP 的映射(在 master01 上写) vim /etc/hosts 在文件末尾加上下面三行: 192.168.137.211 master01 192.168.137.212 worker01 192.168.137.213 worker02 小提示:vim 里按 i 进入插入模式,粘完按 Esc,再输入 :wq 回车保存。 任务 6 把 /etc/hosts 分发给另外两台 scp /etc/hosts worker01:/etc/hosts scp /etc/hosts worker02:/etc/hosts 验证(书上就是你写一条我 ping 一条): ping master01 ← 3 个包自动停,看 0% packet loss ping worker01 ping worker02 (想指定包数也可以写 ping -c 2 worker01) 思考:ping 通能说明端口也通吗?试着 telnet worker01 9000 看看防火墙开着和关着有什么不同。 任务 7 禁用 SELinux(三台机器都做) vim /etc/selinux/config 把 SELINUX=enforcing 改成 SELINUX=disabled 验证:getenforce 显示 Permissive 或 Disabled(改完重启彻底生效:reboot) 任务 8 关闭防火墙(三台机器都做) systemctl stop firewalld systemctl disable firewalld ← 禁止开机自启,很重要 验证:systemctl status firewalld 或 firewall-cmd --state 显示 not running 思考:为什么这两步(SELinux + 防火墙)不做,后面 Hadoop 各进程之间就互相连不上? 任务 9 配置时间同步 chrony(三台机器都做) master01 做时间服务器:vim /etc/chrony.conf,加上一行 allow 192.168.137.0/24 worker01、worker02 从 master01 同步:vim /etc/chrony.conf,加上一行 server master01 iburst 三台都重启并设置开机自启: systemctl restart chronyd systemctl enable chronyd 验证:chronyc sources (worker 上能看到 master01 这一行) ================================================================ 二、部署 Hadoop 集群 ================================================================ 本部分把 Hadoop 装好并配置成集群。 除了【任务 10 安装 JDK】要在三台机器都做之外,任务 11~17 以及任务 19 全部**只在 master01 上完成**(只维护一份配置),到【任务 18】再把这个配好的 /opt/hadoop 目录整体分发到 worker01、worker02,三台的程序与配置就一致了。 所以下面任务 12~17、19 的 vim 命令都不需要切到 worker 上重复做。 任务 10 安装 JDK(三台机器都做,机房用本地 yum 源) yum install -y java-1.8.0-openjdk* 验证:java -version 显示 1.8.0_362 /usr/lib/jvm/java 就是后面 JAVA_HOME 要写的路径 注意:JAVA_HOME 写错、被注释掉、或者忘了 source /etc/profile, 后面启动都会报 "JAVA_HOME is not set and could not be found.", 考试和真机上都常见。 任务 11 在 master01 上解压 Hadoop 到 /opt/hadoop cd /opt/ tar -zxvf hadoop-3.1.1.tar.gz mv hadoop-3.1.1 /opt/hadoop 验证:ls /opt/hadoop/etc/hadoop 任务 12 修改 hadoop-env.sh(只在 master01 上做) vim /opt/hadoop/etc/hadoop/hadoop-env.sh 要保证下面这些行是生效的(不能带 # 注释): export JAVA_HOME=/usr/lib/jvm/java export HADOOP_HOME=/opt/hadoop export HDFS_NAMENODE_USER="root" export HDFS_DATANODE_USER="root" export HDFS_SECONDARYNAMENODE_USER="root" export YARN_RESOURCEMANAGER_USER="root" export YARN_NODEMANAGER_USER="root" (最后 5 个 USER 变量是 Hadoop 3 启动脚本必需的,缺了会报 "which: no root in ..." 之类的错) 任务 13 修改 core-site.xml(只在 master01 上做) —— 告诉客户端 NameNode 在哪 vim /opt/hadoop/etc/hadoop/core-site.xml fs.defaultFS = hdfs://master01:9000 hadoop.tmp.dir = /hadoop/namenode/tmp 任务 14 修改 hdfs-site.xml(只在 master01 上做) —— HDFS 的关键参数 vim /opt/hadoop/etc/hadoop/hdfs-site.xml dfs.name.dir = /hadoop/namenode/data dfs.data.dir = /hadoop/datanode/data01,/hadoop/datanode/data02 dfs.replication = 2 dfs.namenode.secondary.http-address = master01:50090 说明:只有两个 Worker 做 DataNode,所以副本数写 2。 任务 15 修改 yarn-site.xml(只在 master01 上做) —— ResourceManager 与 NodeManager vim /opt/hadoop/etc/hadoop/yarn-site.xml yarn.resourcemanager.hostname = master01 yarn.nodemanager.aux-services = mapreduce_shuffle yarn.application.classpath = /opt/hadoop/etc/hadoop:/opt/hadoop/share/hadoop/common/lib/*:/opt/hadoop/share/hadoop/common/*:/opt/hadoop/share/hadoop/hdfs:/opt/hadoop/share/hadoop/hdfs/lib/*:/opt/hadoop/share/hadoop/hdfs/*:/opt/hadoop/share/hadoop/mapreduce/lib/*:/opt/hadoop/share/hadoop/mapreduce/*:/opt/hadoop/share/hadoop/yarn:/opt/hadoop/share/hadoop/yarn/lib/*:/opt/hadoop/share/hadoop/yarn/* 提示:上面 classpath 这一行就是 hadoop classpath 命令的输出,**整行一起复制**即可, 注意别漏掉中间任何一段,也别漏掉每段结尾的 *(漏了会导致容器起不来)。 在平台里也可以先敲一次 hadoop classpath,对照输出确认。 任务 16 修改 mapred-site.xml(只在 master01 上做) —— 让 MapReduce 跑在 YARN 上 vim /opt/hadoop/etc/hadoop/mapred-site.xml mapreduce.framework.name = yarn 任务 17 修改 workers(只在 master01 上做) —— DataNode 启动列表 vim /opt/hadoop/etc/hadoop/workers 两行: worker01 worker02 注意:master01 不做 DataNode,所以这里不写 master01; 写错了就只有一部分机器会起来。 任务 18 把配好的 Hadoop 分发到两台 worker scp -r /opt/hadoop worker01:/opt/ scp -r /opt/hadoop worker02:/opt/ 验证:在 worker01 上 cat /opt/hadoop/etc/hadoop/hdfs-site.xml 确认内容一致 任务 19 配置 /etc/profile 环境变量(只在 master01 上做) vim /etc/profile,在文件末尾加上: export HADOOP_HOME=/opt/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin 让配置生效:source /etc/profile 验证:which hadoop 应指向 /opt/hadoop/bin/hadoop 注意:和任务 12~17 一样,这一份只在 master01 上配一次即可, **不需要**再切到 worker01、worker02 上重复做。 ================================================================ 三、启动 Hadoop 集群 ================================================================ 任务 20 格式化 NameNode(只在 master01 执行一次!) hadoop namenode -format 看到 "successfully formatted" 才算成功 注意:格式化只能做一次,重复格式化会把集群数据清掉。 想重新来过,先把 /hadoop 目录删掉再格式化。 任务 21 启动集群 在 master01 上执行: /opt/hadoop/sbin/start-all.sh (直接写 start-all.sh 也可以) 它做的事:用 ssh 到 workers 里列的每台机器启动 DataNode、NodeManager, 并在本机启动 NameNode、SecondaryNameNode、ResourceManager。 停止集群:stop-all.sh 任务 22 验证集群(把结果写到下面的横线上) jps —— 在每台机器上执行,记录看到的进程: master01:______________________________________________ worker01:______________________________________________ worker02:______________________________________________ hdfs dfsadmin -report —— Live datanodes 个数 = ________ yarn node -list —— Total Nodes = ________ 在 HDFS 上建目录并上传文件,验证真的能用: hdfs dfs -mkdir -p /test echo "hello hadoop cluster" > /root/hello.txt hdfs dfs -put /root/hello.txt /test hdfs dfs -ls /test 结果:______________________________________________ 打开浏览器(模拟器右侧拓扑图能看到端口状态): NameNode Web UI : http://master01:50070 YARN Web UI : http://master01:8088 (真机上如果打不开,先确认防火墙已关闭、主机名能解析) ================================================================ 【思考题】 1. 伪分布式只需要一台机器,为什么集群部署必须先配 /etc/hosts 和 SSH 免密? 2. 如果 workers 文件里漏写了 worker02,start-all.sh 会有什么现象? (可以故意改错试试,然后看 hdfs dfsadmin -report 的 Live datanodes 数量) 3. dfs.replication = 2 但只有 1 台 DataNode 在线会怎样?集群会报什么告警? 4. core-site.xml 里的 fs.defaultFS 写成 hdfs://worker01:9000 会有什么后果? 5. 为什么必须"先格式化 NameNode,再启动集群"?顺序反了会报什么错? 6. hadoop-env.sh 里那 5 个 *_USER 变量如果不写,启动时会报什么错?为什么? 【提交】 页面右上角【提交检查】→ 看分数和逐项报告 → 【导出报告】保存 txt 交给老师。 自评:我完成了 ______ / 22 项,得分 ______ 分。