Debug Streaming In Hive

独自空忆成欢 提交于 2020-01-09 22:23:10

【推荐】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()


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!