Apache storm 风暴拓扑结构

Apache storm 风暴拓扑结构,apache-storm,Apache Storm,如何为storm拓扑提供自定义配置?例如,如果我构建了一个连接到MySQL集群的拓扑,并且我希望能够在不重新编译的情况下更改需要连接到的服务器,我将如何做到这一点?我的首选是使用配置文件,但我担心的是该文件本身没有部署到集群,因此它不会运行(除非我对集群工作方式的理解有缺陷)。到目前为止,我所看到的在运行时将配置选项传递到storm拓扑中的唯一方法是通过命令行参数,但当您获得大量参数时,这就很麻烦了 一个想法是利用一个shell脚本将文件读入一个变量,并将该变量的内容作为字符串传递给拓扑结构,但

如何为storm拓扑提供自定义配置?例如,如果我构建了一个连接到MySQL集群的拓扑,并且我希望能够在不重新编译的情况下更改需要连接到的服务器,我将如何做到这一点?我的首选是使用配置文件,但我担心的是该文件本身没有部署到集群,因此它不会运行(除非我对集群工作方式的理解有缺陷)。到目前为止,我所看到的在运行时将配置选项传递到storm拓扑中的唯一方法是通过命令行参数,但当您获得大量参数时,这就很麻烦了

一个想法是利用一个shell脚本将文件读入一个变量,并将该变量的内容作为字符串传递给拓扑结构,但是如果可能的话,我希望有一个更干净的东西

还有其他人遇到过这种情况吗?如果是,你是如何解决的

编辑:


它似乎需要提供更多的澄清。我的情况是,我有一个拓扑,我希望能够在不同的环境中部署,而不必重新编译它。通常,我会创建一个配置文件,其中包含数据库连接参数之类的内容,并将其传入。我想知道如何在Storm中做类似的事情。

实际上最适合您的方法是将配置存储在可变键值存储(s3、redis等)中,然后将其拉入以配置您随后使用的数据库连接(我假设您已经计划限制与数据库的通信频率,这样获取此配置的开销就不会有什么大不了的)。此设计允许您动态更改数据库连接,甚至无需重新部署拓扑。

其思想是,在构建拓扑时,您可以创建喷口和螺栓的实例(除其他外)这些实例被序列化并分发到集群中的正确位置。如果您想配置喷口或喷口的行为,请在提交拓扑之前创建拓扑时进行配置,并通过在喷口或喷口上设置实例变量来实现,反过来,这些变量驱动您想要的可配置行为。

我还面临同样的问题。我通过在集群中配置NFS解决了这个问题,并将该配置文件放在共享位置,这样所有集群计算机都可以使用它。在linux系统中配置NFS非常容易。

您可以指定配置(通常通过yaml文件)在我们自己的项目中,我们自己如何管理它,我们有单独的用于开发的配置文件和一个用于生产的配置文件,我们在其中存储服务器、redis和db IP以及端口等。然后,当我们运行命令来构建jar并将拓扑提交给storm时,它包括正确的配置文件dependin螺栓和喷嘴只需从stormConf映射中读取它们所需的配置,该映射在螺栓的prepare()方法中传递给它们

发件人:

每个配置都有一个在Storm代码库的defaults.yaml中定义的默认值。您可以通过在Nimbus和supervisors的类路径中定义Storm.yaml来覆盖这些配置。最后,您可以定义一个特定于拓扑的配置,在使用StormSubmitter时随拓扑一起提交。但是,拓扑-特定配置只能覆盖前缀为“拓扑”的配置

Storm 0.7.0及更高版本允许您在每个螺栓/每个喷嘴的基础上覆盖配置

您还将在submitJar和submitTopology上看到一个名为conf的映射


希望这能让你开始。

我面临着和你一样的问题,下面是我棘手的解决方案:

使用一个简单的java文件作为配置文件,例如
topo_config.java
,它看起来像:

package com.xxx
public class topo_config {
    public static String zk_host = "192.168.10.60:2181";
    public static String kafka_topic = "my_log_topic";
    public static int worker_num = 2;
    public static int log_spout_num = 4;
    // ...
}
cp config/topo_config.java src/main/java/com/xxx/
mvn package
该文件放在我的configure文件夹中,然后编写一个脚本,比如说
compile.sh
,它将把它复制到正确的包中并进行编译,如下所示:

package com.xxx
public class topo_config {
    public static String zk_host = "192.168.10.60:2181";
    public static String kafka_topic = "my_log_topic";
    public static int worker_num = 2;
    public static int log_spout_num = 4;
    // ...
}
cp config/topo_config.java src/main/java/com/xxx/
mvn package
直接实现配置:

Config conf = new Config();
conf.setNumWorkers(topo_config.worker_num);

我通过在代码中提供配置解决了这个问题:

config.put(Config.TOPOLOGY_WORKER_CHILDOPTS, SOME_OPTS);
我试图提供一个特定于拓扑的
storm.yaml
,但它不起作用。如果使用storm.yaml有效,请更正我

更新:
对于任何想知道某些选项是什么的人,这是来自Storm邮件列表上的Satish Duggana:

Config.TOPOLOGY\u WORKER\u CHILDOPTS:可以覆盖的选项 WORKER_Childs选择拓扑。您可以配置任何java选项 比如内存、gc等

在你的情况下,它可以是


我们已经看到了相同的问题,并通过在每个拓扑中添加以下内容来解决它

config.put(Config.TOPOLOGY_WORKER_CHILDOPTS, "-Xmx4096m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:NewSize=128m -XX:CMSInitiatingOccupancyFraction=70 -XX:-CMSConcurrentMTEnabled -Djava.net.preferIPv4Stack=true");
还使用Nimbus UI进行了验证,如下所示

topology.worker.childopts   -Xmx4096m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:NewSize=128m -XX:CMSInitiatingOccupancyFraction=70 -XX:-CMSConcurrentMTEnabled -Djava.net.preferIPv4Stack=true

我已经考虑过这种方法,但我仍然需要一种方法来告诉我的拓扑结构服务器位于何处。为什么?在部署拓扑结构时,需要进行哪些配置,而这些拓扑结构不能作为喷口或螺栓计算的一部分?您可以将配置放在键值存储、dB、zookeeper等中,并指定服务器(名称、端口等)在cmdline启动时配置,或者在资源中包含的配置文件中配置,并随jar分发到每个节点,我们会对几个配置执行此操作。我想一个公平的问题是,为什么不重新编译它?构建jar的时间不应该太长。我在将部署到的系统上没有编译器。例如,到任何数据库的连接都是不同的,因此我必须能够在不需要重新编译的情况下更改配置的这一部分。我也不是进行部署的人,因此需要简单。我当前的解决方案是利用属性对象并从文件读取配置。然后,我填充从中删除storm Config对象,从而使所有螺栓都可以使用所有选项