四.Hadoop集群搭建
1.环境准备
1)再克隆2台虚拟机,加上之前单机模式的机器,共三台机器
2)编写集群分发脚本
期望脚本在任何路径都能使用(脚本放在声明了全局环境变量的路径)
先查看本地的PATH
[hadoop@hadoop101 hadoop-3.1.3]$ echo $PATH
在/home/hadoop/bin目录下创建xsync文件
[hadoop@hadoop101 ~]$ ll /home/hadoop/
[hadoop@hadoop101 ~]$ mkdir /home/hadoop/bin
[hadoop@hadoop101 hadoop-3.1.3]$ touch /home/hadoop/bin/xsync
打开此文件
[hadoop@hadoop101 hadoop-3.1.3]$ vim /home/hadoop/bin/xsync
在该文件中编写如下代码
#!/bin/bash
#判断参数列表是否为空
if [ $# -lt -1 ]
then
echo "参数为空,请重新输入"
fi
#循环遍历集群的所有机器
for host in hadoop102 hadoop103
do
#循环遍历所有目录
for file in $@
do
#判断文件是否存在
if [ -e $file ]
then
#获取文件父目录绝对路径
pdir=$(cd -P $(dirname $file);pwd)
#获取文件名
filename=$(basename $file)
#免密在集群机器创建相同文件夹
ssh $host "mkdir -p $pdir"
#相集群机器分发文件
rsync -av $pdir/$filename $host:$pdir
else
echo "$file 文件不存在"
fi
done
done
修改脚本 xsync 具有执行权限
[hadoop@hadoop101 hadoop-3.1.3]$ chmod +x /home/hadoop/bin/xsync
测试脚本
[hadoop@hadoop101 ~]$ xsync /home/hadoop/bin/
将脚本复制到/bin中,以便全局调用
[hadoop@hadoop101 hadoop-3.1.3]$ sudo cp /home/hadoop/bin/xsync /bin/
2.SSH无密登录配置(以一台机器为例)
1)配置ssh
[hadoop@hadoop101 ~]$ ssh hadoop102
[hadoop@hadoop102 ~]$ exit
2)免密配置
生成公钥和私钥
[hadoop@hadoop101 ~]$ cd .ssh/
[hadoop@hadoop101 .ssh]$ ssh-keygen -t rsa
将公钥拷贝到要免密登录的目标机器上
[hadoop@hadoop101 .ssh]$ ssh-copy-id hadoop101
[hadoop@hadoop101 .ssh]$ ssh-copy-id hadoop102
[hadoop@hadoop101 .ssh]$ ssh-copy-id hadoop103
注意:在hadoop102 和 hadoop103中也要分别执行以上操作
还需要在hadoop101上采用root账号,配置一下无密登录到hadoop101、hadoop102、hadoop103;
3.配置集群
1)规划hadoop集群
NameNode和SecondaryNameNode不要安装在同一台服务器
ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。
hadoop101 namenode datanode nodemanager
hadoop102 resourcemanager datanode nodemanager
hadoop103 secondarynamenode datanode nodemanager
2)熟悉hadoop的配置文件
-- hadoop的默认配置文件
core-default.xml
hdfs-default.xml
mapread-default.xml
yarn-default.xml
-- hadoop提供可自定义的配置文件
core-site.xml
hdfs-site.xml
mapread-site.xml
yarn-site.xml
-- Hadoop 中加载配置文件的顺序
当Hadoop集群启动后,先加载默认配置,然后再加载自定义配置文件,自定义的配置信息会覆盖默认配置
3)配置集群的相关信息(修改hadoop自定义的配置文件)
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。
[hadoop@hadoop101 hadoop-3.1.3]$ cd etc/hadoop/
[hadoop@hadoop101 hadoop]$ ll
查看一下etc/hadoop/的配置文件
配置core-site.xml(配置hadoop的全局信息)
[hadoop@hadoop101 hadoop]$ vim core-site.xml
在文件中添加以下内容:
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为hadoop -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
</configuration>
配置hdfs-site.xml
[hadoop@hadoop101 hadoop]$ vim hdfs-site.xml
在文件中添加以下内容:
<configuration>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop101:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop103:9868</value>
</property>
</configuration>
配置yarn-site.xml
[hadoop@hadoop101 hadoop]$ vim yarn-site.xml
在文件中添加以下内容:
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop102</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>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
配置mapred-site.xml
[hadoop@hadoop101 hadoop]$ vim mapred-site.xml
在文件中添加以下内容:
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
在集群上分发配置好的Hadoop配置文件
[hadoop@hadoop101 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc/hadoop/
4.群起集群
1)配置 workers
[hadoop@hadoop101 hadoop-3.1.3]$ vim /opt/module/hadoop3.1.3/etc/hadoop/workers
在文件中添加以下内容:
hadoop101
hadoop102
hadoop103
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件
[hadoop@hadoop101 hadoop-3.1.3]$ xsync /opt/module/hadoop-3.1.3/etc
2)启动集群
(1)如果集群是第一次启动,需要在 hadoop101 节点格式化 NameNode
[hadoop@hadoop101 hadoop]$ hdfs namenode -format
注意:格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停 止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。
2)启动 HDFS
[hadoop@hadoop101 hadoop-3.1.3]$ sbin/start-dfs.sh
[hadoop@hadoop101 hadoop-3.1.3]$ ll
3)在配置了 ResourceManager 的节点(hadoop103)启动 YARN
[atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
[hadoop@hadoop102 hadoop-3.1.3]$ jps
4)Web 端查看 HDFS 的 NameNode
(a)浏览器中输入:http://hadoop102:9870
(b)查看 HDFS 上存储的数据信息
(5)Web 端查看 YARN 的 ResourceManager
(a)浏览器中输入:http://hadoop103:8088
(b)查看 YARN 上运行的 Job 信息
5)集群基本测试
执行 wordcount 程序
[hadoop@hadoop103 hadoop-3.1.3]$ hadoop fs -mkdir /input
[hadoop@hadoop103 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
5.配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
1)配置 mapred-site.xml
[hadoop@hadoop101 hadoop-3.1.3]$ vim etc/hadoop/mapred-site.xml
在文件中添加以下内容:
<configuration>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop101:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop101:19888</value>
</property>
</configuration>
2)分发配置
[hadoop@hadoop101 hadoop-3.1.3]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
3)在 hadoop101 启动历史服务器
[hadoop@hadoop101 hadoop-3.1.3]$ mapred --daemon start historyserver
5)查看 JobHistory
http://hadoop102:19888/jobhistory
6.配置日志的聚集
1)配置 yarn-site.xml
[hadoop@hadoop101 hadoop-3.1.3]$ vim etc/hadoop/yarn-site.xml
在文件中添加以下内容:
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop101:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
2)分发配置
[hadoop@hadoop101 hadoop-3.1.3]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
3)关闭 NodeManager 、ResourceManager 和 HistoryServer
[hadoop@hadoop102 hadoop-3.1.3]$ sbin/stop-yarn.sh
[hadoop@hadoop101 hadoop-3.1.3]$ mapred --daemon stop historyserver
4)启动 NodeManager 、ResourceManage 和 HistoryServer
[hadoop@hadoop102 hadoop-3.1.3]$ sbin/start-yarn.sh
[hadoop@hadoop101 hadoop-3.1.3]$ mapred --daemon start historyserver
5)删除 HDFS 上已经存在的输出文件
[hadoop@hadoop101 hadoop-3.1.3]$ hadoop fs -rm -r /output
6)执行 WordCount 程序
[hadoop@hadoop101 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
7)查看日志
(1)历史服务器地址
http://hadoop102:19888/jobhistory
(2)历史任务列表
(3)查看任务运行日志
(4)运行日志详情
7.Hadoop 集群常用脚本
1)Hadoop 集群启停脚本(包含 HDFS,Yarn,Historyserver):myhadoop.sh
[hadoop@hadoop101 hadoop-3.1.3]$ vim /home/hadoop/bin/myhadoop.sh
在文件中添加以下内容:
#!/bin/bash
#判断参数列表是否为空
if [ $# -lt -1 ]
then
echo "参数列表为空,请重新输入"
exit;
fi
#输入判断
case $1 in
#输入为start时
"start")
echo "=======================启动hadoop集群======================="
echo "=========================启动hdfs========================="
ssh hadoop101 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo "=========================启动yarn========================="
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo "=======================启动历史日志服务======================="
ssh hadoop101 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
#输入为stop时
"stop")
echo "=======================关闭历史日志服务======================="
ssh hadoop101 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo "=========================关闭yarn========================="
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo "=========================关闭hdfs========================="
ssh hadoop101 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
#输入为其他时
*)
echo "输入有误,请检查"
;;
esac
保存后退出,然后赋予脚本执行权限
[hadoop@hadoop101 hadoop-3.1.3]$ chmod 744 /home/hadoop/bin/myhadoop.sh
测试脚本
[hadoop@hadoop101 hadoop-3.1.3]$ myhadoop.sh stop
[hadoop@hadoop101 hadoop-3.1.3]$ myhadoop.sh start
[hadoop@hadoop101 hadoop-3.1.3]$ jps
2)查看三台服务器Java进程脚本:jpsall
[hadoop@hadoop101 hadoop-3.1.3]$ vim /home/hadoop/bin/jpsall
在文件中添加以下内容:
#!/bin/bash
for host in hadoop101 hadoop102 hadoop103
do
echo ================$host===============
ssh $host jps
done
赋予脚本执行权限
[hadoop@hadoop101 hadoop-3.1.3]$ chmod 744 /home/hadoop/bin/jpsall
分发/home/atguigu/bin目录,保证自定义脚本在三台机器上都可以使用
[hadoop@hadoop101 hadoop-3.1.3]$ xsync /home/hadoop/bin/
测试脚本
[hadoop@hadoop101 hadoop-3.1.3]$ jpsall