[ 
https://issues.apache.org/jira/browse/SPARK-60365?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18128918#comment-18128918
 ] 

Lisa Cao commented on SPARK-60365:
----------------------------------

The forms that work are documented in the Spark Connect programming guide 
proposed in https://github.com/apache/spark/pull/59613 (the "Where a scheduler 
expects spark-submit" section). A fix in PythonRunner can follow separately.

> spark-submit --remote does not pass the connection string to Python 
> applications unless spark.api.mode=connect
> --------------------------------------------------------------------------------------------------------------
>
>                 Key: SPARK-60365
>                 URL: https://issues.apache.org/jira/browse/SPARK-60365
>             Project: Spark
>          Issue Type: Bug
>          Components: Connect, PySpark
>    Affects Versions: 4.2.0, 4.3.0, 4.1.3
>            Reporter: Lisa Cao
>            Priority: Major
>
> Running a Python application through {{spark-submit --remote sc://host:port 
> app.py}} fails on a stock distribution:
> {code}
> pyspark.errors.exceptions.base.PySparkRuntimeError: [MASTER_URL_NOT_SET] A 
> master URL must be set in your configuration.
> {code}
> The application contains only {{SparkSession.builder.getOrCreate()}}. 
> {{--remote}} is accepted by {{SparkSubmitArguments}} and lands in 
> {{spark.remote}}, but {{PythonRunner}} decides how to launch the Python 
> process from {{spark.api.mode}}, whose default is {{classic}}:
> {code:scala}
> val apiMode = sparkConf.get(SPARK_API_MODE).toLowerCase(Locale.ROOT)
> val isAPIModeClassic = apiMode == "classic"
> ...
> if (sparkConf.getOption("spark.remote").isEmpty || isAPIModeClassic) {
>   gatewayServer = Some(new Py4JServer(sparkConf))   // classic launch
>   ...
> }
> ...
> if (isAPIModeClassic) {
>   sparkConf.getOption("spark.master").foreach(url => env.put("MASTER", url))
> } else {
>   sparkConf.getOption("spark.remote").foreach(url => env.put("SPARK_REMOTE", 
> url))
> }
> {code}
> With the default API mode the runner starts a Py4J gateway and exports 
> {{MASTER}} (unset, because {{--remote}} and {{--master}} are mutually 
> exclusive) instead of {{SPARK_REMOTE}}. The Python side then builds a classic 
> session and fails.
> Reproduced with the 4.3.0 binary distribution against a Spark Connect server 
> on a different port, and inside the {{apache/spark:4.2.0}} and 
> {{apache/spark:4.1.3}} images against their own server.
> Forms that work:
> * {{spark-submit --remote sc://host:port --conf spark.api.mode=connect 
> app.py}}
> * {{SPARK_CONNECT_MODE=1 spark-submit --remote sc://host:port app.py}}
> * {{SPARK_REMOTE=sc://host:port spark-submit app.py}} (the Python process 
> inherits the variable)
> * {{spark-submit --remote sc://host:port --class Main app.jar}} (JVM 
> applications are unaffected)
> Expected: {{--remote}} alone should launch the Python application as a Spark 
> Connect client, as the {{--remote}} help text ({{URL to connect to the server 
> for Spark Connect}}) describes. Proposed fix: in {{PythonRunner}}, treat a 
> set {{spark.remote}} as Connect mode regardless of {{spark.api.mode}} (skip 
> the gateway, export {{SPARK_REMOTE}}), or reject the combination with a clear 
> error.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to