成功安装Storm环境之后,接下来的事情就是使用这个分布式实时计算框架来完成原来的读数据文件并导入MongoDB的工作了。
代码不复杂,根据文档可以很快的实现。但是有几件事情觉得有必要记录下来。
1)IBasicBolt 和 IRichBolt
根据文档,为了简化代码使用了BaseBasicBolt作为基类,却导致Spout收到大量的fail,为什么?研究发现,根源是我们超时时间缺省只有30s,实在太短(任务有一个读30M的文件),但另一方面也是这个BasicBolt帮我们对ack/fail进行了管理,代码是省了,但其实并不方便,至少觉得不如自己处理更有效果,也不直接。所以,后来修改为继承IRichBolt,还是自已主动Ack吧。
2)任务分解
开始设计按原来的逻辑,在Bolt中完成全部工作:读文件,解析,写数据库。但是发现对于30M的大文件来说,这个过程非常漫长导致超时,加大超时时间能解决问题。
conf.setMessageTimeoutSecs(600);
但不是根本办法,所以又优化一下,看看写库动作能否拆到其它任务中去,于是又新建一个MongoRecordBolt,负责写一条记录。
builder.setBolt("complain-day", new ComplainBolt(),TASK_NUMBER)
.shuffleGrouping("csv-scanner", "complain.day");
builder.setBolt("mongo-complain-day", new MongoRecordBolt(),2*TASK_NUMBER)
.shuffleGrouping("complai