2017-03-06 1 views
0

Je suis actuellement en train de prendre une classe de Big Data, et l'un de mes projets consiste à exécuter mon mappeur/réducteur sur un cluster Hadoop qui est configuré localement. J'ai utilisé Python avec la bibliothèque MRJob pour la classe.Comment exécuter un MRJob dans un cluster Hadoop local avec Hadoop Streaming?

Voici mon code Python actuel pour le mappeur/réducteur.

from mrjob.job import MRJob 
from mrjob.step import MRStep 
import re 
import os 

WORD_RE = re.compile(r"[\w']+") 
choice = "" 

class MRPrepositionsFinder(MRJob): 

def steps(self): 
    return [ 
     MRStep(mapper=self.mapper_get_words), 
     MRStep(reducer=self.reducer_find_prep_word) 
    ] 

def mapper_get_words(self, _, line): 
    # set word_list to indicators, convert to lowercase, and strip whitespace 
    word_list = set(line.lower().strip() for line in open("/hdfs/user/user/indicators.txt")) 

    # set filename to map_input_file 
    fileName = os.environ['map_input_file'] 
    # itterate through each word in line 
    for word in WORD_RE.findall(line): 
     # if word is in indicators, yield chocie as filename 
     if word.lower() in word_list: 
      choice = fileName.split('/')[5] 
      yield (choice, 1) 

def reducer_find_prep_word(self, choice, counts): 
    # each item of choice is (choice, count), 
    # so yielding results in value=choice, key=count 
    yield (choice, sum(counts)) 


if __name__ == '__main__': 
MRPrepositionsFinder.run() 

Lorsque je tente d'exécuter le code sur mon Hadoop Cluster - j'ai utilisé la commande suivante:

 
python hrc_discover.py /hdfs/user/user/HRCmail/* -r hadoop --hadoop-bin /usr/bin/hadoop > /hdfs/user/user/output 

Malheureusement à chaque fois que je lance la commande, je reçois l'erreur suivante:

 
No configs found; falling back on auto-configuration 
STDERR: Error: JAVA_HOME is not set and could not be found. 
Traceback (most recent call last): 
    File "hrc_discover.py", line 37, in 
    MRPrepositionsFinder.run() 
    File "/usr/lib/python3.5/site-packages/mrjob-0.6.0.dev0-py3.5.egg/mrjob/job.py", line 432, in run 
    mr_job.execute() 
    File "/usr/lib/python3.5/site-packages/mrjob-0.6.0.dev0-py3.5.egg/mrjob/job.py", line 453, in execute 
    super(MRJob, self).execute() 
    File "/usr/lib/python3.5/site-packages/mrjob-0.6.0.dev0-py3.5.egg/mrjob/launch.py", line 161, in execute 
    self.run_job() 
    File "/usr/lib/python3.5/site-packages/mrjob-0.6.0.dev0-py3.5.egg/mrjob/launch.py", line 231, in run_job 
    runner.run() 
    File "/usr/lib/python3.5/site-packages/mrjob-0.6.0.dev0-py3.5.egg/mrjob/runner.py", line 437, in run 
    self._run() 
    File "/usr/lib/python3.5/site-packages/mrjob-0.6.0.dev0-py3.5.egg/mrjob/hadoop.py", line 346, in _run 
    self._find_binaries_and_jars() 
    File "/usr/lib/python3.5/site-packages/mrjob-0.6.0.dev0-py3.5.egg/mrjob/hadoop.py", line 361, in _find_binaries_and_jars 
    self.get_hadoop_version() 
    File "/usr/lib/python3.5/site-packages/mrjob-0.6.0.dev0-py3.5.egg/mrjob/hadoop.py", line 198, in get_hadoop_version 
    return self.fs.get_hadoop_version() 
    File "/usr/lib/python3.5/site-packages/mrjob-0.6.0.dev0-py3.5.egg/mrjob/fs/hadoop.py", line 117, in get_hadoop_version 
    stdout = self.invoke_hadoop(['version'], return_stdout=True) 
    File "/usr/lib/python3.5/site-packages/mrjob-0.6.0.dev0-py3.5.egg/mrjob/fs/hadoop.py", line 172, in invoke_hadoop 
    raise CalledProcessError(proc.returncode, args) 
subprocess.CalledProcessError: Command '['/usr/bin/hadoop', 'version']' returned non-zero exit status 1 

J'ai regardé autour d'Internet et j'ai découvert que j'avais besoin d'exporter ma variable JAVA_HOME - mais je ne veux rien changer à ma configuration.

Toute aide à ce sujet serait grandement appréciée, merci!

Répondre

0

Il semble que le problème ait été dans le fichier de script etc/hadoop/hadoop-env.sh.

Le JAVA_HOME variable d'environnement a été configuré pour être:

export JAVA_HOME=$(JAVA_HOME) 

Alors je suis allé de l'avant et il a changé à ce qui suit:

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk 

J'ai essayé de courir à nouveau la commande suivante, espère que cela fonctionnerait:

python hrc_discover.py /hdfs/user/user/HRCmail/* -r hadoop --hadoop-bin /usr/bin/hadoop > /hdfs/user/user/output 

Heureusement MRJob ramassé sur l'environnement JAVA_HOME et a donné lieu à la sortie suivante:

No configs found; falling back on auto-configuration 
Using Hadoop version 2.7.3 
Looking for Hadoop streaming jar in /home/hadoop/contrib... 
Looking for Hadoop streaming jar in /usr/lib/hadoop-mapreduce... 
Hadoop streaming jar not found. Use --hadoop-streaming-jar 
Creating temp directory /tmp/hrc_discover.user.20170306.022649.449218 
Copying local files to hdfs:///user/user/tmp/mrjob/hrc_discover.user.20170306.022649.449218/files/... 
.. 

Pour résoudre le problème avec le pot de streaming Hadoop, j'ai ajouté le commutateur suivant à la commande:

--hadoop-streaming-jar /usr/lib/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar 

Le pleine commande ressemblait à ce qui suit:

python hrc_discover.py /hdfs/user/user/HRCmail/* -r hadoop --hadoop-streaming-jar /usr/lib/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar --hadoop-bin /usr/bin/hadoop > /hdfs/user/user/output 

auquel la sortie suivante a été le résultat:

No configs found; falling back on auto-configuration 
Using Hadoop version 2.7.3 
Creating temp directory /tmp/hrc_discover.user.20170306.022649.449218 
Copying local files to hdfs:///user/user/tmp/mrjob/hrc_discover.user.20170306.022649.449218/files/... 

Il semble que le problème a été résolu et Hadoop devrait traiter mon travail.