1. 前言
Hadoop中设置任务历史服务器并开启日志聚集的必要性:一般情况下在YARN的Web UI中只能查看本次YARN运行期间执行的Application的首个Container的运行日志,即ApplicationMaster的运行日志(MR任务一般是分成多个task通过多个Container分别执行,这些Container分布在集群的任意主机上,首个Container用于运行ApplicationMaster,而AppMaster则负责分发调度task,以及启动其他Container),既不能查看历史job的日志,也不能查看程序输出的Counter统计信息(即命令行提交jar程序的最终执行输出,如job执行过程中的读写数据量、Map/Reduce task数量、各个阶段执行时间等一系列参数),所以需要开启jobhistory-server以及yarn-log-aggregation,即开启任务历史服务器以及日志聚集功能,来实现历史任务日志和作业运行日志,开启jobhistory-server之后,任务结束后运行日志会聚集到HDFS指定目录中,而不再保存本地文件系统中。
2. 集群规划
hadoop101 | hadoop102 | hadoop103 | |
---|---|---|---|
NameNode | √ | ||
DataNode | √ | √ | √ |
SecondaryNameNode | √ | ||
ResourceManager | √ | ||
NodeManager | √ | √ | √ |
JobHistoryServer | √ |
3. 具体配置
a) core-site.xml
<configuration>
<!--指定HDFS文件系统访问地址,将其设置为NameNode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:9000</value>
</property>
<!--指定Hadoop运行时产生文件的存储目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.7/tmp</value>
</property>
</configuration>
b) hdfs-site.xml
<configuration>
<!--指定HDFS副本因子数-->
<!--由于实验主机磁盘空间不足,本次实验中设置为1,一般需要设置为3-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!--以下是NameNode配置-->
<!--指定NameNode节点的Web UI地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop101:50070</value>
</property>
<!--指定NameNode节点上存储name table(fsimage)文件的本地路径-->
<!--默认值:file://${hadoop.tmp.dir}/dfs/name-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/namenode/fsimage</value>
</property>
<!--指定NameNode节点上存储transaction(edits)文件的本地路径-->
<!--默认值:${dfs.namenode.name.dir}-->
<property>
<name>dfs.namenode.edits.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/namenode/edits</value>
</property>
<!--指定DataNode节点上存储Blocks文件的本地路径,此处为修改-->
<!--默认值:file://${hadoop.tmp.dir}/dfs/data-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/datanode/data</value>
</property>
<!--以下是SecondaryNameNode配置-->
<!--指定NameNode辅助名称节点SecondaryNameNode的Web UI地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop103:50090</value>
</property>
<!--指定SecondaryNameNode节点上存储temporary images文件的本地路径-->
<!--默认值:file://${hadoop.tmp.dir}/dfs/namesecondary-->
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/namesecondary/fsimage</value>
</property>
<!--指定SecondaryNameNode节点上存储temporary edits文件的本地路径-->
<!--默认值:${dfs.namenode.checkpoint.dir}-->
<property>
<name>dfs.namenode.checkpoint.edits.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/namesecondary/edits</value>
</property>
</configuration>
c) mapred-site.xml
<configuration>
<!--指定MR程序运行框架,设置为YARN上运行,默认是在本地运行-->
<!--默认值:local-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--指定历史服务器JobHistoryServer进程间通信IPC地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop103:10020</value>
</property>
<!--指定历史服务器JobHistoryServer的Web UI地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop103:19888</value>
</property>
</configuration>
d) yarn-site.xml
<configuration>
<!--Site specific YARN configuration properties-->
<!--设置Reducer获取数据的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定YARN中ResourceManager的ip地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop102</value>
</property>
<!--此参数指的是nodemanager的可用内存大小,单位为Mb,设置为主机内存大小-->
<!--本次实验主机内存大小为2GB,此参数根据各机器分配的物理内存大小设置,若大于物理内存值会影响程序运行效率-->
<!--默认值:8192-->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<!--开启日志聚集功能-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!--日志聚集位置,默认为HDFS文件系统的/tmp/logs路径下,默认格式为/tmp/logs/${user}/logs-->
<!--默认值:/tmp/logs-->
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
</property>
<!--聚集日志保留时间设置7天-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
4. 启动HDFS和YARN集群
在hadoop101上启动HDFS集群:
./sbin/start-dfs.sh
在hadoop102上启动YARN集群:
./sbin/start-yarn.sh
在hadoop103上启动JobHistoryServer:
./sbin/mr-jobhistory-daemon.sh start historyserver
启动脚本:
- 最好是自己自定义启动脚本,这里提供个参考脚本
hadoop-ctl.sh
,操作参数为start
和stop
#!/bin/bash
# 用于启动Hadoop集群,包括HDFS/YARN/JobHistoryServer
# 判断参数个数
if (($# != 1)); then
echo -e "\nWorng Parameter!"
exit 1
fi
# 获取当前时间(相对时间)
start_time=$(date +%s)
# 获取操作方式
operate=$1
# 设定HDFS客户端,即NameNode节点地址
HDFS_Client="hadoop101"
# 设定YARN客户端,即ResourceManager节点地址
YARN_Client="hadoop102"
# 设置任务历史服务器客户端,即JobHistoryServer节点地址
JobHistoryServer="hadoop103"
# 指定启动用户
user="tomandersen"
case $operate in
start)
# 启动HDFS集群
echo -e "\n----------Starting HDFS cluster----------"
ssh $user@$HDFS_Client "source /etc/profile;
HADOOP_HOME=${HADOOP_HOME:-/opt/module/hadoop-2.7.7};
$HADOOP_HOME/sbin/start-dfs.sh"
# 启动YARN集群
echo -e "\n----------Starting YARN cluster----------"
ssh $user@$YARN_Client "source /etc/profile;
HADOOP_HOME=${HADOOP_HOME:-/opt/module/hadoop-2.7.7};
$HADOOP_HOME/sbin/start-yarn.sh"
# 启动历史服务器
echo -e "\n----------Starting JobHistoryServer----------"
ssh $user@$JobHistoryServer "source /etc/profile;
HADOOP_HOME=${HADOOP_HOME:-/opt/module/hadoop-2.7.7};
$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver"
;;
stop)
# 关闭HDFS集群
echo -e "\n----------Stopping HDFS cluster----------"
ssh $user@$HDFS_Client "source /etc/profile;
HADOOP_HOME=${HADOOP_HOME:-/opt/module/hadoop-2.7.7};
$HADOOP_HOME/sbin/stop-dfs.sh"
# 关闭YARN集群
echo -e "\n----------Stopping YARN cluster----------"
ssh $user@$YARN_Client "source /etc/profile;
HADOOP_HOME=${HADOOP_HOME:-/opt/module/hadoop-2.7.7};
$HADOOP_HOME/sbin/stop-yarn.sh"
# 关闭历史服务器
echo -e "\n----------Stopping JobHistoryServer----------"
ssh $user@$JobHistoryServer "source /etc/profile;
HADOOP_HOME=${HADOOP_HOME:-/opt/module/hadoop-2.7.7};
$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh stop historyserver"
;;
*)
echo -e "\nWorng Parameter!"
exit 1
;;
esac
end_time=$(date +%s)
execution_time=$((${end_time} - ${start_time}))
echo -e "\n----------$operate Hadoop cluster takes ${execution_time} seconds----------\n"
5. jps检查进程
- 本次配置的hadoop集群,启动后各主机进程情况如下所示:
[tomandersen@hadoop101 hadoop]$ call-cluster.sh jps
----------hadoop103----------
38738 SecondaryNameNode
39077 Jps
38825 NodeManager
38622 DataNode
38958 JobHistoryServer
----------hadoop102----------
44720 ResourceManager
45175 Jps
44570 DataNode
44862 NodeManager
----------hadoop101----------
48291 NameNode
48438 DataNode
48694 NodeManager
48856 Jps
----------execute "jps" in cluster takes 3 seconds----------
[tomandersen@hadoop101 hadoop]$
[tomandersen@hadoop101 hadoop]$