YARN, MR History Server和Spark History Server

本文解析了YARN、MRHistoryServer及SparkHistoryServer的区别,阐述了为何它们各自需要独立的HistoryServer。同时介绍了如何配置并启动SparkHistoryServer,以及YARN如何统一管理容器日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

YARN, MR History Server和Spark History Server三者的区别:

今天听到有人说, "Yarn自带的History Server"如何如何之类的。看来还有很多人把history server当做是为YARN的应用提供服务的功能。

所以我想,还是有必要梳理一下YARN, YARN中的history server,以及spark的history server。

YARN是一个通用的计算资源管理平台,它将计算资源抽象为container,分配给应用执行计算task。

在YARN的发布包中,同时发布了MapReduce2,也就是可以运行在YARN上的移植版本。而YARN中的history server,其实是针对MR的,并非是针对YARN通用平台的服务。所以,针对这个history server的配置项,其实都是在mapred-site.xml中进行配置的。

同样,Spark程序如果也想跑在YARN上,并且有自己的应用状态监控平台,那么Spark也就需要有自己的history server。

为何YARN不能提供统一的history server, 而需要MR和Spark分别都有自己的history server呢? 这时因为,不同的计算模型,其计算task的模式是完全不同的, MR是分map和reduce的, Spark是分stage的, 完全不同,当然需要自己的history server。

介绍一下如何启动Spark history server:

  1 配置:

     spark-defaults.conf中:
         spark.eventLog.enabled           true
         spark.eventLog.dir               hdfs://localhost:8020/tmp/spark_historyserver_event

     spark-env.sh中:

         export SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://localhost:8020/tmp/spark_historyserver"

 2 启动spark historyserver:

    sh start-history-server.sh hdfs://localhost:8020/tmp/spark_historyserver_event;

关于yarn.log.server.url参数:

上面说到, 虽然spark和MR的模型不同,都有自己的historyserver, 但是有一个是相通的,就是都是在YARN上运行, 每个container有统一的日志存放地址;

YARN在这里做了一个容易让人混淆的事情,就是YARN把container日志查询和查看的方式,做到MR的historyserver中了.

相当于是MR的historyserver提供了一个功能: 根据containerid或者applicationid,查询日志.

所以,YARN提供了yarn.log.server.url参数,指定查询日志的url,就是下面的配置:
    <property>

        <name>yarn.log.server.url</name>
        <value>http://localhost:19888/jobhistory/logs/</value>
    </property>

由于是YARN提供的,所以这个配置项放在: yarn-site.xml里.

所以,就好理解官方文档中如下的话了:

1 The logs are also available on the Spark Web UI under the Executors Tab. 

2 You need to have both the Spark history server and the MapReduce history server running and configure yarn.log.server.url in yarn-site.xml properly. The log URL on the Spark history server UI will redirect you to the MapReduce history server to show the aggregated logs.

如果配置了上面的参数, 在Spark的history server中的"Executors"Tab页面, 可以帮你重定向到MapReduce history server中以及聚合的日志.

从源码上看, YARN中的代码是这样的(在NMController.java):
    String logServerUrl = nmConf.get(YarnConfiguration.YARN_LOG_SERVER_URL);
    String redirectUrl = null;
    if (logServerUrl == null || logServerUrl.isEmpty()) {
        redirectUrl = "false";
    } else {
        redirectUrl = url(logServerUrl, nmContext.getNodeId().toString(), containerIdStr,
            containerIdStr, $(APP_OWNER));

    }

