Debug Streaming In Hive

本文介绍在使用Hive的Streaming功能处理大数据时,如何利用Python脚本有效地捕获并记录脏数据。具体展示了如何通过异常处理机制,将脏数据信息记录到Hive作业的日志中,便于后续的数据清洗和错误排查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()


转载于:https://my.oschina.net/zhongl/blog/33147

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值