在 Azure Synapse 笔记本 ValueError 中运行 nltk.download:对关闭的文件进行 I/O 操作

Posted

技术标签:

【中文标题】在 Azure Synapse 笔记本 ValueError 中运行 nltk.download:对关闭的文件进行 I/O 操作【英文标题】:Running nltk.download in Azure Synapse notebook ValueError: I/O operation on closed file 【发布时间】:2021-06-24 06:05:58 【问题描述】:

我正在 Azure Synapse 笔记本中试验 NLTK。当我尝试运行 nltk.download('stopwords') 时,出现以下错误:

ValueError: I/O operation on closed file
Traceback (most recent call last):

  File "/home/trusted-service-user/cluster-env/env/lib/python3.6/site-packages/nltk/downloader.py", line 782, in download
    show(msg.message)

  File "/home/trusted-service-user/cluster-env/env/lib/python3.6/site-packages/nltk/downloader.py", line 775, in show
    subsequent_indent=prefix + prefix2 + " " * 4,

  File "/mnt/var/hadoop/tmp/nm-local-dir/usercache/trusted-service-user/appcache/application_1616860588116_0001/container_1616860588116_0001_01_000001/tmp/9026485902214290372", line 536, in write
    super(UnicodeDecodingStringIO, self).write(s)

ValueError: I/O operation on closed file

如果我尝试只运行 nltk.download() 我会收到以下错误:

EOFError: EOF when reading a line
Traceback (most recent call last):

  File "/home/trusted-service-user/cluster-env/env/lib/python3.6/site-packages/nltk/downloader.py", line 765, in download
    self._interactive_download()

  File "/home/trusted-service-user/cluster-env/env/lib/python3.6/site-packages/nltk/downloader.py", line 1117, in _interactive_download
    DownloaderShell(self).run()

  File "/home/trusted-service-user/cluster-env/env/lib/python3.6/site-packages/nltk/downloader.py", line 1143, in run
    user_input = input("Downloader> ").strip()

EOFError: EOF when reading a line

我希望有人可以帮助我了解可能导致此问题的原因以及如何解决此问题。我无法找到很多关于从这里去哪里的信息。

编辑: 我用来生成错误的代码如下:

import nltk
nltk.download('stopwords')

更新 我最终向 Microsoft 提出了支持请求,这是他们的回复:

Synapse 不支持您在其中使用的任意 shell 脚本 将下载 NLTK 的相关模型语料库

他们建议我使用 sc.addFile,我最终开始工作了。所以如果其他人发现了这个,这就是我所做的。

    在此处下载 NLTK 停用词:http://nltk.org/nltk_data/ 将停用词上传到存储中的以下文件夹:abfss://@.dfs.core.windows.net/synapse/workspaces//nltk_data/corpora/stopwords/ 运行下面的代码来导入它们

.

import os
import sys
import nltk
from pyspark import SparkFiles

#add stopwords from storage
sc.addFile('abfss://<file_system>@<account_name>.dfs.core.windows.net/synapse/workspaces/<workspace_name>/nltk_data/',True)

#append path to NLTK
nltk.data.path.append(SparkFiles.getRootDirectory() + '/nltk_data')

nltk.corpus.stopwords.words('english')

谢谢!

【问题讨论】:

只是为了排除显而易见的情况,您是否在与 Synapse 工作区关联的任何存储上至少有 Storage Blob 数据贡献者,并且是工作区的贡献者或所有者?只是为了好玩,我会在 Azure Databricks 笔记本中尝试相同的代码,看看你是否得到不同的行为。否则,我认为您正在考虑提出支持票。 这是我设置的测试环境,所以我确实拥有所有服务的所有者/贡献者。我确实在 Databricks 上尝试过,代码运行良好。这是我第一次使用 Synapse,所以我不确定我是否遗漏了什么,或者在下载此类数据时是否有额外的步骤。 您是否将存储设置为工作空间的一部分,还是已经存在?如果您设置了它,那么您可能确实拥有新的 RBAC 角色 Storage Blob Data Contributor。如果存储已经存在,您可能不存在。请检查,只是为了排除它。否则,请考虑发布更完整的代码示例,以便有人重现错误。 谢谢 - 我用我正在运行的确切代码更新了帖子。存储帐户已经存在,但是,我还创建了存储帐户。我目前是此订阅的服务管理员,并且对 Synapse 正在使用的存储帐户具有读/写访问权限。 @wBob 感谢您的帮助,您已经非常接近加载那些解压缩的副本了。我用微软的回答和我要工作的内容更新了帖子。 【参考方案1】:

我最终向 Microsoft 提出了支持请求,这是他们的回复:

Synapse 不支持您在其中使用的任意 shell 脚本 将下载 NLTK 的相关模型语料库

他们建议我使用 sc.addFile,我最终开始工作了。所以如果其他人发现了这个,这就是我所做的。

    在此处下载 NLTK 停用词:http://nltk.org/nltk_data/ 将停用词上传到存储中的 foll0woing 文件夹:abfss://@.dfs.core.windows.net/synapse/workspaces//nltk_data/corpora/stopwords/ 运行下面的代码来导入它们

....

import os
import sys
import nltk
from pyspark import SparkFiles
    
#add stopwords from storage
    sc.addFile('abfss://<file_system>@<account_name>.dfs.core.windows.net/synapse/workspaces/<workspace_name>/nltk_data/',True)
    
#append path to NLTK
nltk.data.path.append(SparkFiles.getRootDirectory() + '/nltk_data')
    
nltk.corpus.stopwords.words('english')

谢谢!

【讨论】:

以上是关于在 Azure Synapse 笔记本 ValueError 中运行 nltk.download:对关闭的文件进行 I/O 操作的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure Synapse 笔记本 ValueError 中运行 nltk.download:对关闭的文件进行 I/O 操作

Azure Synapse Notebook 对认知服务转换器的请求

Azure Synapse Pipeline Notebook 返回错误

在 Azure Synapse 的 Spark 代码中列出目录的内容

Azure Synapse Analytics 是不是支持 R 语言?

是否可以使用带有魔术命令的 Azure Synapse 在 Apache Spark 中运行 Bash 命令