Jupyter笔记本中缺少Kedro上下文和目录

Jupyter笔记本中缺少Kedro上下文和目录,kedro,Kedro,我可以使用kedro run命令毫无问题地运行管道。但由于某些原因,我无法再从Jupyter笔记本访问我的上下文和目录。当我运行kedro jupyter笔记本并在选择“新建”时使用我的项目名称启动新(或现有)笔记本时,我会收到以下错误: context NameError: name 'context' is not defined catalog.list() 编辑: 运行magic命令%kedro\u reload后,我可以看到我的ProjectContext init\u spark\

我可以使用
kedro run
命令毫无问题地运行管道。但由于某些原因,我无法再从Jupyter笔记本访问我的上下文和目录。当我运行kedro jupyter笔记本并在选择“新建”时使用我的项目名称启动新(或现有)笔记本时,我会收到以下错误:

context

NameError: name 'context' is not defined
catalog.list()

编辑:

运行magic命令
%kedro\u reload
后,我可以看到我的ProjectContext init\u spark\u会话正在project\u name/notebooks中查找文件,而不是project\u name/src。我尝试用
%cd../src
os.ch_dir('../src')
更改Jupyter笔记本会话中的工作目录,但kedro仍在笔记本文件夹中查找:

%kedro\u重新加载

java.io.FileNotFoundException: File file:/Users/user_name/Documents/app_name/kedro/notebooks/dist/project_name-0.1-py3.8.egg does not exist
\u spark\u session.sparkContext.addPyFile()
找错了位置。当我从ProjectContext中注释掉这一行时,此错误消失,但我收到另一个错误,即在尝试从目录加载数据集时无法找到Oracle驱动程序:

df=catalog.load('dataset')

编辑2:

供参考:

kedro/src/project\u 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\u spark\u会话中,当
    addPyFile
    时,使用绝对路径
    self.project_path
    指向Kedro项目的根目录,因此您可以使用它相应地构造PyFile的路径,例如
    \u spark\u session.sparkContext.addPyFile(f'{self.project_path}/src/dist/project_name-{u版本}-py3.8.egg')

虽然不确定为什么需要添加PyFile,但可能你有一个特定的原因。

你能检查一下你是否能够在笔记本中运行
%reload\u kedro
magic命令吗?@RahulKumar这让我找到了真正的问题,只是还没有找到解决方案……请看我的编辑你可以运行
os.chdir('../src'))
如果您想将工作目录设置为
src
@RahulKumar,很遗憾,在I os.chdir之后,该项目仍在笔记本文件夹中,这很奇怪。关于
ClassNotFoundException
在spark.yaml
spark.jars:/ojdbc8.jar中添加此配置
可以在这个zip文件中找到ojdbc8.jar,我认为addpyfile对jars不起作用。
    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')
# 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