Xu Wenhao

View on GitHub
25 March 2011

支持Ruby1.9的MRToolkit

by Xu Wenhao

虽然最近的工作整天用Java写各类数据处理代码,但是去年大半年用惯了Ruby的我每每要写个测试或者临时计算的MapReduce都觉得真是太麻烦了,于是又念叨起Ruby的好来了。

先看了看利用Hadoop Streaming和Ruby来写MapReduce,发现还是有些麻烦,一是mapper和reducer要分开两个文件,二是每个任务都要重复写从stdin读取数据解析,以及输出的代码,一点不符合DRY原则,于是就找到了mrtoolkit,然后一连串杯具开始发生了。

麻烦LJ同学先给所有的机器装了Ruby1.9,然后一跑,杯具地发现没跑起来,然后发现部分代码不兼容1.9……好吧,反正没多少源代码,改之,再跑,发现虽然每台机器都下载了mrtoolkit而且都设好了RUBYLIB但还是没能成功require mrtoolkit;于是,上github抄了个别人更改的mrtoolkit版本的gemspec和Rakefile,然后打包成gem,然后安装,于是MapReduce任务在各个node上跑起来了,但是,有一部分失败了,杯具地发现Ruby1.9开始对于字符串encoding有了很多限制,使用split通过正则分割字符串的时候居然还检查整个字符串的encoding的合法性,而我们要处理的日志里会存在GBK和UTF-8混在一行编码的可能性……试了好多种方法都不行,只好再跑到邮件组上去问,得高人指点先把字符串转成BINARY的encoding进行分割,然后再转回来,终于……能用了。

所以现在就有了这个支持Ruby1.9的mrtoolkit的版本啦,首个release包含以下变更:

还准备做个小改动是默认output目录存在时输出警告,并且不提交任务不删除输出目录,直接删除现有的输出目录这种方法太容易搞出事情来了。

tags: