【发布时间】:2014-11-25 05:14:43
【问题描述】:
我正在尝试使用 mrjob 在 EMR 上运行 hadoop,但不知道如何设置日志记录(用户在 map/reduce 步骤中生成的日志),因此我将能够在集群终止后访问它们。
我曾尝试使用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()
【问题讨论】:
标签: python hadoop logging mapreduce mrjob