Как включить пакет Python в потоковое задание Hadoop? - PullRequest
18 голосов
/ 25 июля 2011

Я пытаюсь включить пакет python (NLTK) в потоковое задание Hadoop, но не уверен, как это сделать, не включая каждый файл вручную через аргумент CLI, "-file".

Редактировать: Одним из решений было бы установить этот пакет на все ведомые устройства, но у меня пока нет такой опции.

Ответы [ 5 ]

27 голосов
/ 25 июля 2011

Только что натолкнулся на этот драгоценный камень решения: http://blog.cloudera.com/blog/2008/11/sending-files-to-remote-task-nodes-with-hadoop-mapreduce/

сначала создайте zip с желаемыми библиотеками

zip -r nltkandyaml.zip nltk yaml
mv ntlkandyaml.zip /path/to/where/your/mapper/will/be/nltkandyaml.mod

затем включите через поток Hadoop аргумент -file:

hadoop -file nltkandyaml.zip

наконец, загрузите библиотеки через python:

import zipimport
importer = zipimport.zipimporter('nltkandyaml.mod')
yaml = importer.load_module('yaml')
nltk = importer.load_module('nltk') 

Кроме того, на этой странице кратко описано, как включить корпус: http://www.xcombinator.com/2009/11/18/how-to-use-cascading-with-hadoop-streaming/

скачайте и распакуйтеWordnet корпус

cd wordnet
zip -r ../wordnet-flat.zip *

в Python:

wn = WordNetCorpusReader(nltk.data.find('lib/wordnet-flat.zip'))
7 голосов
/ 25 июля 2011

Я бы заархивировал пакет в .tar.gz или .zip и передал бы весь tarball или архив в опции -file вашей команде hadoop. Я делал это раньше с Perl, но не с Python.

Тем не менее, я думаю, что это все равно будет работать для вас, если вы используете Python zipimport в http://docs.python.org/library/zipimport.html,, который позволяет импортировать модули напрямую из zip.

5 голосов
/ 23 октября 2014

Вы можете использовать zip lib следующим образом:

import sys
sys.path.insert(0, 'nltkandyaml.mod')
import ntlk
import yaml
3 голосов
/ 21 августа 2015

Пример загрузки внешнего пакета python nltk см. Ответ Запуск внешних библиотек Python (NLTK) с потоковой передачей Hadoop Я использовал следующий подход и успешно запустил пакет nltk с потоковой передачей hadoop.

Предположим, у вас уже есть пакет или (nltk в моем случае) в вашей системе

first:

zip -r nltk.zip nltk
mv ntlk.zip /place/it/anywhere/you/like/nltk.mod

Почему где-нибудь будет работать?Ответ: - Поскольку мы предоставим путь к этому .mod заархивированному файлу через командную строку, нам не нужно сильно беспокоиться об этом.

секунда:изменения в вашем картографическом или .py файле

#Hadoop cannot unzip files by default thus you need to unzip it   
import zipimport
importer = zipimport.zipimporter('nltk.mod')
nltk = importer.load_module('nltk')

#now import what ever you like from nltk
from nltk import tree
from nltk import load_parser
from nltk.corpus import stopwords
nltk.data.path += ["."]

третье: аргумент командной строки для запуска map-Reduce

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar \
-file /your/path/to/mapper/mapper.py \
-mapper '/usr/local/bin/python3.4 mapper.py' \
-file /your/path/to/reducer/reducer.py \
-reducer '/usr/local/bin/python3.4 reducer.py' \
-file /your/path/to/nltkzippedmodfile/nltk.mod \
-input /your/path/to/HDFS/input/check.txt -output /your/path/to/HDFS/output/

Таким образом, вышеуказанный шаг решил мою проблему, и я думаю, что он должен решить и другие.веселит,

2 голосов
/ 11 апреля 2019

Если вы используете гораздо более сложные библиотеки, такие как numpy and pandas, virtualenv - лучший способ. Вы можете добавить -archives для отправки env в кластер.

Обратитесь к письму: https://henning.kropponline.de/2014/07/18/virtualenv-hadoop-streaming/

Обновлено

Я попробовал выше virtualenv в нашей онлайн-среде и обнаружил некоторые проблемы. В кластере есть некоторые ошибки, такие как «Не удалось найти независимые от платформы библиотеки». «Когда я попробовал conda для создания Python-среды, она работала хорошо.

Если вы китаец, вы можете посмотреть это: https://blog.csdn.net/Jsin31/article/details/53495423

Если нет, я могу перевести это кратко:

  1. создать env от conda:

    conda create -n test python=2.7.12 numpy pandas

  2. Перейдите по пути conda env. Найти его можно по cmd:

    conda env list

    Затем вы можете упаковать его:

    tar cf test.tar test

  3. отправить работу через поток hadoop:
hadoop jar /usr/lib/hadoop/hadoop-streaming.jar \
-archives test.tar \
-input /user/testfiles \
-output /user/result \ 
-mapper "test.tar/test/bin/python mapper.py" \
-file mapper.py \
-reducer"test.tar/test/bin/python reducer.py" \
-file reducer.py
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...