为何RDD.map中的代码在YARN模式下无法执行?
排查Spark任务在YARN模式下失败的问题(本地模式正常)
从你描述的场景来看,本地能正常运行但YARN模式下掉链子,最常见的坑是依赖缺失或者序列化问题,咱们一步步拆解排查:
1. 先查依赖打包问题
你的transformations.transform是自定义方法对吧?本地模式下Spark能直接读取本地的class文件,但提交到YARN后,集群Worker节点根本找不到这个类的字节码,大概率会抛出ClassNotFoundException。
解决办法:
- 如果你用sbt/maven构建项目,一定要把
transformations类所在的代码打包成包含所有依赖的胖jar;或者通过spark-submit的--jars参数,把包含这个类的jar包明确传给集群:spark-submit \ --master yarn \ --deploy-mode cluster \ --driver-memory 16G \ --executor-memory 16G \ --executor-cores 4 \ --jars /path/to/your-transformations-jar-file.jar \ /path/to/your-main-application.jar - 要是用spark-shell或者本地脚本测试,记得把自定义类所在的目录同时加到
spark.driver.extraClassPath和spark.executor.extraClassPath配置里。
2. 检查序列化是否合规
Spark在YARN模式下需要把任务相关对象序列化后传输到Worker节点,如果transformations类没实现Serializable接口,直接会炸NotSerializableException。
你可以检查下类的定义:
// 必须让类实现Serializable接口 class transformations extends Serializable { def transform(rec: String): String = { val parts = rec.split(",") val dateStr = parts(2).trim // 转换dd/mm/yyyy到mm/dd/yy val Array(day, month, year) = dateStr.split("/") s"$month/$day/${year.takeRight(2)}" } }
要是用的Scala单例对象,虽然默认实现了Serializable,但如果里面有非序列化的成员变量,同样会出问题。
3. 看YARN日志才是硬道理
别瞎猜,直接扒日志找具体错误:
- 先记下任务的Application ID(比如
application_1620000000000_0001) - 用命令拉取Application Master的日志:
yarn logs -applicationId application_1620000000000_0001 - 或者直接在Hortonworks的Ambari管理界面里,找到YARN服务的Applications页面,定位到你的任务后点击查看Logs。
日志里肯定会有明确的异常信息——是类找不到?序列化失败?还是日期格式解析时数组越界(比如集群数据里有脏数据,和本地测试的格式不一样)?
4. 给日期转换逻辑加个“安全垫”
虽然本地测试正常,但难保集群上的RDD数据有脏数据(比如有的记录日期格式不对、字段缺失),直接硬编码split会抛出异常导致任务失败。可以给transform方法加个异常处理:
def transform(rec: String): String = { try { val parts = rec.split(",") if (parts.length < 3) return rec // 处理字段不完整的记录 val dateStr = parts(2).trim val Array(day, month, year) = dateStr.split("/") s"$month/$day/${year.takeRight(2)}" } catch { case e: Exception => println(s"Failed to process record: $rec, error: ${e.getMessage}") rec // 返回原记录或者默认值,避免整个任务挂掉 } }
5. 最后检查YARN资源配置
你配置了16GB内存+4核,要确保集群Worker节点有足够资源:
- 每个Worker节点的可用内存要大于
executor-memory加上预留内存 - 每个Worker节点的可用核数要大于
executor-cores - 可以在Ambari里查看YARN的
yarn.nodemanager.resource.memory-mb和yarn.nodemanager.resource.cpu-vcores配置,确认是否满足你的需求。
优先从依赖打包和日志排查入手,这俩是YARN模式下最容易踩的坑,应该能快速定位问题。
内容的提问来源于stack exchange,提问作者Pyd
相关产品推荐
相关产品推荐

