Jupyter Notebook 中缺少 Kedro 上下文和目录

问题描述

我可以毫无问题地使用 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 ../srcos.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,但也许您有特定的原因。