数据流的发送和接收问题
来源:3-2 -初识Storm核心概念
zctzl
2018-04-03
有2个spout:A、B,都将数据流发送给bolt c,其类型分别为String[] a1、double b1、long c1和String[] a2、double b2、double c2。然后c要将这2个流都发给bolt d,并将其中的一个发给bolt e。
问题:
1.对于每一条数据,是直接发送emit(new Values(a, b, c))好,还是将这3个生成一个自定义类型MyObj后发送myobj好?
2.C接收A、B的tuple用什么方法,getValue还是getValueByField?在c接收的时候需要使用tuple.getSourceComponent()来判断数据的来源吗?
3.一个bolt里可以emit()
2种不同类型的数据吗?(如:emit(new Values(a1, b1, c1))和emit(new Values(a2, b2, c2)同时存在 其中c1为long型 c2为double型)) C里面的declareOutputFields()方法内只能declare一种数据发射格式吗?由于declare要和上面emit内的数据一一对应,但是上面有2中数据要用2中不同的emit发送,那declare该怎么写?
1回答
-
真不好意思,这个问题当时看到,结果忘记回答了,今天在梳理问题的时候才看到这个问题没回答,这个问题很好。
问题1:这个具体传什么,怎么传,其实是个人爱好问题。个人比较喜欢用emit(new Values(a, b, c));
问题2:由于你两个spout进来的数据类型可能不同,所以建议你,在bolt中先做个数据类型转换,比如将对应的long和double都转成他们都兼容的类型,比如double,然后再进行后续的处理,这样就数据类型都一致了;这个如果已经兼容了而且是同一个后续的处理其实并不需要component来接收,如果是不同的业务,那么就建议采用不同的topo来处理;
问题3:这个如同第二个一样,数据兼容下;如果不同业务处理,就采用不同topo来处理;
有什么问题可以在qq群里,这样可能速度更快。
012018-04-12
相似问题