AWS EMR 中的最小 PySpark 无法创建火花上下文
Minimal PySpark in AWS EMR fails to create a spark context
我正在尝试在新的 AWS EMR Spark 集群中使用 PySpark,但失败并出现以下错误:
py4j.protocol.Py4JJavaError: An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext.
: java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig
at org.apache.hadoop.yarn.client.api.TimelineClient.createTimelineClient(TimelineClient.java:55)
at org.apache.hadoop.yarn.client.api.impl.YarnClientImpl.createTimelineClient(YarnClientImpl.java:181)
at org.apache.hadoop.yarn.client.api.impl.YarnClientImpl.serviceInit(YarnClientImpl.java:168)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
at org.apache.spark.deploy.yarn.Client.submitApplication(Client.scala:151)
at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:57)
at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:164)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:500)
at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:58)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:247)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
at py4j.Gateway.invoke(Gateway.java:238)
at py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:80)
at py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:69)
at py4j.GatewayConnection.run(GatewayConnection.java:214)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: com.sun.jersey.api.client.config.ClientConfig
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 20 more
我在做什么:
- 在 EMR 控制台上,创建一个新集群(
emr-5.12.1
with Spark,m4.large
,2 个实例)
- SSH 它的主人
用Python3创建一个新的virtualenv
,安装pyspark
,并创建一个上下文:
export PROJECT=example
python3 -m venv ~/.virtualenvs/$PROJECT
source ~/.virtualenvs/$PROJECT/bin/activate
pip install pyspark
export PYSPARK_PYTHON=/home/hadoop/.virtualenvs/$PROJECT/bin/python
export YARN_CONF_DIR=/etc/hadoop/conf
python -c "import pyspark; conf = pyspark.SparkConf().setMaster('yarn-client').setAppName('testing'); sc = pyspark.SparkContext(conf=conf)"
引发上述异常。
我也试过:
- 使用 Python 2 (
virtualenv ~/.virtualenvs/$PROJECT
)
- 使用默认 Python 安装,不创建任何 virtualenv。
该异常与 this issue in Spark 密切相关,但这是由旧的 Hadoop 版本(2.6、2.7)引起的,而在使用 Hadoop 的配置 emr-5.12.1
中并非如此2.8.
我在 Google 平台上复制了相同的设置,并且有效。
请注意,如果我从 shell 调用 pyspark
,它将起作用。但是master会设置local
:
pyspark
>>> sc
<SparkContext master=local[*] appName=PySparkShell>
这对分布式作业没用。
解决方案是也导出 SPARK_HOME
。 IE。在第 3 步中,使用
export SPARK_HOME=/usr/lib/spark/
export PYSPARK_PYTHON=/home/hadoop/.virtualenvs/$PROJECT/bin/python
export YARN_CONF_DIR=/etc/hadoop/conf
python -c "import pyspark; conf = pyspark.SparkConf().setMaster('yarn-client').setAppName('testing'); sc = pyspark.SparkContext(conf=conf)"
这解决了 Python 2 和 3 中的问题。
我和 HDP 有同样的问题,添加了 SPARK_HOME 作为环境变量:
os.environ["SPARK_HOME"] = '/usr/hdp/current/spark2-client'
或
export SPARK_HOME=/usr/hdp/current/spark2-client
我正在尝试在新的 AWS EMR Spark 集群中使用 PySpark,但失败并出现以下错误:
py4j.protocol.Py4JJavaError: An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext.
: java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig
at org.apache.hadoop.yarn.client.api.TimelineClient.createTimelineClient(TimelineClient.java:55)
at org.apache.hadoop.yarn.client.api.impl.YarnClientImpl.createTimelineClient(YarnClientImpl.java:181)
at org.apache.hadoop.yarn.client.api.impl.YarnClientImpl.serviceInit(YarnClientImpl.java:168)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
at org.apache.spark.deploy.yarn.Client.submitApplication(Client.scala:151)
at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:57)
at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:164)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:500)
at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:58)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:247)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
at py4j.Gateway.invoke(Gateway.java:238)
at py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:80)
at py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:69)
at py4j.GatewayConnection.run(GatewayConnection.java:214)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: com.sun.jersey.api.client.config.ClientConfig
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 20 more
我在做什么:
- 在 EMR 控制台上,创建一个新集群(
emr-5.12.1
with Spark,m4.large
,2 个实例) - SSH 它的主人
用Python3创建一个新的
virtualenv
,安装pyspark
,并创建一个上下文:export PROJECT=example python3 -m venv ~/.virtualenvs/$PROJECT source ~/.virtualenvs/$PROJECT/bin/activate pip install pyspark export PYSPARK_PYTHON=/home/hadoop/.virtualenvs/$PROJECT/bin/python export YARN_CONF_DIR=/etc/hadoop/conf python -c "import pyspark; conf = pyspark.SparkConf().setMaster('yarn-client').setAppName('testing'); sc = pyspark.SparkContext(conf=conf)"
引发上述异常。
我也试过:
- 使用 Python 2 (
virtualenv ~/.virtualenvs/$PROJECT
) - 使用默认 Python 安装,不创建任何 virtualenv。
该异常与 this issue in Spark 密切相关,但这是由旧的 Hadoop 版本(2.6、2.7)引起的,而在使用 Hadoop 的配置 emr-5.12.1
中并非如此2.8.
我在 Google 平台上复制了相同的设置,并且有效。
请注意,如果我从 shell 调用 pyspark
,它将起作用。但是master会设置local
:
pyspark
>>> sc
<SparkContext master=local[*] appName=PySparkShell>
这对分布式作业没用。
解决方案是也导出 SPARK_HOME
。 IE。在第 3 步中,使用
export SPARK_HOME=/usr/lib/spark/
export PYSPARK_PYTHON=/home/hadoop/.virtualenvs/$PROJECT/bin/python
export YARN_CONF_DIR=/etc/hadoop/conf
python -c "import pyspark; conf = pyspark.SparkConf().setMaster('yarn-client').setAppName('testing'); sc = pyspark.SparkContext(conf=conf)"
这解决了 Python 2 和 3 中的问题。
我和 HDP 有同样的问题,添加了 SPARK_HOME 作为环境变量:
os.environ["SPARK_HOME"] = '/usr/hdp/current/spark2-client'
或
export SPARK_HOME=/usr/hdp/current/spark2-client