# 编辑下方文件,修改内容为自己想要的主机名,如 mitchell-101
vi /etc/hostname
# 修改服务器为静态IP,并配置内容
vi /etc/sysconfig/network-scripts/ifcfg-ens33
# 在文件中 修改或者新增 以下几项
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.200.100
NETMASK=255.255.255.0
GATEWAY=192.168.200.2
DNS1=192.168.200.2
# 重启网卡
service network restart
# 检查是否能连接外网
ping www.baidu.com
如果是使用 vmware 虚拟机,IP 地址的详细配置请参考:https://www.cnblogs.com/lovling/p/7941201.html
# 编辑器
yum -y install vim
# 文件上传和下载 rz 和 sz
yum -y install lrzsz
# 跨主机拷贝命令
yum -y install rsync
systemctl stop firewalld.service
systemctl disable firewalld.service
firewall-cmd --state
这里的用户名可以根据自己的喜好任意填写,本文使用 mitchell 作为用户
useradd mitchell
passwd mitchell
vim /etc/sudoers
在 /etc/sudoers 文件内容的下图的位置添加如下内容,从而开启 sudo 权限并允许免密切换到 root
mitchell ALL=(ALL) NOPASSWD:ALL
# 登入 mitcehll 用户,进入 opt 目录
cd /opt
# 创建软件安装目录
sudo mkdir module
# 创金软件包目录
sudo mkdir software
# 将两个目录的拥有者设置为 mitchell 用户
sudo chown mitchell:mitchell module/ software/
下载 jdk,这里选择 1.8
https://www.oracle.com/java/technologies/downloads/#java8
下载 hadoop,这里选择 3.3.4
https://dlcdn.apache.org/hadoop/common/
上传文件到服务器的 /opt/software 目录:可以使用 rz 命令,也可以使用 xftp(推荐)
将软件解压到 /opt/module 目录
tar -zxvf jdk-8u321-linux-x64.tar.gz -C /opt/module
tar -zxvf hadoop-3.3.4.tar.gz -C /opt/module
配置环境变量
# 创建并编辑环境变量文件
sudo vim /etc/profile.d/my_env.sh
文件中新增以下内容
# JAVA
export JAVA_HOME=/opt/module/jdk1.8.0_321
export PATH=$PATH:$JAVA_HOME/bin
# HADOOP
export HADOOP_HOME=/opt/module/hadoop-3.3.4
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
读取文件并测试是否安装成功
source /etc/profile.d/my_env.sh
mitchell-102 192.168.200.102
mitchell-103 192.168.200.103
mitchell-104 192.168.200.104
三台服务器都要修改
sudo vim /etc/hosts
# 添加以下内容,使得服务器之间可以通过域名互相访问
192.168.200.102 mitchell-102
192.168.200.103 mitchell-103
192.168.200.104 mitchell-104
创建一个脚本,用于同步不同服务器之间的文件,比如在 102 上修改完一些文件,借用下方脚本可以直接同步到 103 和 104
脚本内容如下:
#!/bin/bash
# 判断参数个数
if [ $# -lt 1 ]
then
echo NOT Enough Argument!
exit;
fi
# 遍历集群所有机器
for host in mitchell-102 mitchell-103 mitchell-104
do
echo ========================= $host =========================
for file in $@
do
if [ -e $file ]
then
pdir=$(cd -P $(dirname $file); pwd)
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
服务器上的操作:
# 进入用户目录
cd /home/mitchell
# 创建 bin 目录
mkdir bin
cd bin
# 创建脚本写入内容
sudo vim xsync
# 赋予执行权限
chmod 777 xsync
# 执行方式
xsync {文件名或者目录名}
我们在执行上面脚本的时候,每次都需要输入密码,很是麻烦,这里我们可以通过配置 ssh 免密从而减少操作
最好是三台机器都依次配置一下(至少 102 和 103 需要配置)
# 进入 ssh 目录,如果用户目录下没有 .ssh 目录,需要执行一次 ssh 命令
cd /home/mitchell/
ll -a
cd .ssh
# 生成秘钥(执行命令后连续三次回车即可)
ssh-keygen -t rsa
# 分发秘钥到需要免密登入的机器,这样 102 这台机器就可以不用密码直接控制 103 和 104 了
# 注意自己也需要分发,如当前是 102 也需要 分发 102
ssh-copy-id mitchell-102
ssh-copy-id mitchell-103
ssh-copy-id mitchell-104
# 查看是否免密设置成功,三台机器分别执行,如下图为设置成功
cat /home/mitchell/.ssh/authorized_keys
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ztJWUNS-1662605972194)(D:\MyCode\zzzz\staticfile\readme\image-20220904025242788.png)]
cd /opt/module/hadoop-3.3.4/etc/hadoop/
vim core-site.xml
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://mitchell-102:8020value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/opt/module/hadoop-3.3.4/datavalue>
property>
<property>
<name>hadoop.http.staticuser.username>
<value>mitchellvalue>
property>
configuration>
cd /opt/module/hadoop-3.3.4/etc/hadoop/
vim hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.http-addressname>
<value>mitchell-102:9870value>
property>
<property>
<name>dfs.namenode.secondary.http-addressname>
<value>mitchell-104:9868value>
property>
configuration>
cd /opt/module/hadoop-3.3.4/etc/hadoop/
vim yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.resourcemanager.hostnamename>
<value>mitchell-103value>
property>
<property>
<name>yarn.application.classpathname>
<value>/opt/module/hadoop-3.3.4/etc/hadoop:/opt/module/hadoop-3.3.4/share/hadoop/common/lib/*:/opt/module/hadoop-3.3.4/share/hadoop/common/*:/opt/module/hadoop-3.3.4/share/hadoop/hdfs:/opt/module/hadoop-3.3.4/share/hadoop/hdfs/lib/*:/opt/module/hadoop-3.3.4/share/hadoop/hdfs/*:/opt/module/hadoop-3.3.4/share/hadoop/mapreduce/*:/opt/module/hadoop-3.3.4/share/hadoop/yarn:/opt/module/hadoop-3.3.4/share/hadoop/yarn/lib/*:/opt/module/hadoop-3.3.4/share/hadoop/yarn/*value>
property>
<property>
<name>yarn.log-aggregation-enablename>
<value>truevalue>
property>
<property>
<name>yarn.log.server.urlname>
<value>http://mitchell-102:19888/jobhistory/logsvalue>
property>
<property>
<name>yarn.log-aggregation-secondsname>
<value>604800value>
property>
configuration>
cd /opt/module/hadoop-3.3.4/etc/hadoop/
vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
<property>
<name>mapreduce.jobhistory.addressname>
<value>mitchell-102:10020value>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>mitchell-102:19888value>
property>
configuration>
vim workers
# 加入以下内容
mitchell-102
mitchell-103
mitchell-104
由于 NameNode、YARN、2NN、JobHistory 四个组件都是比较耗内存的,所以我们一般讲他们分开安装到不同的服务器上
通过以上配置我们启动后 三台服务器分别存在的服务如下:
服务器 | 服务1 | 服务2 | 服务3 | 服务4 |
---|---|---|---|---|
mitchell-102 | NameNode | JobHistoryServer | DataNode | NodeManager |
mitchell-103 | ResourceManager(YARN) | DataNode | NodeManager | |
mitchell-104 | SecondaryNameNode | DataNode | NodeManager |
这里我们借用集群分发脚本,将修改的内容同步到其它服务器
cd /opt/module/hadoop-3.3.4/etc
xsync hadoop
# 【102】初始化,只需要执行一次,后续可以直接启动
hdfs namenode -format
# 【102】启动 和 关闭 hdfs
start-dfs.sh
stop-dfs.sh
# 【103】启动 和 关闭 yarn
start-yarn.sh
stop-yarn.sh
# 【102】启动 和关闭 历史服务器
mapred --daemon start historyserver
mapred --daemon stop historyserver
如果用上方的命令启动集群,不管启动还是关闭每次都需要输入三个命令,不是很方便
我们可以创建一个脚本,封装集群的启动和关闭,方便操作
cd /home/mitchell/bin/
vim myhadoop
chmod 777 myhadoop
脚本内容如下
#!/bin/bash
if [ $# -lt 1 ]
then
echo "NO Args Input"
exit;
fi
case $1 in
"start")
echo "=============================== 启动 hadoop 集群 ==============================="
echo "------------------------------- 启动 hdfs -------------------------------"
ssh mitchell-102 "/opt/module/hadoop-3.3.4/sbin/start-dfs.sh"
echo "------------------------------- 启动 yarn -------------------------------"
ssh mitchell-103 "/opt/module/hadoop-3.3.4/sbin/start-yarn.sh"
echo "------------------------------- 启动 historyserver -------------------------------"
ssh mitchell-102 "/opt/module/hadoop-3.3.4/bin/mapred --daemon start historyserver"
;;
"stop")
echo "=============================== 关闭 hadoop 集群 ==============================="
echo "------------------------------- 关闭 historyserver -------------------------------"
ssh mitchell-102 "/opt/module/hadoop-3.3.4/bin/mapred --daemon stop historyserver"
echo "------------------------------- 关闭 yarn -------------------------------"
ssh mitchell-103 "/opt/module/hadoop-3.3.4/sbin/stop-yarn.sh"
echo "------------------------------- 关闭 hdfs -------------------------------"
ssh mitchell-102 "/opt/module/hadoop-3.3.4/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
我们检查集群是否启动成功,每次都需要到不同的服务器执行 jps 命令,很不方便
这里我们写一个脚本,一口气打印多台机器集群启动情况
cd /home/mitchell/bin/
vim jpsall
chmod 777 jpsall
脚本内容如下
#!/bin/bash
for host in mitchell-102 mitchell-103 mitchell-104
do
echo ========================= $host =========================
ssh $host jps
done
先准备一个文件
cd /opt/module/hadoop-3.3.4
mkdir wcinput
cd wcinput
vim word.txt
# word.txt 文件中写入一些单词。如
haha hello name
nihao sima wo
haha cls
cks haha cls
文件上传到集群,并且做文件分析
# 创建文件夹:其中 /input 为相对于 hdfs 的文件路径
hadoop fs -mkdir /input
# 上传文件:其中 wcinput/word.txt 磁盘下文件,/input 为上一步创建的相对 hsfs 的路径
# 我们在 word.txt 中写入一些单词,单词和单词之间用 空格隔开
hadoop fs -put wcinput/word.txt /input
# 测试 MR
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input /output