2014-09-30 140 views
4

我正在嘗試使用mrjob在EMR上運行hadoop,並且無法弄清楚如何設置日誌記錄(用戶在地圖/減少步驟中生成日誌),以便我可以訪問它們集羣終止後。mrjob:在EMR上設置日誌記錄

我試圖使用logging模塊設置日誌記錄,printsys.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() 

回答

3

出的所有選項,只有一個真正起作用的是使用標準錯誤與直接寫入(sys.stderr.write)或使用帶有StreamHandler中的標準錯誤的記錄器。

[s3_log_uri]/[jobflow-ID] /任務嘗試/ [作業ID]/[嘗試:在作業完成後(成功或有錯誤),從可以在以後被檢索

日誌-id]/stderr

請務必將日誌保存在您的runners.emr.cleanup配置中。