一、准备三台服务器并修改hosts文件
进入服务器,输入以下命令
vim /etc/hosts
在文件后面添加服务器的ip及其对应的映射名
190.*.1 hadoop1
190.*.2 hadoop2
190.*.3 hadoop3
注意:若不进行此项配置,进入hdfs的UI界面后会只有一个datanode
二、服务器操作
(一)安装jdk(三台都需要)
自己根据网络教程(Linux下jdk的安装与环境变量配置)去下载安装,配置环境变量(略)
检查路径jdk是否安装成功,键入命令:java -version
如果出现了版本信息,则恭喜配置成功;
(二)安装SSH服务(三台都需要下载ssh)
1.查看有无ssh
输入”ssh -V“,若返回ssh版本号则有ssh :
[root@01 bin]# ssh -V
OpenSSH_8.0p1, OpenSSL 1.1.1k FIPS 25 Mar 2021
若没有安装ssh则通过以下安装:
"sudo apt-get install openssh-server"
2.ssh服务是否启动
输入"sudo ps -e |grep ssh"-->回车-->有sshd,说明ssh服务已经启动,如果没有启动,输入"sudo service ssh start"-->回车-->ssh服务就会启动。
3.建立ssh无密码登录本机
ssh生成密钥有rsa和dsa两种生成方式,默认情况下采用rsa方式。
(1)创建ssh-key,这里我们采用rsa方式
ssh-keygen -t rsa -P "" //(P是要大写的,后面跟"")
(注:回车后会在~/.ssh/下生成两个文件:id_rsa和id_rsa.pub这两个文件是成对出现的)
(2)进入~/.ssh/目录下,将id_rsa.pub追加到authorized_keys授权文件中,开始是没有authorized_keys文件的
cat id_rsa.pub >> authorized_keys
(3)将master的ssh公钥复制到每个从节点的authorized_keys文件
在配置Hadoop集群的SSH免密登录时,通常只需要设置从主节点(通常是NameNode或ResourceManager所在的节点)到其他所有节点(DataNodes或NodeManagers)的单向无密码SSH登录。这是因为主节点需要能够无密码地连接到集群中的每个工作节点来启动服务、执行脚本等。
具体来说,如果你有一个主节点(假设为master)和多个从节点(例如slave1, slave2等),你需要确保:
- 从master可以无密码SSH登录到slave1。
- 从master可以无密码SSH登录到slave2。
- 等等...
这种情况下,你只需在master节点上生成SSH密钥对,并将公钥复制到每个从节点的~/.ssh/authorized_keys文件中。
方法一:
直接把master的公钥复制到从节点下的uthorized_keys中,保存
方法二:
通过命令
ssh-copy-id 主机2
然后 ,在远程服务器上,确保SSH相关文件和目录具有正确的权限:
chmod 700 ~/.ssh
chmod 644 ~/.ssh/authorized_keys
把公钥复制到相应的主机后,通过命令
# ssh 地址 来查看是否能连接成功 例:
ssh 190.*.3
(三)集群部署规划
①NameNode和SecondaryNameNode不要安装在同一台服务器上。NN和2NN的关系就好像是NN的补充是2NN,如果安装在同一个机器上,机器一挂,NN和2NN全挂,完全不需要2NN对NN的补充
②ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上
所以安装规划如下
hadoop1 | hadoop2 | hadoop3 | |
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManger | ResourceManager NodeManger | NodeManager |
(四)配置文件(三台都需要)
Hadoop配置文件分为两类:默认配置文件和自定义文件
自定义文件主要有
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml,四个文件都放在hadoop目录下的etc/hadoop路径,可以根据实际需要进行配置
文件 | 说明 |
core-site.xml | 核心配置文件 |
hdfs-site.xml | hdfs配置文件 |
yarn-site.xml | yarn配置文件 |
mapred-site.xml | mr配置文件 |
1.配置核心文件 core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 NameNode 的地址 hdfs://190.*.1:8020 为客户端访问的集群端口-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:8020</value>
</property>
<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/document/HadoopDatas</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 lnnu -->
<!-- <property>
<name>hadoop.http.staticuser.user</name>
<value>lnnu</value>
</property> -->
</configuration>
2.配置hdfs文件 hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- NameNode web 端访问地址 9870是访问hdfs端口-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop1:9870</value>
</property>
<!-- SecondaryNameNode web 端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop3:9868</value>
</property>
</configuration>
3.配置yarn文件 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>hadoop2</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>
4.配置mr文件 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>
</configuration>
5.配置works文件
配置workers文件,在${HADOOP_HOME}/hadoop-3.1.3/etc/hadoop/下
vim ${HADOOP_HOME}/hadoop-3.1.3/etc/hadoop/
追加
hadoop1
hadoop2
hadoop3
注意:文件中不允许有空格,也不允许有空行。因为集群无法识别你的空格和空行是否为一台机器
三、启动集群
1. 如果集群是第一次启动,需要在 hadoop1 节点格式化 NameNode
注意:格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。
hdfs namenode -format
2.启动HDFS
sbin/start-dfs.sh
3.启动YARN
因为YARN配置在了hadoop2上,所以到hadoop2上启动,ResourceManager
在hadoop2上运行
sbin/start-yarn.sh
四、文件分发脚本设置
命令一 —— scp、
例:
scp -r /opt/module/jdk1.8.0_212 lnnu@hadoop103:/opt/module
scp
(secure copy)是一个基于SSH协议在网络中安全传输文件的命令行工具。
-r
选项表示递归复制整个目录。/opt/module/jdk1.8.0_212
是源目录,即你要复制的本地目录。lnnu@hadoop103
是目标主机的用户名和主机名或IP地址。:/opt/module
是目标路径,在远程主机上你希望将文件复制到的位置。
这条命令的作用是将本地机器上的 /opt/module/jdk1.8.0_212
目录及其所有内容复制到名为 hadoop103
的远程主机上,并放置在 /opt/module
目录下。
命令二 —— rsync、
例:
rsync -av hadoop-3.1.3/ lnnu@hadoop103:/opt/module/hadoop-3.1.3/
rsync
是一个非常强大的同步工具,可以用来备份和镜像数据,同时保持符号链接、权限等信息。
-a
选项表示归档模式,它会保留符号链接、文件权限、用户组信息等。-v
选项表示详细模式,输出过程中会显示更多的信息。hadoop-3.1.3/
是源目录,注意这里的斜杠很重要,它告诉rsync
复制目录的内容而不是目录本身。lnnu@hadoop103
同样是指定目标主机的用户名和主机名或IP地址。:/opt/module/hadoop-3.1.3/
是目标路径,在远程主机上的指定位置。
这条命令的作用是将本地的 hadoop-3.1.3/
目录下的内容同步到远程主机 hadoop103
上的 /opt/module/hadoop-3.1.3/
目录。
命令三 —— 修改后的rsync(xsync)、
xsync
并不是一个标准的 Unix/Linux 命令,而是一个通常在 Hadoop 集群管理中自定义的脚本,用于将文件或目录从一个节点同步到集群中的其他所有节点。这个脚本利用了 rsync
或者 scp
来实现跨主机的数据复制,并且通常会结合 SSH 密钥认证来简化身份验证过程。
1.安装rsync(自己百度)
2.新建xsync文件添加环境变量,或者在环境变量目录下新建xsync
若通过,环境变量目录下新建xsync方式需要先查看环境变量目录
echo $PATH
3.编写分发脚本
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop1 hadoop2 hadoop3
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
4.给与执行权限
chmod +x xsync
5.自己测试
命令:
xsync 目录地址
例:
xsync /path/to/file_or_directory
看是否在其他主机上能 收到文件