我很难理解如何为暴风雨提供价值,因为我是暴风雨的新手。
我从入门套件开始。我浏览了TestWordSpout
,并且以下代码提供了新值
public void nextTuple() {
Utils.sleep(100);
final String[] words = new String[] {"nathan", "mike", "jackson", "golda", "bertels"};
final Random rand = new Random();
final String word = words[rand.nextInt(words.length)];
_collector.emit(new Values(word));
}
所以我发现它一次只能说一个字_collector.emit(new Values(word));
我如何直接提供单词集合。这可能吗?
当我调用nextTuple时,我的意思是从列表中随机选择并发出新单词。在某个时间间隔
之后,随机列表可能看起来像这样@100ms: nathan
@200ms: golda
@300ms: golda
@400ms: jackson
@500ms: mike
@600ms: nathan
@700ms: bertels
如果我已经拥有此列表的集合并将其反馈给风暴,该怎么办?
答案 0 :(得分:1)
Storm的设计和构建是为了处理连续的数据流。请参阅Rationale for the Storm。输入数据输入风暴群的可能性很小。通常,暴风雨的输入数据来自JMS队列,Apache Kafka或Twitter提要等。我想,您想通过一些配置。在这种情况下,以下内容适用。
考虑到Storm的设计目的,可以将非常有限的配置细节传递给Storm,例如RDMBS连接详细信息(Oracle / DB2 / MySQL等),JMS提供程序详细信息(IBM MQ / RabbitMQ等)或Apache Kafka详细信息/ Hbase等
对于您的特定问题或提供上述产品的配置详细信息,我可以通过三种方式思考
1.在Spout或Bolt
的实例上设置配置详细信息例如:声明实例变量并将值分配为Spout / Bolt构造函数的一部分,如下所示
public class TestWordSpout extends BaseRichSpout {
List<String> listOfValues;
public TestWordSpout(List<String> listOfValues) {
this.listOfValues=listOfValues;
}
}
在拓扑提交类中,使用值列表
创建Spout实例 List<String> listOfValues=new ArrayList<String>();
listOfValues.add("nathan");
listOfValues.add("golda");
listOfValues.add("mike");
builder.setSpout("word", new TestWordSpout(listOfValues), 3);
这些值可用作nextTuple()
方法
请查看Storm contrib上的Storm集成,了解RDBMS / Kafka等的配置,如上所述
2.在getComponentConfiguration()
中设置配置。此方法用于覆盖拓扑配置,但是,您可以传递一些详细信息,如下所示
@Override
public Map<String, Object> getComponentConfiguration() {
Map<String, Object> ret = new HashMap<String, Object>();
if(!_isDistributed) {
ret.put(Config.TOPOLOGY_MAX_TASK_PARALLELISM, 1);
return ret;
} else {
List<String> listOfValues=new ArrayList<String>();
listOfValues.add("nathan");
listOfValues.add("golda");
listOfValues.add("mike");
ret.put("listOfValues", listOfValues);
}
return ret;
}
并且配置详细信息分别在Spout / Bolt的open() or prepare()
方法中提供。
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
_collector = collector;
this.listOfValues=(List<String>)conf.get("listOfValues");
}
3.声明属性文件中的配置并将其作为jar文件的一部分将其提交给Storm集群。 Nimbus节点将jar文件复制到工作节点,并使其可用于执行程序线程。 open()/ prepare()方法可以读取属性文件并分配给实例变量。
答案 1 :(得分:0)
“值”类型接受任何类型的对象和任何数字。
所以你可以简单地从一个Bolt的execute方法或者一个Spout的nextTuple方法发送一个List:
List<String> words = new ArrayList<>();
words.add("one word");
words.add("another word");
_collector.emit(new Values(words));
您也可以添加新的字段,只需确保在declareOutputFields方法中声明它
_collector.emit(new Values(words, "a new field value!");
并在您的declareOutputFields方法
中@Override
public void declareOutputFields(final OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declare(new Fields("collection", "newField"));
}
您可以从execute方法给出的元组对象中获取拓扑中下一个Bolt中的字段:
List<String> collection = (List<String>) tuple.getValueByField("collection");
String newFieldValue = tuple.getStringByField("newField");