3台centOS虚拟机
# 配置hosts解析
vim /etc/hosts
192.168.88.129 hadoop1
192.168.88.130 hadoop2
192.168.88.131 hadoop3
修改主机名
hostnamectl set-hostname hadoop1
hostnamectl set-hostname hadoop2
hostnamectl set-hostname hadoop3
关闭防火墙
#关闭防火墙
systemctl stop firewalld.service
#禁用开机启动
systemctl disable firewalld.service
#重启防火墙
systemctl restart firewalld.service
#查看防火墙状态
systemctl status firewalld.service
生产环境不允许直接关闭防火墙!!!只能配置策略,开通特定的端口!!
禁用selinux
修改 /etc/selinux/config
设置 SELINUX=disabled
vim /etc/selinux/config
重启使主机名等配置生效
创建hadoop用户,并设置密码
useradd hadoop
passwd hadoop
所有主机上都创建
密码:fmi135246
配置hadoop用户的root权限
vim /etc/sudoers
在 %wheel
下一行添加内容
hadoop ALL=(ALL) NOPASSWD:ALL
NOPASSWD:ALL
表示使用sudo
命令时免输入密码 , 需要放在 %wheel
下一行 , 否则可能失效
设置ssh免密登录
# 进入密钥目录(有可能不存在)
cd ~/.ssh
# 删除旧密钥
rm -rf ~/.ssh
# 生成密钥
ssh-keygen -t rsa
# 公钥复制到ssh指定的密钥文件 authorized_keys
cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
#修改文件权限(不设置可能导致失败)
chmod 600 ~/.ssh/authorized_keys
# 测试免密登录
ssh -vvv hadoop1
# 退出ssh登录
exit
ssh -vvv
-vvv 表示输出调试信息,如果免密失败,可以从调试信息中查看原因,我在测试中,非root用户,必须修改 authorized_keys 文件的权限,否则设置免密不成功
将hadoop1的公钥内容添加到其他主机的~/.ssh/authorized_keys
中,这样hadoop1可以免密登录其他主机
# 在hadoop1上执行
ssh-copy-id hadoop1
ssh-copy-id hadoop2
ssh-copy-id hadoop3
其他主机上同理执行
解压安装包到 /opt/module
# 创建目录
sudo mkdir -p /opt/module
# 修改权限
sudo chown -R hadoop:hadoop /opt/module
# 解压安装包到/opt/module
tar -xvf jdk-8u341-linux-x64.tar.gz -C /opt/module/
# 修改jdk目录名
mv /opt/module/jdk1.8.0_341/ /opt/module/jdk
配置环境变量
可直接将jdk路径配置到 /etc/profile
文件,或者在 /etc/profile.d/
新建 my_env.sh
# 编辑文件
sudo vim /etc/profile.d/my_env.sh
# 添加内容
export JAVA_HOME=/opt/module/jdk
export PATH=$PATH:$JAVA_HOME/bin
# 使变量生效
source /etc/profile
# 测试jdk
java -version
使用上个命令的参数
!$
,或者alt + .
解压到 /opt/module/hadoop
tar -xvf hadoop-3.2.4.tar.gz -C /opt/module
sudo mv /opt/module/hadoop-3.2.4 /opt/module/hadoop
配置环境变量到 /etc/profile.d/my_env.sh
# 添加内容
export JAVA_HOME=/opt/module/jdk
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#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
$HADOOP_HOME/bin 和 $HADOOP_HOME/sbin 必须加入环境变量
配置文件分发到其他主机
scp /etc/profile.d/my_env.sh hadoop2:/etc/profile.d/
scp /etc/profile.d/my_env.sh hadoop3:/etc/profile.d/
rsync -av p d i r / pdir/ pdir/fname u s e r @ user@ user@host: p d i r / pdir/ pdir/fname
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
使环境变量生效
source /etc/profile
配置hadoop-env.sh
的jdk路径
# 分别打开文件
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
#vim /usr/local/hadoop/etc/hadoop/mapred-env.sh
#vim /usr/local/hadoop/etc/hadoop/yarn-env.sh
添加 JAVA_HOME
配置
export JAVA_HOME=/usr/local/jdk
验证配置
hadoop version
复制jdk和hadoop到其他主机
#通过ssh创建目录并修改权限
ssh hadoop2 'sudo mkdir -p /opt/module;sudo chown -R hadoop:hadoop /opt/module'
ssh hadoop3 'sudo mkdir -p /opt/module;sudo chown -R hadoop:hadoop /opt/module'
# 复制安装文件到hadoop2主机
scp -r /opt/module hadoop@hadoop2:/opt/
scp -r /opt/module hadoop@hadoop3:/opt/
登录其他主机配置jdk和hadoop的环境变量,参考前面配置 /etc/profile.d/my_env.sh
的步骤
在home/hadoop
目录下新建bin
目录,并将目录加到PATH
# 创建目录
mkdir -p /home/hadoop/bin
# 修改环境变量
vim /etc/profile.d/my_env.sh
修改内容为:
export JAVA_HOME=/opt/module/jdk
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:/home/hadoop/bin
编写集群文件分发脚本xsync
新建xsync
文件
vim ~/bin/xsync
添加如下内容
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in 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
添加执行权限
chmod +x ~/bin/xsync
测试将文件复制到其他主机
xsync /home/hadoop/bin
集群规划部署
hadoop1 | hadoop2 | hadoop3 | |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
规划原则:
NameNode
,SecondaryNameNode
,ResourceManager
均比较占内存,故应部署在不同的主机上
配置文件说明
需要配置的配置文件位于hadoop安装目录下 $HADOOP_HOME/etc/hadoop
配置文件名 | 配置说明 |
---|---|
core-site.xml | 1 配置NameNode地址 2 配置hadoop数据存储目录 3 配置HDFS网页登录静态用户名 |
hdfs-site.xml | 1 配置NameNode web端访问地址 2 配置SecondaryNameNode web端访问地址 |
yarn-site.xml | 1 配置MR走shuffle 2 配置ResourceManger地址 |
mapred-site.xml | 1 配置MapReduce程序运行在yarn上 |
配置core-site.xml
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://hadoop1:8020value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/opt/module/hadoop/datavalue>
property>
<property>
<name>hadoop.http.staticuser.username>
<value>hadoopvalue>
property>
configuration>
配置hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.http-addressname>
<value>hadoop1:9870value>
property>
<property>
<name>dfs.namenode.secondary.http-addressname>
<value>hadoop3:9868value>
property>
configuration>
配置yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.resourcemanager.hostnamename>
<value>hadoop2value>
property>
configuration>
配置mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
configuration>
同步配置文件到其他主机
xsync $HADOOP_HOME/etc/hadoop/
登录其他主机查看配置文件是否同步成功
启动集群
配置workers
vim $HADOOP_HOME/etc/hadoop/workers
添加内容
hadoop1
hadoop2
hadoop3
不能有空行,行尾不能有空格
同步文件到其他主机
xsync $HADOOP_HOME/etc
启动集群
如果是第一次启动,需要现在 NameNode 节点上执行格式化
#在NameNode节点,即hadoop1上执行
hdfs namenode -format
注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的
$HADOOP_HOME/data
和$HADOOP_HOME/logs
目录,然后再进行格式化。
在hadoop1主机启动HDFS
#在NameNode节点执行,即hadoop1上执行
start-dfs.sh
在hadoop2主机启动YARN
#在ResourceManager节点执行,即hadoop2上执行
start-yarn.sh
通过web服务查看NameNode和ResourceManager
# 查看HDFS的NameNode
http://hadoop1:9870
# 查看YARN的ResourceManager
http://hadoop2:8088
如果页面都能正常打开则集群启动成功
查看各节点进程
# hadoop1 主机
[hadoop@hadoop1 hadoop]$ jps
21745 NodeManager
21860 Jps
20682 NameNode
20797 DataNode
# hadoop2主机
[hadoop@hadoop2 hadoop]$ jps
9986 DataNode
10535 NodeManager
10410 ResourceManager
10891 Jps
# hadoop3主机
[hadoop@hadoop3 hadoop]$ jps
17488 NodeManager
17584 Jps
17397 SecondaryNameNode
17289 DataNode
为了查看程序的历史运行情况,可以配置历史服务器
配置mapred-site.xml
# 添加如下内容
mapreduce.jobhistory.address
hadoop1:10020
mapreduce.jobhistory.webapp.address
hadoop1:19888
同步配置到其他主机
xsync $HADOOP_HOME/etc
在hadoop1启动历史服务器
mapred --daemon start historyserver
查看进程
[hadoop@hadoop1 hadoop]$ jps
2176 NodeManager
1714 NameNode
2292 Jps
1865 DataNode
1533 JobHistoryServer
访问web
http://hadoop1:19888/jobhistory
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryServer。
配置 yarn-site.xml
添加内容
<property>
<name>yarn.log-aggregation-enablename>
<value>truevalue>
property>
<property>
<name>yarn.log.server.urlname>
<value>http://hadoop1:19888/jobhistory/logsvalue>
property>
<property>
<name>yarn.log-aggregation.retain-secondsname>
<value>604800value>
property>
同步配置
xsync $HADOOP_HOME/etc
关闭NodeManager , ResourceManager , HistroyServer
# 在hadoop2上执行
stop-yarn.sh
# 在hadoop1上执行
mapred --daemon stop historyserver
开启NodeManager , ResourceManager , HistroyServer
# 在hadoop2上执行
start-yarn.sh
# 在hadoop1上执行
mapred --daemon start historyserver
在 ~/bin
目录下创建 myhadoop.sh
vim ~/bin/myhadoop.sh
添加内容
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop1 "/opt/module/hadoop/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop2 "/opt/module/hadoop/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop1 "/opt/module/hadoop/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop1 "/opt/module/hadoop/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop2 "/opt/module/hadoop/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop1 "/opt/module/hadoop/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
添加执行权限
chmod +x ~/bin/myhadoop.sh
测试脚本
# 停止
myhadoop.sh stop
# 启动
myhadoop.sh start
同步文件
xsync ~/bin
在 ~/bin
目录下创建 jpsall
vim ~/bin/jpsall
添加内容
#!/bin/bash
for host in hadoop1 hadoop2 hadoop3
do
echo =============== $host ===============
ssh $host 'jps'
done
添加执行权限
chmod +x ~/bin/jpsall
测试脚本
[hadoop@hadoop1 ~]$ jpsall
=============== hadoop1 ===============
4448 DataNode
4723 NodeManager
4889 JobHistoryServer
4985 Jps
4299 NameNode
=============== hadoop2 ===============
4372 DataNode
4550 ResourceManager
5053 Jps
4686 NodeManager
=============== hadoop3 ===============
3420 SecondaryNameNode
3677 Jps
3310 DataNode
3503 NodeManager
同步到其他主机
xsync ~/bin/
端口 | Hadoop2.X | hadoop3.x |
---|---|---|
NameNode内部通信端口 | 8020/9000 | 8020/9000/9820 |
NameNode HTTP UI | 50070 | 9870 |
MapReduce 查看执行任务端口 | 8088 | 8088 |
历史服务器通信端口 | 19888 | 19888 |