Python 在GKE中使用子进程时出现SPARK_HOME错误
我是Spark的新手,我想在GKE中部署一个PySpark脚本。 该程序只需调用另一个子python文件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 导入子流程
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