硬件环境:
虚拟机环境配置
硬件:1CPU + [RAM]4G + [DISK]128G
系统:Centos7 x64
这里没有像尚硅谷一样做地址映射解析,直接取IP(我太懒)
192.168.242.131 192.168.242.132 192.168.242.133
前置依赖环境:
前置环境准备(3台机器都需要):
sudo yum install -y net-tools sudo yum install -y vim sudo yum install -y wget sudo yum install -y lrzsz sudo yum install -y pcre pcre-devel sudo yum install -y zlib zlib-devel sudo yum install -y openssl openssl-devel sudo yum install -y unzip sudo yum install -y libtool sudo yum install -y gcc-c++ sudo yum install -y telnet sudo yum install -y tree sudo yum install -y nano sudo yum install -y psmisc sudo yum install -y rsync sudo yum install -y java-1.8.0-openjdk-devel.x86_64
1号机(192.168.242.131)的安装过程
下载Hadoop包(1号机,可以任意一台):
如果是其他版本,注意文件路径和脚本编写的时候,要及时替换过来
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
(可选)用scp命令传输到其他机器上备份:
# 例如1号机下载的,就需要传输到2号机和3号机 scp ~/hadoop-3.3.1.tar.gz root@192.168.242.132:/root/ scp ~/hadoop-3.3.1.tar.gz root@192.168.242.133:/root/
解包到指定【 opt/module/ 】目录(1号机)
mkdir -p /opt/module/ tar -zxvf hadoop-3.3.1.tar.gz -C /opt/module/
配置Hadoop + Jdk的环境变量(1号机)
vim /etc/profile.d/my_env.sh =====添加下面内容===== # HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-3.3.1 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin # JDK变量 JAVA_HOME export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64 export PATH=$PATH:$JAVA_HOME/bin
将环境变量加入进来,立即生效(1号机)
source /etc/profile
检查(1号机)是否安装成功?
hadoop version
3.3.1版本,我这里展示的信息
[root@localhost ~]# hadoop version Hadoop 3.3.1 Source code repository https://github.com/apache/hadoop.git -r a3b9c37a397ad4188041dd80621bdeefc46885f2 Compiled by ubuntu on 2021-06-15T05:13Z Compiled with protoc 3.7.1 From source with checksum 88a4ddb2299aca054416d6b7f81ca55 This command was run using /opt/module/hadoop-3.3.1/share/hadoop/common/hadoop-common-3.3.1.jar
集群部署的前置准备
一、编写集群分发脚本
在【 /usr/bin/ 】目录下面创建xsync命令脚本(1号机)
vim /usr/bin/xsync
脚本代码:
#!/bin/bash #1. 判断参数个数 if [ $# -lt 1 ] then echo Not Enough Arguement! exit; fi #2. 遍历集群所有机器 for host in 192.168.242.131 192.168.242.132 192.168.242.133 do echo ==================== $host ==================== #3. 遍历所有目录,挨个发送 for file in $@ do #4. 判断文件是否存在 if [ -e $file ] then #5. 获取父目录 pdir=$(cd -P $(dirname $file); pwd) #6. 获取当前文件的名称 fname=$(basename $file) ssh $host "mkdir -p $pdir" rsync -av $pdir/$fname $host:$pdir else echo $file does not exists! fi done done
注意 保存后需要给予【可执行】的权限
chmod +x /usr/bin/xsync
这里补充下信息
在视频演示和文档中放置的位置是在用户的bin目录下 ( /root/bin 非root用户是 /home/用户名/bin)
且不存在该目录,需要自行创建
原因是全局PATH变量有指向这个路径(猜测)
[root@localhost ~]# echo $PATH /usr/local/sbin:/usr/local/bin:
/usr/sbin:
/usr/bin:
/opt/module/hadoop-3.3.1/bin:
/opt/module/hadoop-3.3.1/sbin:
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/bin:
/root/bin
测试xsync命令是否可用?
把1号机配置的环境变量文件同步到其他机器上
xsync my_env.sh # sudo 执行时要求文件路径必须是完整的 sudo xsync /etc/profile.d/my_env.sh
此时每一次机器scp的传输都会要求输入登陆账号和密码,
传输完成后检查目标机器上路径是否存在这个文件
二、免登录处理—生成SSH密钥
切换到当前用户(root)目录下的.ssh隐藏目录(每一台机器都执行)
cd ~/.ssh
执行密钥生成命令
三个设置项都直接按回车确认 (每一台机器都执行)
ssh-keygen -t rsa
过程展示:
[root@localhost .ssh]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:3rFBbU4jq2Y6HepDVxJDZEwuldF1NpFzWTWn9Sgc/dQ root@localhost.localdomain The key's randomart image is: +---[RSA 2048]----+ | =B+ .o.=+X| | += .o ++*E| | . .oo B o=.| | ....* o .| | So+ . | | ..oo + | | . +=.o | | ++. | | .oo | +----[SHA256]-----+
生成之后的.ssh目录
[root@localhost .ssh]# ll -a 总用量 12 drwx------. 2 root root 57 1月 28 15:03 . dr-xr-x---. 4 root root 201 1月 28 14:33 .. -rw-------. 1 root root 1675 1月 28 15:03 id_rsa -rw-r--r--. 1 root root 408 1月 28 15:03 id_rsa.pub -rw-r--r--. 1 root root 531 1月 28 14:39 known_hosts
可以看到两个文件 【id_rsa】 和 【id_rsa.pub】
不带pub的是私钥,用于其他机器访问本机校验
pub后缀的就是公钥,用于登陆其他机器校验用的
known_hosts 文件是之前操作scp命令访问过其他机器的ip遗留的公钥信息
举个例子:
A、B 2台机器
A 想不输入密码就登陆B,B就需要知道A的账号信息,就需要把A的公钥放到B的机器中去
反之B登陆A就需要B的公钥在A里面存在
每台机器都需要其他机器的公钥,包括自己的
1号机的公钥给2号机和3号机,自己的加入到授权key中
ssh-copy-id 192.168.242.132 ssh-copy-id 192.168.242.133 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
2号机给1和3,自己加入
ssh-copy-id 192.168.242.131 ssh-copy-id 192.168.242.133 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
3号机同理
ssh-copy-id 192.168.242.131 ssh-copy-id 192.168.242.132 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
集群部署
一、资源规划
建议: NameNode \ ResourceManager \ SecondaryNameNode 三者独立机器部署
原因:硬件资源占用大
资源分配:
1号机 放 NameNode,2号机放 ResourceManager ,3号机放 SecondaryNameNode
二、配置文件编写(1号机)
首先备份需要更改的文件
cp -r $HADOOP_HOME/etc/hadoop/core-site.xml $HADOOP_HOME/etc/hadoop/core-site.xml.bak cp -r $HADOOP_HOME/etc/hadoop/hdfs-site.xml $HADOOP_HOME/etc/hadoop/hdfs-site.xml.bak cp -r $HADOOP_HOME/etc/hadoop/yarn-site.xml $HADOOP_HOME/etc/hadoop/yarn-site.xml.bak cp -r $HADOOP_HOME/etc/hadoop/mapred-site.xml $HADOOP_HOME/etc/hadoop/mapred-site.xml.bak
下面放开手脚改配置文件
1、core-site.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- 指定 NameNode 的地址 因为是集群地址,集群都指向这个地址节点 --> <property> <name>fs.defaultFS</name> <value>hdfs://192.168.242.131:8020</value> </property> <!-- 指定 hadoop 数据的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-3.3.1/data</value> </property> <!-- 配置 HDFS 网页登录使用的静态用户为 atguigu --> <property> <name>hadoop.http.staticuser.user</name> <value>root</value> </property> </configuration>
2、hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- nn web 端访问地址--> <property> <name>dfs.namenode.http-address</name> <value>192.168.242.131:9870</value> </property> <!-- 2nn web 端访问地址--> <property> <name>dfs.namenode.secondary.http-address</name> <value>192.168.242.133:9868</value> </property> </configuration>
3、mapred-site.xml
下面的环境变量似乎不需要添加...
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- 指定 MapReduce 程序运行在 Yarn 上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.3.1</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.3.1</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.3.1</value> </property> </configuration>
4、yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- 指定 MR 走 shuffle --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定 ResourceManager 的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>192.168.242.132</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> </configuration>
声明workers文件
注意workers文件不能有多余的空格和空行!
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers ===== 文件信息 ===== 192.168.242.131 192.168.242.132 192.168.242.133
然后同步到其他机器上面
xsync /opt/module/hadoop-3.3.1/etc/hadoop
Hadoop集群启动
因为没有像尚硅谷教程那样专门设置hadoop程序的专属执行用户
这里要对启动脚本增加执行参数
未设置则会出现这个错误,解决方案也是从这获取的
https://blog.csdn.net/hongxiao2016/article/details/88903289/
1号机打开脚本,在最头上加上这些信息( #!/usr/bin/env bash 的下面)
【/opt/module/hadoop-3.3.1/sbin/start-dfs.sh 】
【/opt/module/hadoop-3.3.1/sbin/stop-dfs.sh】
HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root
【/opt/module/hadoop-3.3.1/sbin/start-yarn.sh 】
【/opt/module/hadoop-3.3.1/sbin/stop-yarn.sh】
YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root
同步到其他机器上面:
xsync /opt/module/hadoop-3.3.1/sbin
然后由1号机启动hdfs,2号机启动yarn
1号机首次启动之前进行格式化处理:
hdfs namenode -format
启动HDFS
$HADOOP_HOME/sbin/start-dfs.sh
启动之后成功的信息:
[root@localhost ~]# /opt/module/hadoop-3.3.1/sbin/start-dfs.sh WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER. Starting namenodes on [192.168.242.131] 上一次登录:五 1月 28 18:30:20 CST 2022pts/1 上 Starting datanodes 上一次登录:五 1月 28 18:30:43 CST 2022pts/1 上 Starting secondary namenodes [192.168.242.133] 上一次登录:五 1月 28 18:30:45 CST 2022pts/1 上 [root@localhost ~]#
2号机启动YARN
$HADOOP_HOME/sbin/start-yarn.sh
启动后成功的信息:
[root@localhost ~]# /opt/module/hadoop-3.3.1/sbin/start-yarn.sh Starting resourcemanager 上一次登录:五 1月 28 18:30:38 CST 2022pts/0 上 Starting nodemanagers 上一次登录:五 1月 28 18:31:09 CST 2022pts/0 上 [root@localhost ~]#
访问之前关闭防火墙(所有机器执行)
systemctl stop firewalld
访问页面进行查看:
http://192.168.242.131:9870/explorer.html#/ http://192.168.242.132:8088/cluster