【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
2010-04-07 @ taobao
Hive由于QL语言自身的限制, 使得某些数据处理的作业还是需要通过streaming交由脚本(如Python)来处理.
海量数据的处理中, 遇到"脏数据"是很常见的, 但其形式又是不可预见的. 为此我们编写的处理程序, 往往需要一段时间的调试去暴露可能出现的"脏数据".
在用java编写MapReduce?的时候, 我们可以捕获出现的未知异常, 同时用System.out.println输出"脏数据"的内容, 以便之后分析. 可惜, 这种"打印"办法在streaming时候不起作用, 因为streaming是通过标准输出来接受脚本处理的结果数据的, 若还是用"打印"的话, "脏数据"并不会出现jobtracker的日志中, 而是被作为结果数据收集了.
为解决这个问题, 我们之后耍点小手段. 以python为例, 当程序处理遇到"脏数据"时, 是会抛出异常的, 这个异常会被jobtracker收集, 其文本信息内容会被记录在日志中. 既然标准输出这条路被堵了, 可"异常"这条路是通的, 也就说可将"脏数据"置于异常中, 这样"脏数据"就会随着异常一起记录在日志中了.
可参考下面python代码
#!/usr/bin/env python
from sys import *
def output(*fields):
'''输出计算结果'''
print '\t'.join(fields)
def process(line):
'''处理当前记录的业务逻辑'''
uid, usename, age = line.split('\t') # 解析字段
output(uid, age) # 筛选字段
def causeBy(cause, line):
return '%(cause)s while dealing with [%(record)s]' % {'cause':str(cause), 'record':line}
def processLinesInStdin():
for line in stdin:
line = line[:-1]
if len(line) == 0:
return None
try:
process(line)
except Exception as e:
raise Exception(causeBy(e, line)) # 捕获未知的异常, 并和当前记录(line)一同以新异常抛出
if __name__ == '__main__':
processLinesInStdin()
来源:oschina
链接:https://my.oschina.net/u/95947/blog/33147