AWS EMR集群中Minimal PySpark创建Spark Context失败
嘿,这个问题我在EMR上碰到过好几次了——你遇到的py4j.protocol.Py4JJavaError本质是Hadoop Yarn客户端的依赖缺失:具体是com.sun.jersey.api.client.config.ClientConfig这个类找不到,这在EMR的Minimal PySpark配置里特别常见,因为Minimal版本会砍掉不少非核心依赖,而Yarn的TimelineClient刚好需要这些Jersey相关的类。
给你几个实用的解决办法,按需选择:
方案1:提交作业时手动补充依赖
直接在启动PySpark或者提交作业时,通过--jars参数把缺失的Jersey包加进去。这些包在EMR集群的Hadoop lib目录里已经存在,不用额外下载,比如:pyspark --jars /usr/lib/hadoop/lib/jersey-client-1.9.jar,/usr/lib/hadoop/lib/jersey-core-1.9.jar,/usr/lib/hadoop/lib/jersey-json-1.9.jar如果是用
spark-submit提交脚本,同样加上这个--jars参数就行。方案2:禁用Yarn Timeline Service
如果你的作业不需要Yarn的Timeline服务(用来追踪应用运行状态的功能),直接禁用它就能绕过这个依赖问题。你可以:- 修改集群上的
spark-defaults.conf文件,添加配置:spark.yarn.timelineService.enabled false - 或者在创建EMR集群的时候,通过配置参数直接设置:在集群创建的配置项里,给Spark添加
yarn.timeline-service.enabled = false的参数。
- 修改集群上的
方案3:切换到标准PySpark配置
如果集群资源足够,最简单的办法就是放弃Minimal版本,改用EMR的标准Spark配置。标准配置会包含所有必要的Hadoop依赖,不会出现这类缺失问题。在创建EMR集群时,选择Spark应用程序而不是Spark (Minimal)就可以了。
不管选哪个方案,修改后都可以尝试初始化SparkContext验证一下,比如在PyShell里执行:
from pyspark import SparkContext sc = SparkContext.getOrCreate()
如果没有再抛出那个错误,就说明问题解决啦。
内容的提问来源于stack exchange,提问作者Jorge Leitao

