使用Hadoop Streaming运行含NLTK的MapReduce程序报错求助
解决Hadoop Streaming中NLTK WordNet语料库找不到的问题
我帮你梳理下这个问题——你遇到的本地运行正常、Hadoop集群报错的情况,核心原因其实很明确:你的集群计算节点上没有NLTK的WordNet语料库。
问题分析
本地运行时,你肯定已经通过nltk.download('wordnet')把语料库下载到了本地机器,但Hadoop的Map/Reduce任务是跑在集群的各个节点上的,这些节点并没有同步你的本地NLTK数据。当脚本执行到wn.synsets('dog')时,会因为找不到语料库文件抛出异常,最终导致Hadoop返回PipeMapRed.waitOutputThreads(): subprocess failed with code 1这个错误。
解决方案步骤
1. 打包本地的WordNet语料库
首先在本地找到WordNet语料库的位置,你可以运行以下Python代码获取路径:
import nltk print(nltk.data.find('corpora/wordnet'))
假设输出是/home/yourname/nltk_data/corpora/wordnet,把这个文件夹打包成压缩包:
tar -czf wordnet.tar.gz /home/yourname/nltk_data/corpora/wordnet
2. 修改Python脚本
在你的Map/Reduce脚本里,添加解压语料库并指定NLTK路径的逻辑:
import nltk import tarfile import os # 检查并解压WordNet压缩包 if not os.path.exists('wordnet'): with tarfile.open('wordnet.tar.gz', 'r:gz') as tar: tar.extractall() # 把当前目录加入NLTK的搜索路径 nltk.data.path.append('.') from nltk.corpus import wordnet as wn if wn.synsets('dog'): print('something')
3. 用Hadoop Streaming提交任务时分发压缩包
提交任务时,使用-files参数把打包好的wordnet.tar.gz分发到所有计算节点的任务工作目录:
hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar \ -files wordnet.tar.gz \ -mapper your_mapper_script.py \ -reducer your_reducer_script.py \ -input /hdfs/input/path \ -output /hdfs/output/path
额外注意点
- 确保集群所有节点都已经安装了NLTK库,如果没有的话,需要在所有节点执行
pip install nltk(或者用集群的包管理工具统一安装)。 - 如果你的脚本还有其他NLTK依赖的语料库,需要用同样的方法打包分发。
内容的提问来源于stack exchange,提问作者Amine EL Hadi
相关产品推荐
相关产品推荐

