Загрузка библиотек в EMR с использованием MRJob на Python

Постановка задачи:

Я пытаюсь запустить задание по уменьшению карты в Amazon EMR с использованием библиотеки Python MRJob, и у меня возникают проблемы с начальной загрузкой узлов с необходимыми библиотеками и пакетами.

Подробности:

мой пример кода python mrjob:

    import re
    from mrjob.job import MRJob
    from sentClassifier import sentClassify
    import nltk

    .. do something ..

Есть некоторые библиотеки, такие как NLTK, которые необходимо импортировать, и есть некоторые из моих локальных модулей, которые я импортирую, например from sentClassifier import sentClassify

Я хотел бы знать, как лучше всего загрузить узлы EMR, чтобы эти методы и пакеты были доступны. Код отлично работает на моей локальной машине.

мой образец файла mrjob.conf:

    runners:
      emr:
        aws_access_key_id: ***
        aws_secret_access_key: ***
        ec2_core_instance_type: m1.large
        ec2_key_pair: mykey
        ec2_key_pair_file: mykey.pem
        num_ec2_core_instances: 5
        pool_wait_minutes: 2
        pool_emr_job_flows: true
        ssh_tunnel_is_open: true
        ssh_tunnel_to_job_tracker: true
      hadoop:
        setup:
          - virtualenv venv
          - . venv/bin/activate
          - pip install mr3po simplejson
          - sudo easy_install https://code.google.com/p/nltk/downloads/detail?name=nltk-2.0b9-py2.6.egg&can=2&q=

Но работа не получается.

Я прочитал следующие ссылки и попробовал все их различные подходы, но все равно не повезло:

Журнал ошибок:

    Scanning SSH logs for probable cause of failure
    Probable cause of failure (from ssh://ec2-54-86-50-115.compute-1.amazonaws.com!172.31.19.60/mnt/var/log/hadoop/userlogs/job_201405030101_0006/attempt_201405030101_0006_m_000002_3/stderr):
    Traceback (most recent call last):
    File "obidroidMR.py", line 5, in <module>
       import nltk
       ImportError: No module named nltk
       (while reading from s3://mrjob-   51b9493c1a467671/tmp/obidroidMR.shreyas.20140503.012933.336228/files/STDIN)
       Attempting to terminate job...
       Job appears to have already been terminated
       Killing our SSH tunnel (pid 12909)
       Traceback (most recent call last):
         File "obidroidMR.py", line 107, in <module>
         ObidroidReview.run()
         File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/job.py", line 494, in run
         mr_job.execute()
         File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/job.py", line 512, in execute
super(MRJob, self).execute()
         File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/launch.py", line 147, in execute
         self.run_job()
         File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/launch.py", line 208, in run_job
runner.run()
         File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/runner.py", line 458, in run
self._run()
         File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/emr.py", line 809, in _run
         self._wait_for_job_to_complete()
         File "/Users/shreyas/anaconda/envs/obidroid/lib/python2.7/site-packages/mrjob/emr.py", line 1599, in _wait_for_job_to_complete
         raise Exception(msg)
         Exception: Job on job flow j-2R8G1Q3RIE9ED failed with status WAITING: Waiting after step failed
         Probable cause of failure (from ssh://ec2-54-86-50-115.compute-1.amazonaws.com!172.31.19.60/mnt/var/log/hadoop/userlogs/job_201405030101_0006/attempt_201405030101_0006_m_000002_3/stderr):
         Traceback (most recent call last):
         File "obidroidMR.py", line 5, in <module>
         import nltk
         ImportError: No module named nltk

Любая помощь могла бы быть полезна


person Shreyas    schedule 03.05.2014    source источник


Ответы (2)


В mrjob.conf нужные строки для установки пакетов могут быть не там, где должны быть. Вещи, которые следует применять для задания, которое выполняется в EMR, должны быть перечислены в разделе emr:, а не hadoop: (что является конфигурацией при запуске задания в вашей локальной установке Hadoop.

Если это простая команда Linux, такая как pip или apt-get, вы сможете установить пакеты следующим образом:

runners:
  emr:
    aws_access_key_id: ***
    ... all the other stuff ...
    bootstrap_cmds:
    - sudo apt-get install -y python-boto
    - sudo pip install simplejson

Я никогда не пытался установить NLTK специально, поэтому я не могу вам помочь, но вы должны быть в состоянии установить по этой линии.

Для потенциально более сложной установки я бы рекомендовал sshing на ваш главный узел с помощью EMR CLI:

$ ./elastic-mapreduce -j JOB_FLOW_ID --ssh

и на самом деле попробуйте установить пакет. Если вы найдете последовательность команд оболочки, которая успешно устанавливает пакет, вы можете просто скопировать и вставить ее в файл mrjob.conf.

person Taro Sato    schedule 03.05.2014
comment
попробуй сейчас. так что, если я войду по ssh, я смогу установить пакеты только на главном узле или на всех узлах? Спасибо за все ваши ответы. - person Shreyas; 04.05.2014
comment
На самом деле, я должен был добавить, что вы должны создать постоянный тестовый экземпляр (с опцией --keep-alive, если вы используете CLI... убедитесь, что вы завершите этот поток заданий после завершения эксперимента) и попытаетесь увидеть, сможете ли вы успешно установить пакеты, которые вам нужно в этом экземпляре с apt-get, pip и т. д. Если вы используете тот же тип экземпляра для своего реального запуска, то добавление точно таких же строк под bootstrap_cmds в ваш mrjob.conf должно установить пакеты во всех экземплярах. Это просто способ выяснить, что ваши команды правильно устанавливают пакеты для начала. - person Taro Sato; 04.05.2014
comment
Пробовал это. Не работает. Журнал ошибок: Исключение: задание в потоке заданий j-PKIO9JHCITI3 завершилось неудачно со статусом FAILED: на главном экземпляре (i-b619c2e6) действие начальной загрузки 1 вернуло ненулевой код возврата - person Shreyas; 04.05.2014
comment
В порядке. Пробуем сейчас. Но все же .. Большое вам спасибо за всю вашу помощь. Инструмент эластичной карты не работает после установки. Перепроверил свои ошибки - person Shreyas; 04.05.2014

Учитывая, что Amazon Elastic Map Reduce использует AMI на основе Amazon Linux, я убедился, что могу установить nltk на Amazon Linux AMI 2014.03.1 — ami-fb8e9292 (64-разрядная версия), используя следующие

sudo easy_install -U pip
sudo easy_install -U distribute
sudo pip install -U pyyaml nltk

вы можете попробовать включить эти 3 строки в свой mrjob.conf

person Raymond Yee    schedule 03.05.2014
comment
Пробовал это. Не работает. Журнал ошибок: Исключение: задание в потоке заданий j-PKIO9JHCITI3 завершилось неудачно со статусом FAILED: на главном экземпляре (i-b619c2e6) действие начальной загрузки 1 вернуло ненулевой код возврата - person Shreyas; 04.05.2014
comment
Можете ли вы получить любую работу EMR, работающую с mrjob? то есть тестовое задание, для которого не требуются какие-либо библиотеки, кроме стандартной библиотеки Python? - person Raymond Yee; 05.05.2014
comment
о да. NLTK для другого проекта. Но без библиотеки мой mrjob работает (Soteria), так как все функции уже извлечены в БД. - person Shreyas; 05.05.2014