分享

Spark on Yarn遇到的几个问题

 codingparty 2014-08-10

1 概述

Spark的on Yarn模式,其资源分配是交给Yarn的 ResourceManager 来进行管理的,但是目前的Spark版本,Application日志的查看,只能通过Yarn的 yarn logs 命令实现。

在部署和运行Spark Application的过程中,如果不注意一些小的细节,也许会导致一些问题的出现。

2 防火墙

部署好Spark的包和配置文件,on yarn的两种模式都无法运行,在NodeManager端的日志都是说 Connection Refused ,连接不上Driver所在的客户端节点,但是客户端的80端口可以正常访问! 检查防火墙 ,果然客户端只开启的对80端口的访问,其他都禁止了!如果你的程序在运行的时候也有类似连接被拒绝的情况,最好也是先检查下防火墙的配置!

3 Spark Driver程序host的指定

部署完Spark后,分别使用yarn-cluster模式和yarn-client模式运行Spark自带的计算pi的示例。

Spark的一些配置文件除了一些基本属性外,均未做配置,结果运行的时候两种运行模式出现了不同的状况。 yarn-cluster模式可以正常运行,yarn-client模式总是运行失败 。查看ResourceManager、NodeManager端的日志,发现程序总是找不到ApplicationMaster,这就奇怪了!并且,客户端的Driver程序开启的端口,在NodeManager端访问被拒绝!非Spark的其他MR任务,能够正常执行。

检查客户端配置文件,发现原来在客户端的 /etc/hosts 文件中,客户端的一个IP对应了多个Host,Driver程序会默认去取最后对应的那个Host,比如是hostB,但是在NodeManager端是配置的其他Host,hostA,所以导致程序无法访问。为了不影响其他的程序使用客户端的Host列表,这里在Spark配置文件 spark-defaults.conf 中使用属性 spark.driver.host 来指定yarn-client模式运行中和Yarn通信的DriverHost,此时yarn-client模式可以正常运行。

上面配置完了之后,发现yarn-cluster模式又不能运行了!想想原因,肯定是上面那个配置参数搞的鬼,注释掉之后,yarn-cluster模式可以继续运行。原因是,yarn-cluster模式下,spark的入口函数是在客户端运行,但是Driver的其他功能是在ApplicationMaster中运行的,上面的那个配置相当于指定了ApplicationMaster的地址,实际上的ApplicationMaster在yarn-master模式下是由 ResourceManager 随机指定的。

4 on  Yarn日志的查看

测试环境下,通过 yarn logs -applicationId xxx 可以查看运行结束的Application的日志,但是搞到另一个环境下发现使用上述命令查看日志时,总是提示如下信息:

Logs not available at /tmp/nm/remote/logs/hadoop/logs/application_xxx_xxx

Log aggregation has not completed or is not enabled.

去对应的NodeManger目录下,确实找不到日志文件。但是/tmp/nm/remote/logs却是在yarn-site.xml中指定了的目录,这个是对的,到底什么原因呢?难道是Yarn的日志聚集没有起作用?

去NodeManager上查看对应Application的日志:

2014-08-04 09:14:47,513 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation.AppLogAggregatorImpl: Starting aggregate log-file for app application_xxx_xxx at /tmp/nm/remote/logs/spark/logs/application_xxx_xxx/hostB.tmp

2014-08-04 09:14:47,525 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation.AppLogAggregatorImpl: Uploading logs for container container_xxx_xxx_01_000007. Current good log dirs are /data/nm/log

2014-08-04 09:14:47,526 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation.AppLogAggregatorImpl: Uploading logs for container container_xxx_xxx_000001. Current good log dirs are /data/nm/log

2014-08-04 09:14:47,526 INFO org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor: Deleting path : /data/nm/log/application_xxx_xxx

2014-08-04 09:14:47,607 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation.AppLogAggregatorImpl: Finished aggregate log-file for app application_xxx_xxx

可见,日志聚集确实起作用了,但是为什么通过命令不能查看!猛然见看到日志中“ /tmp/nm/remote/logs/spark/logs/ application_xxx_xxx/hostB.tmp ”,日志的路径有问题, 在使用yarn logs命令查看的时候,用的是hadoop用户,实际Spark Application的提交执行用的是spark用户,而yarn logs命令默认去找的是当前用户的路径 ,这就是查看不到日志的原因。切换到spark用户再查看,日志终于出来了!

5 小节

问题是比较严重,Application都直接无法运行了,但是引起问题的原因都比较小,归根结底还是部署的时候环境较为复杂,不够仔细!再接再砺!以后遇到相关的问题,会再这里持续更新,方便自己,也方便遇到类似问题的朋友们!

-------------------------------------------------------------------------------

如果您看了本篇博客,觉得对您有所收获,请点击右下角的  [推荐]

如果您想转载本博客, 请注明出处

如果您对本文有意见或者建议,欢迎留言

感谢您的阅读,请关注我的后续博客

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多