Я пытаюсь использовать mrjob для запуска hadoop в EMR и не могу понять, как настроить ведение журнала (созданные пользователем журналы на шагах карты/уменьшения), поэтому я смогу получить к ним доступ после завершения кластера.mrjob: setup logging on EMR
Я попытался настроить каротаж с помощью модуля logging
, print
и sys.stderr.write()
, но пока не повезло. Единственный вариант, который работает для меня, - это записать журналы в файл, затем SSH-машину и прочитать ее, но ее громоздкость. Я хотел бы, чтобы мои журналы отправлялись в stderr/stdout/syslog и автоматически собирались на S3, поэтому я могу просматривать их после завершения кластера.
Вот пример word_freq с лесозаготовками:
"""The classic MapReduce job: count the frequency of words.
"""
from mrjob.job import MRJob
import re
import logging
import logging.handlers
import sys
WORD_RE = re.compile(r"[\w']+")
class MRWordFreqCount(MRJob):
def mapper_init(self):
self.logger = logging.getLogger()
self.logger.setLevel(logging.INFO)
self.logger.addHandler(logging.FileHandler("/tmp/mr.log"))
self.logger.addHandler(logging.StreamHandler())
self.logger.addHandler(logging.StreamHandler(sys.stdout))
self.logger.addHandler(logging.handlers.SysLogHandler())
def mapper(self, _, line):
self.logger.info("Test logging: %s", line)
sys.stderr.write("Test stderr: %s\n" % line)
print "Test print: %s" % line
for word in WORD_RE.findall(line):
yield (word.lower(), 1)
def combiner(self, word, counts):
yield (word, sum(counts))
def reducer(self, word, counts):
yield (word, sum(counts))
if __name__ == '__main__':
MRWordFreqCount.run()