Почему Had oop Streaming не импортирует пакеты Python при выполнении задания Had oop? - PullRequest
1 голос
/ 02 августа 2020

См. Распечатанную ниже ошибку Had oop (3.2.1) и краткое изложение моего расследования на данный момент:

Ошибка: java .lang.RuntimeException: PipeMapRed. waitOutputThreads (): сбой подпроцесса с кодом 1 в орг. apache .had oop .streaming.PipeMapRed.waitOutputThreads (PipeMapRed. java: 326) в орг. apache .had oop .streaming.PipeMapRed .mapRedFinished (PipeMapRed. java: 539) в орг. apache .had oop .streaming.PipeMapper.close (PipeMapper. java: 130) в орг. apache .had oop .mapred .MapRunner.run (MapRunner. java: 61) в орг. apache .had oop .streaming.PipeMapRunner.run (PipeMapRunner. java: 34) в орг. apache .had oop .mapred.MapTask.runOldMapper (MapTask. java: 465) в орг. apache .had oop .mapred.MapTask.run (MapTask. java: 349) в орг. apache .had oop .mapred.YarnChild $ 2.run (YarnChild. java: 174) в java .security.AccessController.doPrivileged (собственный метод) в javax.security.auth.Subject.doAs (Subject. java: 422 ) в орг. apache .had oop .security.UserGroupInformation.doAs (UserGroup Информация. java: 1730) в орг. apache .had oop .mapred.YarnChild.main (YarnChild. java: 168)

От траления практически по всем возможным потокам в отношении следующей распечатки ошибки Had oop, похоже, это вызвано множеством причин:

  • наиболее распространенной является то, что файлы Python не являются исполняемыми,
  • или где-то есть ошибка Python в коде.

В моем случае, потратив много часов на тестирование и процесс устранения, я понял, что это вызвано всякий раз, когда я импортирую определенную c библиотеку, такую ​​как pandas, nltk, spacy, или в любом другом случае ('os', 'sys', 're' работают нормально). Теперь я знаю, что это так, поскольку я также обнаружил журналы ошибок oop после неудачной работы следующим образом (невозможно загрузить снимок экрана):

cd /usr/local/hadoop/logs/userlogs/application_1596371805267_0001/container_1596371805267_0001_01_000002

cat stderr

Возвращает: ImportError: Нет модуля с именем pandas

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

cat input_text.csv | python3 mapper.py

Как только я закомментирую 'import pandas' (или любую другую библиотеку, кроме os, sys и повторно) в начале кода задание Had oop работает нормально. Кто-нибудь знает, почему Had oop не может подобрать эти Python библиотеки? Как я уже упоминал, Had oop отлично работает, когда я не импортирую эти пакеты - есть ли что-нибудь Python конфиг мне нужно исправить? Мы очень ценим любые советы, дайте мне знать, если потребуется дополнительная информация. Я не стал включать mapper в этот пост, так как я точно знаю, что он отлично работает без импорта пакетов, но терпит неудачу всякий раз, когда импортируются такие пакеты, как pandas, nltk, spacy (независимо от того, это только один или все из них). пакетов).

Дополнительную информацию см. ниже:

Python версия: Python 3.6.8

Had oop: 3.2.1 - single машина

Была oop команда потоковой передачи (только карта):

hadoop jar /usr/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-3.2.1.jar \
-D mapred.reduce.tasks=0 \
-file $HDUSER_PATH/mapper_clean2.py \
-mapper 'python3 mapper_clean2.py' \
-input $HDFS_PATH/input/combined_tweets_noheader.csv \
-output $HDFS_PATH/output_job1

Файлы конфигурации (локальный компьютер):

mapred-site. xml :

<configuration>
<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>

<property>
    <name>yarn.app.mapreduce.am.env</name>
    <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>

<property>
    <name>mapreduce.map.env</name>
    <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>

<property>
    <name>mapreduce.reduce.env</name>
    <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>

</configuration>

основной узел. xml:

<configuration>
<property>
    <name>hadoop.tmp.dir</name>
    <value>/app/hadoop/tmp</value>
    <description>A base for other temporary directories.</description>
</property>

<property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value>
</property>
</configuration>

узел пряжи. xml:

<configuration>
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
</configuration

hdfs-сайт. xml:

<configuration>
<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>

<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/usr/local/hadoop_store/hdfs/namenode</value>
</property>

<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/usr/local/hadoop_store/hdfs/datanode</value>
</property>
</configuration>
...