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
指向Kedro项目的根目录,因此您可以使用它相应地构造PyFile的路径,例如self.project_path
\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.yamlspark.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