<think>嗯,用户问的是关于sbin/start-history-server.sh启动失败的问题。我需要根据提供的引用资料来分析可能的原因解决方案。首先,先看看引用内容里提到了哪些相关信息。 引用[1]提到启动历史服务器时无法正常启动,报错。然后他们启动masterworker,接着启动历史服务。可能的问题可能Spark的配置有关,或者依赖的服务没有启动。比如,如果Hadoop的JobHistory Server没有启动Spark的历史服务可能依赖这个? 引用[2][3]提到用mr-jobhistory-daemon.sh start historyserver启动Hadoop的JobHistory服务。这说明在Hadoop环境中,JobHistory Server可能需要手动启动,而如果没有启动的话,Spark的历史服务器可能无法正常工作,导致启动失败。所以用户可能没有启动Hadoop的JobHistory Server,需要先启动这个服务。 引用[4]提到新版的Hadoop脚本在sbin下,旧的start-all.sh已经废弃。可能用户使用的版本不同,或者路径配置有问题。比如,可能环境变量没有正确设置,导致找不到相关的脚本或者配置文件。 引用[5]是关于Hadoop的start-dfs.sh执行后NameNode未启动的问题,这说明有时候服务启动失败可能是因为依赖的进程没有正确启动。比如,HDFS的NameNode或DataNode没有启动,导致历史服务器无法访问所需的存储。 所以综合起来,可能的失败原因有几个方向: 1. Hadoop的JobHistory Server启动。需要先用mr-jobhistory-daemon.sh启动这个服务,然后再启动Spark的历史服务器。 2. 配置文件错误,比如spark-defaults.conf中的事件日志路径配置不正确,或者Hadoop的配置有误。 3. 端口冲突,历史服务器默认端口被占用,需要检查端口18080是否可用。 4. 权限问题,比如日志目录的权限不足,Spark无法写入事件日志。 5. 依赖服务未启动,比如HDFS的NameNode或YARN的ResourceManager没有运行,导致历史服务器无法获取必要的信息。 解决方案步骤可能包括: - 检查并启动Hadoop的JobHistory Server,使用提供的命令。 - 验证SparkHadoop的配置文件是否正确,特别是事件日志路径端口设置。 - 检查端口占用情况,更换端口或释放被占用的端口。 - 确保日志目录存在且有正确的权限。 - 确保HDFSYARN的相关服务已经启动。 用户可能需要按照这些步骤逐一排查,先启动Hadoop的JobHistory,再检查Spark配置,然后处理权限端口问题。同时,查看具体的错误日志可以帮助确定具体原因,比如通过查看Spark的日志文件中的报错信息。</think>### 原因分析 `sbin/start-history-server.sh` 启动失败可能由以下原因导致: 1. **Hadoop JobHistory Server启动** Spark历史服务依赖Hadoop的JobHistory Server来展示完整作业日志。若未启动该服务,会直接导致启动失败[^3]。 2. **配置文件缺失或错误** - Spark未正确配置事件日志路径(`spark.eventLog.enabled` `spark.eventLog.dir`)[^1]。 - Hadoop配置文件(如`core-site.xml`、`hdfs-site.xml`)中HDFS地址或端口未正确设置[^5]。 3. **端口冲突或权限问题** - 默认端口`18080`被占用。 - 日志目录(如`hdfs:///spark-logs`)权限不足,导致无法写入事件日志[^1]。 4. **依赖服务未运行** HDFS的NameNode、DataNode或YARN的ResourceManager未启动。 --- ### 解决方案 #### 步骤1:启动Hadoop JobHistory Server 执行以下命令(需在Hadoop安装目录下): ```bash mr-jobhistory-daemon.sh start historyserver ``` 验证是否启动成功: ```bash jps # 查看进程列表中应有 JobHistoryServer ``` 若未启动,检查Hadoop配置并确保YARN已运行[^2]。 #### 步骤2:检查Spark事件日志配置 编辑`$SPARK_HOME/conf/spark-defaults.conf`,确保包含以下配置: ``` spark.eventLog.enabled true spark.eventLog.dir hdfs://<namenode>:8020/spark-logs ``` 替换`<namenode>`为实际HDFS NameNode地址,并创建目录: ```bash hdfs dfs -mkdir /spark-logs hdfs dfs -chmod 777 /spark-logs ``` #### 步骤3:排查端口冲突 检查端口`18080`是否被占用: ```bash netstat -tlnp | grep 18080 ``` 若冲突,修改`$SPARK_HOME/conf/spark-env.sh`中的端口: ```bash export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18081" ``` #### 步骤4:验证依赖服务 确保以下服务已启动: - HDFS: `start-dfs.sh`(验证NameNode、DataNode) - YARN: `start-yarn.sh`(验证ResourceManager、NodeManager) - Spark集群: `start-master.sh``start-workers.sh` #### 步骤5:查看日志定位问题 检查Spark历史服务日志: ```bash tail -f $SPARK_HOME/logs/spark-<user>-org.apache.spark.deploy.history.HistoryServer-<hostname>.out ``` 根据日志中的错误提示(如权限拒绝、连接超时)进一步调整配置或权限。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值