我正在尝试通过cron job提交我的pyspark代码。当我手动运行时,它工作正常。通过 cron 它不起作用。
这是我的项目结构:
my-project
|
|--src
|----jobs
|------execute_metrics.py
|----utils
|------get_spark_session.py
主要代码位于src/jobs
execute_metrics.py
。我在execute_metrics.py
中使用get_spark_session.py
使用from src.utils import get_spark_session
.
我创建了一个 shell 脚本execute_metric.sh
其中包含以下内容,用于执行 cron 作业
#!/bin/bash
PATH=<included entire path here>
spark-submit <included required options> src/jobs/execute_metrics.py
my-project
|
|--src
|----jobs
|------execute_metrics.py
|----utils
|------get_spark_session.py
|--execute_metric.sh
当我使用./execute_metric.sh
运行此 shell 脚本时,我能够看到结果。
现在,我需要它来每分钟运行作业。因此,我创建了一个包含以下内容的cron文件并复制到同一目录中
* * * * * ./execute_metric.sh > execute_metric_log.log
my-project
|
|--src
|----jobs
|------execute_metrics.py
|----utils
|------get_spark_session.py
|--execute_metric.sh
|--execute_cron.crontab
这个 cron 每分钟都在运行一次,但给了我错误:ModuleNotFoundError: No module named 'src'
有人可以告诉我这里出了什么问题吗?
提前致谢
你的模块目录没有进入python路径。请尝试以下操作之一:
显式设置PYTHONPATH
:
#!/bin/bash
PATH=<included entire path here>
PYTHONPATH=somewhere/my-project/src
spark-submit <included required options> src/jobs/execute_metrics.py
从项目目录中调用 Spark 外壳:
#!/bin/bash
PATH=<included entire path here>
cd somewhere/my-project/src
spark-submit <included required options> execute_metrics.py
我通过在项目目录中添加一个main.py
文件来修复它,并将我的cron更改为执行main.py
。项目结构现在如下所示:
my-project
|
|--src
|----jobs
|------execute_metrics.py
|----utils
|------get_spark_session.py
|--execute_metric.sh
|--execute_cron.crontab
|--main.py
在main.py
中,我调用了execute_metrics.py
的函数。