Hadoop
分布式部署
准备工作
准备以下主机
hadoop102
hadoop103
hadoop104
配置102
的Hadoop
环境
参考单机部署
需要解决的问题
- 创建文件夹并赋权
- 上传解压文件
- 配置环境变量文件
我们环境变量这次就只使用一个,jdk
和hadoop
的写在一起
sudo vim /etc/profile.d/hadoop_env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_181
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export PATH=$PATH:$JAVA_HOME/bin
注意要刷新
scp
文件分发
现在是102
的环境准备好了,103
和104
还没有东西,我们不打算一个一个服务器上传配置解压,这里我们使用scp
工具进行主机与主机之间的文件传输
scp
的语法
scp -r $user@$host:/dir/file $user@$host:/dir/file
案例:在102
主机上将jdk
文件传输到103
上
scp -r /opt/module/jdk1.8.0_181/ hadoop@hadoop103:/opt/module/
hadoop_env.sh
scp -r root@hadoop102: /etc/profile.d/hadoop_env.sh/ root@hadoop103:/etc/profile.d/
**注意!**我们传输的是
/opt/module
目录,使用的是hadoop
用户,该用户是没有/opt
的写入权限的,所以我们要先在103
上面创建好/opt/module
文件夹,并且将权限赋予给hadoop
用户
案例:在103
主机上将102
的hadoop
文件拉倒103
上面
scp -r hadoop@hadoop102:/opt/module/hadoop-3.1.3/ /opt/module/
案例:在104
主机上将102
的/etc/profile.d/hadoop_env.sh
文件拉倒103
上面
scp -r root@hadoop102:/etc/profile.d/hadoop_env.sh root@hadoop103/etc/profile.d/
需要注意,连接对方需要对方密码
此时在103
主机是执行环境变量的刷新,运行hadoop version
那么103
的环境就和102
一模一样了
rsync
文件同步
scp
无法做到文件的增量同步,只能覆盖,而我们的文件可能只修改了一点点,是不需要传输全部的.那么rsync
就可以做到这一点
centos
安装rsync
yum install rsync
利用rsync
将102
机器上的hadoop
文件夹传输到104
rsync -av /opt/module/hadoop-3.1.3/ hadoop@hadoop104:/opt/module/hadoop-3.1.3/
注意,你需要事先准备好/opt/module
目录,因为/opt
的权限是属于root
[hadoop@hadoop104 module]$ sudo mkdir /opt/module/
[hadoop@hadoop104 module]$ sudo chown hadoop /opt/module
集群文件分发脚本
不管是scp
还是rsync
要想发文件,都得一台一台机器发送,而集群内的机器数量是相当大的,所以我们要编写一个我们自已的命令文件:做到一条命令给集群内的所有机器发送文件
-
为了保证我们的命令文件全局可以运行,这我们在一个是环境变量中的目录中创建该命令文件
-
在
/home/hadoop/bin
创建xsync
vim /home/hadoop/bin/xsync
-
在该文件中写入
#!/bin/bash
if [ $# -lt 1 ]
then
echo Not Arguement!
exit;
fi
for host in hadoop102 hadoop103 hadoop104
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 not exists!
fi
done
done
- 为该文件赋予
可运行
权限
chmod +x /home/hadoop/bin/xsync
你可能会使用windows的编辑工具去编辑这个代码,那么需要注意,windows的换行是\r\n,而在Linux中是
\n
,所以你可能会导致此文件运行报错如果那出现了
#!/bin/bash^M
错误,使用vim打开此文件shift+:
:set ff=unix
设置文件编码为
unix
配置无密登录
为了保证集群内的机器访问不需要密码,我们配置一下秘钥认证
注意,以下步骤需要在102-4三台机器是分别操作
-
创建秘钥对
ssh-keygen -t rsa
直接三次回车
-
给其他机器签发
ssh-copy-id hadoop102 ssh-copy-id hadoop103 ssh-copy-id hadoop104
注意,在
hadoop102
这台机器比较特殊,需要分发环境变量文件,所以需要root
用户,所以你需要su root
切换到root
用户再执行一遍上面的操作,其他两台机器不用
同步集群所有文件
-
同步
xsync
[hadoop@hadoop102 .shh]$ xsync /home/hadoop/bin/xsync
-
同步
jdk
文件[hadoop@hadoop102 .shh]$ xsync /opt/module/jdk1.8.0_181/
-
同步
hadoop
文件[hadoop@hadoop102 .shh]$ xsync /opt/module/hadoop-3.1.3/
-
同步
hadoop_env.sh
环境变量文件[hadoop@hadoop102 .shh]$ sudo /home/hadoop/bin/xsync /etc/profile.d/hadoop_env.sh
-
接下来你应该在三台机器上分别检查环境
source /etc/profile hadoop version
集群配置
集群部署规划
在部署Hadoop
分布式集群时,必须注意以下问题
-
NameNode
很耗内存 -
ResourceManager
也很耗内存 -
Secondary NameNote
不能喝NameNode
装在一台机器2NN
是NameNode
的备份,在NameNode
挂了之后帮助NameNode
恢复数据(毕竟NameNode
的运行时数据是在内存中,不小心挂了就没了)
设计规划
组件 | hadoop102 | hadoop103 | hadoop104 |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | Secondary NameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
Hadoop
的配置文件说明
Hadoop
的配置文件分为两种:
- 默认配置文件
- 自定义配置文件
默认配置文件
core-default.xml
hdfs-default.xml
yarn-default.xml
mapred-default.xml
以上的4个配置文件在Hadoop
的文件中,这4个文件里面书写所有的Hadoop
配置项,也就是说,你释压之后的Hadoop
不用改任何东西就可以运行的
自定义配置文件
自定义配置文件的配置是我们需要对默认配置提出修改的地方.就是说,默认配置写好了,而如果自定义配置里面出现了重复的配置型,以自定义的为准
自定义的配置会覆盖默认配置(不是整个文件覆盖,是按具体的配置项)
core-site.xml
hdfs.xml
yarn-site.xml
mapred-site.xml
我们所谓的配置Hadoop
指的是修改这4个配置文件
配置集群
请在102上配置该文件
1. 核心文件配置:core-site.xml
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9820</value>
</property>
<!-- 指定Hadoop数据存储的目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
2. HDFS
存储配置:hdfs.xml
<!-- namenode web 访问地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2NN web 访问地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
3. 任务调度配置:yarn-site.xml
<property>
<!-- 指定 MR 数据流方式:shuffle -->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定resourceManager 的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 任务容器的环境继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>
JAVA_HOME,
HADOOP_COMMON_HOME,
HADOOP_HDFS_HOME,
HADOOP_CONF_DIR,
HADOOP_YARN_HOME,
HADOOP_MAPRED_HOME,
CLASSPATH_PREPEND_DISTCACHE
</value>
</property>
4. 任务处理配置:mapred-site.xml
<property>
<!-- 指定MapReduce程序的调度器:yarn -->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
配置进行同步
因为配置文件是在102上修改,而其他机器没有,所以我们要进行4个配置文件的同步
xsync /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
xsync /opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml
xsync /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml
xsync /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml
集群启动
在启动集群之前,我们要指定集群的工作节点群
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
hadoop102
hadoop103
hadoop104
主要此文件不能有任何空行
同步此文件
xsync /opt/module/hadoop-3.1.3/etc/hadoop/workers
-
初始化
NameNode
初始化
NameNode
只需要在配置后的第一次启动时需要,后面就不需要了,除非你修改了配置在
NameNode
的机器是(hadoop102
)上执行hdfs namenode -format
-
启动
HDFS
在
NameNode
所在的机器上执行/opt/module/hadoop-3.1.3/sbin/start-dfs.sh
-
启动
Yarn
在
ResourceManager
所在机器上(hadoop103
)执行/opt/module/hadoop-3.1.3/sbin/start-yarn.sh
检查
在每台机器上执行jps
命令检查集群的情况
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-62WojyWA-1653369207198)(C:\Users\Administrator\Desktop\屏幕截图 2021-11-23 172420.png)]
错误的处理
如果你启动失败了,那么就是你配置文件错了
请按照以下步骤处理
-
关闭集群
-
关闭YARN
/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh
-
关闭DFS
/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh
-
-
删除每个节点上的
data
和logs
目录rm -rf /opt/module/hadoop-3.1.3/data /opt/module/hadoop-3.1.3/logsxsync
-
去修改错误文件
-
同步修改的文件
-
初始化
NameNode
-
再次启动
集群的外部访问
我们要关闭防火墙才可以让外部进行访问
-
关闭防火墙
sudo systemctl stop firewalld.service
-
开机不自启
sudo systemctl disable firewalld.service
-
查看状态
sudo firewall-cmd --state
注意,你需要把所有机器的防火墙全部关了
外部访问
-
NameNode
的访问地址:`http://hadoop102:9870
-
2NN
的访问地址:`http://hadoop102:9868
集群的启动和关闭
快速脚本
在hadoop102
的/home/hadoop/bin
中创建文件my-hadoop
写下以下代码
#!/bin/bash
if [ $# -lt 1 ]
then
echo "请输入命令参数![start|stop|init]"
exit
fi
case $1 in
"start")
echo "===================启动hadoop集群==================="
echo "===============启动HDFS==================="
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo "================启动YARN=================="
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
;;
"stop")
echo "===================关闭hadoop集群==================="
echo "===============关闭YARN==================="
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo "================关闭HDFS=================="
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
"init")
read -p "你正在进行集群的初始化操作!此操作将删除集群内的所有数据!是否确定?[yes/no]:" check
if [ "$check" = "yes" ]
then
echo "=================关闭Hadoop集群==================="
echo "==============关闭YARN==================="
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo "==============关闭HDFS==================="
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
echo "====================删除Hadoop集群数据======================"
ssh hadoop102 "rm -rf /opt/module/hadoop-3.1.3/data /opt/module/hadoop-3.1.3/logs "
ssh hadoop103 "rm -rf /opt/module/hadoop-3.1.3/data /opt/module/hadoop-3.1.3/logs "
ssh hadoop104 "rm -rf /opt/module/hadoop-3.1.3/data /opt/module/hadoop-3.1.3/logs "
echo "========================集群数据删除完毕================================"
ssh hadoop102 "hdfs namenode -format"
fi
;;
*)
echo "参数错误,可允许的参数:[start|stop|init]"
;;
esac
注意你要给此文件赋予运行权利,并且同步给其他机器
所以之后你要是出了问题,只需要直接去修改文件,然后执行init
,在start
集群的基本测试
-
创建目录
hadoop fs -mkdir /input
-
上传文件
hadoop fs -put jdk-8ul8l_linux-x64.tar.gz /input/
上传到指定的目录,注意,这样上传需要保证这个目录已经存在
-
查看集群中的文件
#查看根目录 hadoop fs -ls / #查看指定文件夹 hadoop fs -ls /input
-
下载文件
hadoop fs -get /input/jdk-8u181-linux-x64.tar.gz /home/hadoop/
以上命令会将文件下载到
/home/hadoop
目录,文件名就是原名当然你可以在下载的时候指定一个新的文件名
hadoop fs -get /input/jdk-8u181-linux-x64.tar.gz /home/hadoop/jdk.gz
-
删除集群中的文件
#删除文件 hadoop fs rm /文件名 hadoop fs rm /目录/文件名 #删除文件夹 hadoop fs rm -r /input
``
-
上传文件
hadoop fs -put jdk-8ul8l_linux-x64.tar.gz /input/
上传到指定的目录,注意,这样上传需要保证这个目录已经存在
-
查看集群中的文件
#查看根目录 hadoop fs -ls / #查看指定文件夹 hadoop fs -ls /input
-
下载文件
hadoop fs -get /input/jdk-8u181-linux-x64.tar.gz /home/hadoop/
以上命令会将文件下载到
/home/hadoop
目录,文件名就是原名当然你可以在下载的时候指定一个新的文件名
hadoop fs -get /input/jdk-8u181-linux-x64.tar.gz /home/hadoop/jdk.gz
-
删除集群中的文件
#删除文件 hadoop fs rm /文件名 hadoop fs rm /目录/文件名 #删除文件夹 hadoop fs rm -r /input