Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache storm 如何向storm提供用于计算的值_Apache Storm - Fatal编程技术网

Apache storm 如何向storm提供用于计算的值

Apache storm 如何向storm提供用于计算的值,apache-storm,Apache Storm,我很难理解如何为storm提供价值,因为我是storm的新手 我从初学者工具包开始。我通过了TestWordSpout,下面的代码提供了新的值 public void nextTuple() { Utils.sleep(100); final String[] words = new String[] {"nathan", "mike", "jackson", "golda", "bertels"}; final Random rand = new Random();

我很难理解如何为storm提供价值,因为我是storm的新手

我从初学者工具包开始。我通过了
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));
}
所以我看到它一次只取一个单词
\u collector.emit(newvalues(word))

我如何能直接提供一组单词。这可能吗

我的意思是,当调用nextTuple时,从列表中随机选择一个新词并发出。经过一定的时间间隔后,随机列表可能是这样的

@100ms: nathan
@200ms: golda
@300ms: golda
@400ms: jackson
@500ms: mike
@600ms: nathan
@700ms: bertels
如果我已经有了此列表的集合,并将其提供给storm,该怎么办。

“Values”类型接受任何类型的对象和任何数字

因此,您可以简单地发送一个列表,例如从Bolt的execute方法或从Spout的nextTuple方法发送:

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!");
@Override
public void declareOutputFields(final OutputFieldsDeclarer outputFieldsDeclarer) {
    outputFieldsDeclarer.declare(new Fields("collection", "newField"));
}
您可以从execute方法提供的tuple对象中获取拓扑中下一个螺栓中的字段:

List<String> collection = (List<String>) tuple.getValueByField("collection");
String newFieldValue = tuple.getStringByField("newField");
List collection=(List)tuple.getValueByField(“collection”);
字符串newFieldValue=tuple.getStringByField(“newField”);

Storm是为处理连续数据流而设计和制造的。请看。输入数据不太可能被送入风暴群。通常,storm的输入数据来自JMS队列、ApacheKafka或twitter提要等。我认为,您可能希望传递一些配置。在这种情况下,以下内容适用

考虑到Storm的设计目的,可以向Storm传递非常有限的配置详细信息,例如RDMBS连接详细信息(Oracle/DB2/MySQL等)、JMS提供程序详细信息(IBM MQ/RabbitMQ等)或Apache Kafka详细信息/Hbase等

对于您的特定问题或提供上述产品的配置详细信息,我有三种想法

1.在喷口或螺栓实例上设置配置详细信息

例如:声明实例变量,并将这些值作为喷口/螺栓构造函数的一部分进行赋值,如下所示

    public class TestWordSpout extends BaseRichSpout {
         List<String> listOfValues;

   public TestWordSpout(List<String> listOfValues) {
       this.listOfValues=listOfValues;
   }

}
配置详细信息可分别在喷口/螺栓的
open()或prepare()
方法中找到

public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
        _collector = collector;
        this.listOfValues=(List<String>)conf.get("listOfValues");        
       }
public void open(地图配置、拓扑上下文、喷动输出收集器){
_收集器=收集器;
this.listOfValues=(List)conf.get(“listOfValues”);
}

3.在属性文件中声明配置,并将其作为jar文件的一部分提交给Storm集群。Nimbus节点将jar文件复制到工作节点,并使其可供执行器线程使用。open()/prepare()方法可以读取属性文件并分配给实例变量

你到底是什么意思?@Chiron:我更新了…把这个密码放在哪里。。。在nextTuple或在execute method中。nextTuple method是根据需要发出值的地方。。。execute方法在bolt中,您实际处理通过喷口输入的数据
 @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;
    }    
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
        _collector = collector;
        this.listOfValues=(List<String>)conf.get("listOfValues");        
       }