【问题标题】:Kedro context and catalog missing from Jupyter NotebookJupyter Notebook 中缺少 Kedro 上下文和目录
【发布时间】:2021-02-02 16:54:23
【问题描述】:

我可以使用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

【问题讨论】:

  • 你能检查一下你是否可以在笔记本中运行%reload_kedro魔法命令吗?
  • @RahulKumar 这让我找到了真正的问题,只是还没有解决方案......查看我的编辑
  • 如果要将工作目录设置为src,可以运行os.chdir('../src')
  • @RahulKumar 不幸的是,在我 os.chdir 之后,该项目仍在 notebooks 文件夹中
  • 这很奇怪。关于ClassNotFoundException 在spark.yaml 中添加这个配置spark.jars: <some_path>/ojdbc8.jar ojdbc8.jar 可以在这个zip 文件download.oracle.com/otn_software/linux/instantclient/211000/… 中找到我不认为add pyfile 将适用于罐子。

标签: kedro


【解决方案1】:

我认为结合这些可能会对您有所帮助:

  • 一般情况下,我们尽量避免手动干扰当前工作目录,所以让我们删除笔记本中的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,但也许你有特定的原因。

【讨论】:

    最近更新 更多