Python 在GKE中使用子进程时出现SPARK_HOME错误

Python 在GKE中使用子进程时出现SPARK_HOME错误,python,pyspark,google-kubernetes-engine,Python,Pyspark,Google Kubernetes Engine,我是Spark的新手,我想在GKE中部署一个PySpark脚本。 该程序只需调用另一个子python文件sub.py,即可在GCS bucket中创建数据库和表 main.py: 导入操作系统 导入系统 导入子流程 #使用subprocess调用sub.py,实际url已被屏蔽 logs=subprocess.check_输出(“python/sub.py”, shell=True)。解码('utf8') #打印日志 打印(日志) sub.py: 从os.path导入abspath 导入子流程

我是Spark的新手,我想在GKE中部署一个PySpark脚本。 该程序只需调用另一个子python文件
sub.py
,即可在GCS bucket中创建数据库和表

main.py

导入操作系统
导入系统
导入子流程
#使用subprocess调用sub.py,实际url已被屏蔽
logs=subprocess.check_输出(“python/sub.py”,
shell=True)。解码('utf8')
#打印日志
打印(日志)
sub.py

从os.path导入abspath
导入子流程,系统
从pyspark.sql导入SparkSession
从pyspark.sql导入行
从pyspark.sql.types导入StringType、StructType、StructField
#创建名为myDB的数据库和名为myTable的表
如果名称=“\uuuuu main\uuuuuuuu”:
火花=火花会话\
建筑商先生\
.appName(“Python Spark SQL基本示例”)\
.config(“spark.some.config.option”、“some value”)\
.enableHiveSupport()\
.getOrCreate()
sql(“如果myDB位置'gs://my bucket/myDB'不存在,则创建数据库”)
sql(“使用myDB”)
sql(“使用配置单元创建不存在的表myTable(key INT,value STRING))
spark.stop()
yaml文件是:

apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
  name: my-app
  namespace: default
spec:
  type: Python
  pythonVersion: "2"
  mode: cluster
  image: "gcr.io/<GCP-Project-Name>/<Image-of-these-2-py-files>"
  imagePullPolicy: Always
  mainApplicationFile: local:///opt/<xxx>/main.py
  sparkVersion: "3.0.0"
  hadoopConf:
    fs.gs.impl: com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem
    fs.gs.project.id: <GCP-Project-Name>
    fs.gs.system.bucket: <my-bucket>
    google.cloud.auth.service.account.enable: "true"
    google.cloud.auth.service.account.json.keyfile: <xxx>/my-service-acct-key.json
  restartPolicy:
    ...
  driver:
    ...
  executor:
    ...
apiVersion:“sparkoperator.k8s.io/v1beta2” 种类:SparkApplication 元数据: 名称:我的应用程序 名称空间:默认值 规格: 类型:Python Python转换:“2” 模式:集群 图像:“gcr.io/” imagePullPolicy:始终 主应用程序文件:local:///opt//main.py sparkVersion:“3.0.0” hadoopConf: fs.gs.impl:com.google.cloud.hadoop.fs.gcs.googlehadoop文件系统 fs.gs.project.id: fs.gs.system.bucket: google.cloud.auth.service.account.enable:“true” google.cloud.auth.service.account.json.keyfile:/my-service-acct-key.json 重新启动策略: ... 司机: ... 执行人: ... 问题 我遇到如下错误

File "xxx/sub.py", line 3, in <module>
    from pyspark.sql.functions import SparkSession
  File "/opt/spark/python/lib/pyspark.zip/pyspark/__init__.py", line 53, in <module>
  File "/opt/spark/python/lib/pyspark.zip/pyspark/rdd.py", line 34, in <module>
  File "/opt/spark/python/lib/pyspark.zip/pyspark/java_gateway.py", line 31, in <module>
  File "/opt/spark/python/lib/pyspark.zip/pyspark/find_spark_home.py", line 68
    print("Could not find valid SPARK_HOME while searching {0}".format(paths), file=sys.stderr)

SyntaxError: invalid syntax
Traceback (most recent call last):
  File "/opt/spark/examples/src/main/python/main.py", line 6, in <module>
    shell=True).decode('utf8')
  File "/usr/lib/python3.7/subprocess.py", line 395, in check_output
    **kwargs).stdout
  File "/usr/lib/python3.7/subprocess.py", line 487, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command 'python <xxx>/sub.py' returned non-zero exit status 1.
文件“xxx/sub.py”,第3行,在
从pyspark.sql.functions导入SparkSession
文件“/opt/spark/python/lib/pyspark.zip/pyspark/_init__.py”,第53行,在
文件“/opt/spark/python/lib/pyspark.zip/pyspark/rdd.py”,第34行,在
文件“/opt/spark/python/lib/pyspark.zip/pyspark/java_gateway.py”,第31行,在
文件“/opt/spark/python/lib/pyspark.zip/pyspark/find_spark_home.py”,第68行
打印(“搜索{0}时找不到有效的SPARK_HOME”。格式(路径),文件=sys.stderr)
SyntaxError:无效语法
回溯(最近一次呼叫最后一次):
文件“/opt/spark/examples/src/main/python/main.py”,第6行,在
shell=True)。解码('utf8')
文件“/usr/lib/python3.7/subprocess.py”,第395行,在check_输出中
**kwargs)stdout
文件“/usr/lib/python3.7/subprocess.py”,第487行,正在运行
输出=标准输出,标准输出=标准输出)
subprocess.CalledProcessError:命令“python/sub.py”返回非零退出状态1。
我不明白为什么会有
SPARK\u HOME
问题。 但是,当我试图从yaml文件调用
sub.py
时,它起作用了。 我想知道两者之间的区别

  • 从Yaml调用python
  • 来自子流程

如果我必须使用
main.py
调用
sub.py

中也有类似的行为,但仍然不确定在使用子流程场景时如何修复此路径。是否有任何特定的原因需要在GKE中部署PySpark脚本,而不是使用在中显式开发的产品GCP运行这些脚本吗?我建议你去看看。有很多问题,使用设计用于运行这些脚本的显式产品可能会缓解您发现的问题。@Jofre感谢您的评论和信息。实际上,Dataproc是考虑因素之一,我已经验证了它可以解决子流程问题。我想在GKE上使用PySpark的原因是,我试图让应用程序跨不同的云服务提供商部署,例如Azure/Aws