目录
一、MapReduce收尾
1、如果启动集群发现某个节点的服务没有启动,如何解决?
如果启动集群,发现某个节点比如bigdata02中的datanode没有启动,怎么办?
方案:查看日志,看错误是什么?
2、修改完成后,可以单独启动某个服务:
hadoop-daemon.sh start namenode
新的命令是什么? hdfs --daemon start namenode
hadoop-daemon.sh start secondarynamenode
hadoop-daemon.sh start datanode
yarn --daemon start resourcemanger
yarn --daemon start nodemanger
3、main方法后面的 args数组有何作用?
package com.bigdata.day12.workcount;
import java.util.Arrays;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/8/3 9:47
* @Version 1.0
*/
public class Demo01 {
public static void main(String[] args) {
System.out.println(Arrays.toString(args));
System.out.println(args[0]);
System.out.println(args[1]);
}
}
服务器上怎么办?没有idea
需要使用jar命令:
hadoop jar wc.jar com.bigdata.day12.workcount.Demo01 /input /output
通过以上方式给args传递数据。
如果是纯java项目如何运行你的jar包?
java -jar xxxxx.jar Main方法的全路径 Main方法的参数
4、目前学了哪些端口,分别是什么?
3306 mysql连接的端口
22 windows连接linux,进行sftp访问的端口
9870 hdfs页面访问的端口号 http://192.168.32.128:9870
9820 hdfs的通讯端口 hdfs://192.168.32.128:9820
两个地方见过:java操作hdfs的时候,昨天mapreduce访问hdfs的时候
8088 yarn平台通过web访问的端口号 http://192.168.32.128:8088
二、Yarn介绍
1、理论
Apache YARN(Yet another Resource Negotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于一个分布式的操作系统平台,而MapReduce等计算程序则相当于运行于操作系统之上的应用程序。
YARN被引入Hadoop2,最初是为了改善MapReduce的实现,但是因为具有足够的通用性,同样可以支持其他的分布式计算模式,比如Spark,Tez等计算框架。
大数据技术大致分为四代:
1、MapReduce (淘汰)
2、MapReduce的升级版(Tez) (淘汰)
3、Spark(一系列的技术) 目前正在流行 运行比较快
4、Flink 正在悄悄的流行起来,代表未来(流行起来了,阿里巴巴购买的)-- 实时即未来
2、组成部分
ResourceManager:
是在系统中的所有应用程序之间管理资源的最终权威,即管理整个集群上的所有资源分配,内部含有一个Scheduler(资源调度器)
NodeManager:
是每台机器的资源管理器,也就是单个节点的管理者,负责启动和监视容器(container)资源使用情况,并向ResourceManager及其 Scheduler报告使用情况.
container:
即集群上的可使用资源,包含cpu、内存、磁盘、网络等(虚拟机,或者Docker)
AppMaster(项目经理):
实际上是框架的特定的库,每启动一个应用程序,都会启动一个AM,它的任务是与ResourceManager协商资源,并与NodeManager一起执行和监视任务。
3、Yarn的工作流程(重点)--重要程度和mr是一样的
1. 调用waitForCompletion方法每秒轮询作业的进度,内部封装了submit()方法,用于创建JobCommiter实例,并且调用其的submitJobInternal方法。提交成功后,如果有状态改变,就会把进度报告到控制台。错误也会报告到控制台。
2. JobCommiter实例会向ResourceManager申请一个新应用ID,用于MapReduce作业ID。这期间JobCommiter也会进行检查输出路径的情况,以及计算输入分片。
3. 如果成功申请到ID,就会将运行作业所需要的资源(包括作业jar文件,配置文件和计算所得的输入分片元数据文件)上传到一个用ID命名的目录下的HDFS上。此时副本个数默认是10.
4. 准备工作已经做好,再通知ResourceManager调用submitApplication方法提交作业。
5. ResourceManager调用submitApplication方法后,会通知Yarn调度器(Scheduler),调度器分配一个容器,在节点管理器的管理下在容器中启动 application master进程。
6. application master的主类是MRAppMaster,其主要作用是初始化任务,并接受来自任务的进度和完成报告。
7. 然后从HDFS上接受资源,主要是split。然后为每一个split创建MapTask以及参数指定的ReduceTask,任务ID在此时分配
8. 然后Application Master会向资源管理器请求容器,首先为MapTask申请容器,然后再为ReduceTask申请容器。
9. 一旦ResourceManager中的调度器(Scheduler),为Task分配了一个特定节点上的容器,Application Master就会与NodeManager进行通信来启动容器。
10. 运行任务是由YarnChild来执行的,运行任务前,先将资源本地化(jar文件,配置文件,缓存文件)
11. 然后开始运行MapTask或ReduceTask。
12. 当收到最后一个任务已经完成的通知后,application master会把作业状态设置为success。然后Job轮询时,知道成功完成,就会通知客户端,并把统计信息输出到控制台
三、Yarn的历史日志配置【可选项】
1、jobHistory
为什么要配置日志呢?原因是因为我们的任务不一定每次都是成功的,如果失败了,需要查阅日志,发现日志有没有配置。
我们在YARN运行MapReduce的程序的时候,任务会被分发到不同的节点,在不同的Container内去执行。如果一个程序执行结束后,我们想去查看这个程序的运行状态呢?每一个MapTask的执行细节?每一个ReduceTask的执行细节?这个时候我们是查看不到的,因此我们需要开启记录历史日志的服务。
我的日志是分散在多台电脑上的,如果任务失败了,每个节点只记录自己的那一部分,我们需要去各个节点上查阅日志,效率太低了,将这些日志聚合在一起就好了。所以我们还需要配置日志聚合服务。
历史日志服务开启之后,Container在运行任务的过程中,会将日志记录下来,保存到当前的节点。例如: 在bigdata02节点上开启了一个Container去执行MapTask,那么此时就会在bigdata02的$HADOOP_HOME/logs/userlogs中记录下来日志。我们可以到不同的节点上去查看日志。虽然这样可以查看,但是很不方便!因此,我们一般还会开启另外的一个服务: 日志聚合。顾名思义,就是将不同节点的日志聚合到一起保存起来。
配置:
<!-- 添加如下配置 -->
<!-- 历史任务的内部通讯地址 -->
<property>
<name>MapReduce.jobhistory.address</name>
<value>bigdata01:10020</value>
</property>
<!--历史任务的外部监听页面-->
<property>
<name>MapReduce.jobhistory.webapp.address</name>
<value>bigdata01:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/opt/installs/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/opt/installs/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/opt/installs/hadoop</value>
</property>
<!-- 添加如下配置 -->
<!-- 是否需要开启日志聚合 -->
<!-- 开启日志聚合后,将会将各个Container的日志保存在yarn.nodemanager.remote-app-log-dir的位置 -->
<!-- 默认保存在/tmp/logs -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 历史日志在HDFS保存的时间,单位是秒 -->
<!-- 默认的是-1,表示永久保存 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://bigdata01:19888/jobhistory/logs</value>
</property>
将mapred-site.xml 和yarn-site.xml 分发到其他两台上。
cd /usr/local/hadoop/etc/hadoop/
xsync.sh mapred-site.xml yarn-site.xml
重启yarn服务:
stop-dfs.sh
start-dfs.sh
还要记得启动history服务:
mapred --daemon start historyserver
运行一个yarn的任务,随便一个即可:
hadoop jar /opt/installs/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /home/wc.txt /home/output4
访问我的yarn平台:http://192.168.32.128:8088
会看到一个运行的任务,点击这个任务就可以查看日志了:
点完之后,发现不管用,你可以查看一下你的URL是什么?
因为windows电脑上,压根不知道bigdata01 对应的IP是多少。所以访问不了。
在Linux上我们知道bigdata01对应的IP是多少,因为我们配置了hosts文件。
此时需要修改windows上的 hosts文件。为了更加方便的修改windows上的hosts,可以使用一个工具:
SwitchHosts。
先关闭电脑上的各种杀毒软件,因为有一种病毒是专门修改hosts文件的。
右键,以管理员身份运行这个软件。否则修改不了。
修改完之后,就可以点击logs 链接了。
也可以直接修改host文件,地址在:
C:\Windows\System32\drivers\etc
2、timeline(时间轴服务)--了解
配置日志信息。
JobHistory服务,只针对于MR应用程序,Spark,Tez等这样的服务,是无法看到日志的。
这个工具或者服务,不仅可以查看MapReduce,还可以查看Spark应用程序的日志。
目前位置,Timeline Server有V1、V1.5、V2三种版本,其中V2的版本正在测试中,功能尚不完善,且后端依赖HBase。所以目前我们以V1.5的版本为例。
<property>
<name>yarn.timeline-service.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.system-metrics-publisher.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.timeline-service.generic-application-history.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.timeline-service.hostname</name>
<value>bigdata01</value>
</property>
<property>
<name>yarn.timeline-service.bind-host</name>
<value>bigdata01</value>
</property>
<property>
<name>yarn.timeline-service.http-cross-origin.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.timeline-service.ttl-enable</name>
<value>true</value>
</property>
<!-- 保存35天 -->
<property>
<name>yarn.timeline-service.ttl-ms</name>
<value>3024000000</value>
</property>
<!-- 设置log server地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://bigdata01:8188/applicationhistory/logs</value>
</property>
将yarn-site.xml 分发到其他两台电脑上。
重启yarn服务:
stop-yarn.sh
start-yarn.sh
// 记得启动我们的时间轴服务:
yarn --daemon start timelineserver
访问地址:http://192.168.32.128:8188
如何查看日志呢?
记得演示一个mapreduce任务