在Hadoop上运行NLTK
在Hadoop上运行Python进程,有很多种方法。本节将会谈论一些在Hadoop运行Python的主流方式,如流MapReduce作业,在Hive中的Python UDF,以及Python Hadoop包装器。
通常,以map函数和reduce函数的形式,编写Hadoop作业。对于给定的任务,用户必须写出map和reduce函数的实现。通常,这些mapper和reducer是使用Java实现的。同时,Hadoop提供了流,在任何其他的语言中,用户可以使用类似于Java语言的方式,编写Python的mapper和reducer。假设读者已经使用Python运行了单词计数的示例。在本章稍后部分,我们也将使用NLTK,运行相同的示例。
使用Python的其他方法是在Hive或Pig中编写UDF(User Defined Function,用户定义函数)。此处的思想是,在NTLK中执行的大部分操作是高度并行化的。例如,POS标签、词语标记、词形还原、停止字删除和NER是高度可分布的。原因是各行的内容是互相独立的,在进行这些操作时,不需要任何上下文。
因此,如果在群集的每个节点上有NTLK和其他Python库,那么可以使用Python语言的NLTK和scikit库,编写UDF。这是使用NLTK(特别是大规模使用scikit)时最简单的方法之一。本章将讨论这两个库
不同的组织实现了各种各样的包装器使Python运行在集群上。实际上,其中一些包装器是非常容易使用的,但是所有的这些包装器有性能差异。其中一些包装器如下所示,如果你想进一步了解它们,请浏览项目页面。
- Hadoopy
- Pydoop
- Dumbo
- mrjob
前面已经谈了很多关于NTLK库的内容,以及它所提供的一些经常使用的函数。现在,NLTK可以解决许多NLP问题,其中许多问题是高度并行的。这就是我们试图在Hadoop上运行NLTK的原因。
在Hadoop上运行NLTK最好的办法是将它安装在集群中的所有节点上。实现这一点并不是很困难。有多种方式可以做到这一点,如将资源文件作为流参数进行发送。但是,这里宁可选择第一个选项。