Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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
Java 在实际集群环境中,是否可以在风暴栓/喷口中使用全局静态变量_Java_Apache Storm - Fatal编程技术网

Java 在实际集群环境中,是否可以在风暴栓/喷口中使用全局静态变量

Java 在实际集群环境中,是否可以在风暴栓/喷口中使用全局静态变量,java,apache-storm,Java,Apache Storm,我有一个Storm项目,其中Topology类具有提交拓扑的主方法,Spout1-->Bolt1,Spout2-->Bolt2。我还有另外一个util类,它有一个静态变量-->字符串列表。现在,Bolt1使用这个静态列表并打印出内容,其中Bolt2在列表中添加字符串。喷口1和喷口2分别以1000ms和500ms的间隔向各自的螺栓发送消息 我已将工人数量设置为4,即Config.setNumWorkers(4)。 并行性提示:喷口1-1、螺栓1-100、喷口2-1、螺栓2-100。 此代码设置在我

我有一个Storm项目,其中Topology类具有提交拓扑的主方法,Spout1-->Bolt1,Spout2-->Bolt2。我还有另外一个util类,它有一个静态变量-->字符串列表。现在,Bolt1使用这个静态列表并打印出内容,其中Bolt2在列表中添加字符串。喷口1和喷口2分别以1000ms和500ms的间隔向各自的螺栓发送消息

我已将工人数量设置为4,即Config.setNumWorkers(4)。

并行性提示:喷口1-1、螺栓1-100、喷口2-1、螺栓2-100。

此代码设置在我的Windows计算机中以LocalCluster模式工作

但我不确定这是否适用于linux中的实际集群环境,因为它有多台服务器。在实际的集群环境中,我假设工人将在具有不同JVM进程的不同机器上运行那么螺栓是否可以访问全局静态变量,即字符串列表,因为它们可以在本地集群中访问该变量?

下面是一些代码供参考:

public static void main(String[] args) {

    System.out.println("Starting Topology....");
    TopologyBuilder builder = new TopologyBuilder();

    builder.setSpout("spout12", new TestSpout2(), 1);
    builder.setBolt("bolt12", new TestBolt2(), 100).shuffleGrouping("spout12", "spout12Stream");
    builder.setSpout("spout11", new TestSpout1(), 1);
    builder.setBolt("bolt11", new TestBolt1(), 100).shuffleGrouping("spout11", "spout11Stream");

    Config conf = new Config();
    conf.setDebug(false);
    conf.setNumWorkers(4);
    LocalCluster cluster = new LocalCluster();

    cluster.submitTopology("TestTopology3", conf, builder.createTopology());

}


Spout1 :
public void nextTuple() {
    int a = (int) (((Math.random() * 10)+1)*((Math.random() * 10)+1));
    String str = String.valueOf(a);
    Utils.sleep(1000);
    collector.emit("spout11Stream", new Values(str), str);
}


Bolt1 : 
public void execute(Tuple tuple) {
    System.out.println("########## In execute of TestBolt11....\t Value 0 : " + tuple.getString(0) + "\t\t List : "
            + CommonUtils.list);
    _collector.ack(tuple);
}


Spout2 : 
public void nextTuple() {
    int a = (int) (((Math.random() * 10)+1)*((Math.random() * 10)+1));
    String str = String.valueOf(a);
    Utils.sleep(500);
    collector.emit("spout12Stream", new Values(str), str);
}


Bolt2 : 
public void execute(Tuple tuple) {
    System.out.println("!!!!!!!!!!!!! In execute of TestBolt12....\t Value 0 : " + tuple.getString(0));
    CommonUtils.list.add(tuple.getString(0)+"gb");
    _collector.ack(tuple);
}


CommonUtilis class : 
public final class CommonUtils {
public static List<String> list = new ArrayList<String>();
}

简而言之,答案是否定的,静态变量访问是由JVM确定的,正如您所指出的,您将有几个JVM

有一些解决办法,包括:

  • 您可以使用并行性提示为1的螺栓访问静态变量。因为只有一个bolt,所以访问只在一个JVM中发生,但同样,您也可以在该bolt上使用一个实例变量
  • (1)的一个变体是在storm中使用调度器实现来拥有多个bolt实例,但所有实例都分配给同一个worker。这种方法我没有尝试过,但我想我还是会放弃它
  • 您可以使用关系型或NoSQL数据库作为跨集群数据的读/写存储
  • 您可以将列表存储在zookeeper中。我将zookeeper访问封装在一个单例类中,以便简化bolt实现

  • 简而言之,答案是否定的,静态变量访问是由JVM确定的,正如您所指出的,您将有几个JVM

    有一些解决办法,包括:

  • 您可以使用并行性提示为1的螺栓访问静态变量。因为只有一个bolt,所以访问只在一个JVM中发生,但同样,您也可以在该bolt上使用一个实例变量
  • (1)的一个变体是在storm中使用调度器实现来拥有多个bolt实例,但所有实例都分配给同一个worker。这种方法我没有尝试过,但我想我还是会放弃它
  • 您可以使用关系型或NoSQL数据库作为跨集群数据的读/写存储
  • 您可以将列表存储在zookeeper中。我将zookeeper访问封装在一个单例类中,以便简化bolt实现

  • 谢谢你的信息。我的实际问题是我有100个螺栓,每个螺栓读取一行字符串,并根据regex列表选择我们的特定文本。因此,由于静态变量不是这里的选项,所以我的所有100个螺栓都需要有自己的缓存。但是我如何才能同时更新这100个螺栓的缓存而不失败呢。1.所有分组都是一个选项,但是否有其他方法,更简单,因为我不想在100个螺栓上保留相同的缓存,这只会使它们更重。DB交互会使螺栓操作变慢。因此,我不能每次都使用DB来获取regex列表。谢谢你提供的信息。我的实际问题是我有100个螺栓,每个螺栓读取一行字符串,并根据regex列表选择我们的特定文本。因此,由于静态变量不是这里的选项,所以我的所有100个螺栓都需要有自己的缓存。但是我如何才能同时更新这100个螺栓的缓存而不失败呢。1.所有分组都是一个选项,但是否有其他方法,更简单,因为我不想在100个螺栓上保留相同的缓存,这只会使它们更重。DB交互会使螺栓操作变慢。因此,我不能每次都使用DB来获取regex列表。
     !!!!!!!!!!!!! In execute of TestBolt12....  Value 0 : 31
     !!!!!!!!!!!!! In execute of TestBolt12....  Value 0 : 9
     !!!!!!!!!!!!! In execute of TestBolt12....  Value 0 : 68
     !!!!!!!!!!!!! In execute of TestBolt12....  Value 0 : 24
     ########## In execute of TestBolt11....     Value 0 : 39        List : [31gb, 9gb, 68gb, 24gb]
     !!!!!!!!!!!!! In execute of TestBolt12....  Value 0 : 60
     !!!!!!!!!!!!! In execute of TestBolt12....  Value 0 : 30
     ########## In execute of TestBolt11....     Value 0 : 26        List : [31gb, 9gb, 68gb, 24gb, 60gb, 30gb]
     !!!!!!!!!!!!! In execute of TestBolt12....  Value 0 : 9
     !!!!!!!!!!!!! In execute of TestBolt12....  Value 0 : 15
     ########## In execute of TestBolt11....     Value 0 : 11        List : [31gb, 9gb, 68gb, 24gb, 60gb, 30gb, 9gb, 15gb]