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!