簡體   English   中英

如何在 Jupyter Notebook 中將 python 文件作為模塊導入?

[英]How to import python file as module in Jupyter notebook?

我正在開發 AWS Glue 腳本,並且正在嘗試使用 Dev Endpoint。 我按照向導創建了一個 Dev Endpoint 和一個附加到它的 SageMaker 筆記本。 當我打開 SageMaker 筆記本時,它會將我定向到一個名為 Jupyter 的網頁。

在 Jupyter 中,我用我的 python 文件創建了幾個筆記本。 問題是一些共享的 python 文件不能作為模塊導入到筆記本中。 我收到以下錯誤:“沒有名為 shared.helper Traceback 的模塊(最近一次調用):

導入錯誤:沒有名為 shared.helper 的模塊

這是我在 Jupyter 筆記本上的項目結構:

my_project/
│
├── scripts/
│   ├── a_notebook.ipynb
│   ├── b_notebook.ipynb
|   ├── c_notebook.ipynb
│   ├── __init__.py     
│   └── shared/
         └── helper.py
         └── config.py
         └── __init__.py

我嘗試了很多我在互聯網上搜索的嘗試,但都沒有奏效。

a_notebook.ipynb ,我只是使用import shared.helper as helper ,它向我顯示了上述錯誤。

我不知道是否與 AWS Glue 有任何關系? 當我從 AWS Glue 控制台下的 Sagemaker 筆記本打開 Jupyter 時。

TLDR

根據文檔

您需要將 Python 文件上傳到 S3 存儲桶。 如果您有多個,則需要將它們壓縮。 當您啟動 dev 端點時,在Security configuration, script libraries, and job parameters (optional)下有一個設置Python library path Security configuration, script libraries, and job parameters (optional)用於設置包含自定義庫(包括腳本、模塊、包)的 S3 存儲桶的路徑。 您還需要確保附加到開發終端節點使用的 IAM 角色的 IAM 策略可以訪問該存儲桶的 list/head/getobject 等。

細節

這是一些額外的工作,但主要原因是需要將庫加載到 Spark 集群中的每個 DPU(執行容器)。

當您使用Sparkmagic (pyspark)內核時,它使用名為livy的 Spark 庫連接到遠程 Spark 集群並在其上運行您的代碼。 dev endpoint實際上是一個 Spark 集群,您的“Sagemaker notebook”^ 正在連接到 Spark 集群上的 livy 主機。

這與正常的 Python 環境有很大不同,主要是因為當前工作目錄和代碼執行的位置不在同一個地方。 Sagemaker 允許使用很多Jupyter 魔法,因此您可以測試一下並查看。

例如在一個段落中運行這個

%pwd

它會向您展示您希望看到的內容,例如

/home/ec2-user/SageMaker

試試這個:

%ls

你會看到這樣的

膠水示例/lost+found/shared/a_notebook.ipynb

這些魔法使用 Notebook 的上下文並顯示與它相關的目錄。 如果你試試這個:

import os
print(os.getcwd())

你會看到完全不同的東西:

/mnt/yarn/usercache/livy/appcache/application_1564744666624_0002/

那是集群上驅動程序容器中的 Spark(實際上是 hadoop HDFS )目錄。 Hadoop 目錄以冗余方式分布,因此說目錄在該容器中不一定正確,這也不是很重要。 關鍵是該目錄在遠程集群上,而不是在運行筆記本的 ec2 實例上。

有時加載模塊的一個好技巧是修改sys.path以包含要從中導入模塊的目錄。 不幸的是,這在這里不起作用,因為如果您將/home/ec2-user/Sagemaker到路徑,首先該路徑在 HDFS 上將不存在,其次 pyspark 上下文無法搜索筆記本的 EC2 主機上的路徑。

您可以做的另一件事來證明這一切都是正確的,那就是在正在運行的筆記本中更改內核。 Jupyter 中有一個kernel菜單選項。 我建議conda_python3

當然,這個內核不會連接到 Spark 集群,所以沒有 Spark 代碼可以工作,但是你可以再次嘗試上面的%pwdprint(os.getcwd()) ,看看它們現在顯示相同的本地目錄。 您還應該能夠導入您的模塊,盡管您可能需要修改路徑,例如

import os
import sys
shared_path = '/home/ec2-user/SageMaker/shared'
if shared_path not in sys.path:
    sys.path.append(shared_path)

然后你應該能夠運行這個

import helper

但此時,您不在 Sparkmagic (pyspark) 內核中,所以這對您沒有好處。

這是一個很長的解釋,但它應該有助於澄清為什么需要將腳本上傳到 S3 存儲桶的煩人要求。 當您的開發端點啟動時,它有一個鈎子可以從該位置加載您的自定義庫,以便它們可用於 Spark 集群容器。

^ 請注意,Sagemaker 是 Jupyter notebooks 的 AWS 品牌重塑,這有點令人困惑。 Sagemaker 也是 AWS 中用於自動化機器學習模型訓練/測試/部署生命周期管理的服務的名稱。 它本質上是 Jupyter 筆記本加上一些調度和一些 API 端點。 如果不是像造紙廠那樣在引擎蓋下運行,我會感到驚訝。

您可以使用以下方法將模塊導入 spark:

spark.sparkContext.addPyFile("<hdfs_path>/foo.py")

然后像這樣導入它:

import foo
from foo import bar

HDFS 路徑示例:

Azure: "abfs://<container>@<storage_account>.dfs.core.windows.net/foo/bar.py"
AWS: "s3://<bucket>/foo/bar.py"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM