问题描述
我可以毫无问题地使用 kedro run
命令运行我的管道。出于某种原因,我无法再从 Jupyter Notebook 访问我的上下文和目录。当我运行 kedro jupyter notebook
并在选择“新建”时使用我的项目名称启动一个新的(或现有的)笔记本时,出现以下错误:
context
NameError: name 'context' is not defined
catalog.list()
NameError: name 'catalog' is not defined
编辑:
运行魔法命令 %kedro_reload
后,我可以看到我的 ProjectContext init_spark_session 正在寻找 project_name/notebooks 而不是 project_name/src 中的文件。我尝试使用 %cd ../src
和 os.ch_dir('../src')
在我的 Jupyter Notebook 会话中更改工作目录,但 kedro 仍然在 notebooks 文件夹中查找:
%kedro_reload
java.io.FileNotFoundException: File file:/Users/user_name/Documents/app_name/kedro/notebooks/dist/project_name-0.1-py3.8.egg does not exist
_spark_session.sparkContext.addPyFile()
找错地方了。当我从 ProjectContext 中注释掉这一行时,此错误消失了,但我收到另一个关于在尝试从目录加载数据集时无法找到我的 Oracle 驱动程序的错误:
df = catalog.load('dataset')
java.lang.classNotFoundException: oracle.jdbc.driver.OracleDriver
编辑 2:
供参考:
kedro/src/project_name/context.py
def init_spark_session(self) -> None:
"""Initialises a SparkSession using the config defined in project's conf folder."""
# Load the spark configuration in spark.yaml using the config loader
parameters = self.config_loader.get("spark*","spark*/**")
spark_conf = SparkConf().setAll(parameters.items())
# Initialise the spark session
spark_session_conf = (
SparkSession.builder.appName(self.package_name)
.enableHiveSupport()
.config(conf=spark_conf)
)
_spark_session = spark_session_conf.getorCreate()
_spark_session.sparkContext.setLogLevel("WARN")
_spark_session.sparkContext.addPyFile(f'src/dist/project_name-{__version__}-py3.8.egg')
kedro/conf/base/spark.yml:
# You can define spark specific configuration here.
spark.driver.maxResultSize: 8g
spark.hadoop.fs.s3a.impl: org.apache.hadoop.fs.s3a.S3AFileSystem
spark.sql.execution.arrow.pyspark.enabled: true
# https://kedro.readthedocs.io/en/stable/11_tools_integration/01_pyspark.html#tips-for-maximising-concurrency-using-threadrunner
spark.scheduler.mode: FAIR
# JDBC driver
spark.jars: drivers/ojdbc8-21.1.0.0.jar
解决方法
我认为结合使用这些方法可能会对您有所帮助:
- 通常,让我们尽量避免手动干扰当前工作目录,因此让我们删除笔记本中的
os.chdir
。尽可能构建绝对路径。 - 在您的
init_spark_session
中,当addPyFile
时,请改用绝对路径。self.project_path
指向您的 Kedro 项目的根目录,因此您可以使用它来相应地构建 PyFile 的路径,例如_spark_session.sparkContext.addPyFile(f'{self.project_path}/src/dist/project_name-{__version__}-py3.8.egg')
虽然不确定为什么需要添加 PyFile,但也许您有特定的原因。