Настройка топологии шторма

Как вы предоставляете пользовательскую конфигурацию для топологии шторма? Например, если у меня есть построенная топология, которая подключается к кластеру MySQL, и я хочу иметь возможность изменять, к каким серверам мне нужно подключаться, без перекомпиляции, как мне это сделать? Я предпочел бы использовать файл конфигурации, но меня беспокоит то, что сам файл не развертывается в кластере, поэтому он не будет запущен (если мое понимание того, как работает кластер, не является ошибочным). До сих пор я видел единственный способ передачи параметров конфигурации в топологию шторма во время выполнения - через параметр командной строки, но это беспорядочно, когда вы получаете достаточное количество параметров.

Одна мысль действительно имела место - использовать сценарий оболочки, чтобы прочитать файл в переменную и передать содержимое этой переменной в виде строки в топологию, но я хотел бы, чтобы это было немного чище.

кто-нибудь еще сталкивался с этим? Если да, то как ты решил это?

РЕДАКТИРОВАТЬ:

Похоже, необходимо предоставить больше разъяснений. Мой сценарий состоит в том, что у меня есть топология, которую я хочу иметь возможность развертывать в разных средах без необходимости перекомпилировать ее. Обычно я создаю файл конфигурации, который содержит такие вещи, как параметры соединения с базой данных, и передает их. Я хотел бы знать, как сделать что-то подобное в Storm.

7 ответов

Вы можете указать конфигурацию (обычно через файл yaml), которую вы отправляете вместе с топологией. Как мы сами справляемся с этим в нашем собственном проекте, так это то, что у нас есть отдельные файлы конфигурации для разработки и один для производства, и внутри него мы храним наш сервер, IP-адреса redis и db, порты и т. Д. Затем, когда мы запускаем нашу команду, чтобы собрать jar и отправить топология штурма включает в себя правильный файл конфигурации в зависимости от среды развертывания. Болты и носики просто читают конфигурацию, которая им требуется, из карты stormConf, которая передается им в методе prepare() вашего болта.

С http://storm.apache.org/documentation/Configuration.html:

Каждая конфигурация имеет значение по умолчанию, определенное в defaults.yaml в кодовой базе Storm. Вы можете переопределить эти конфигурации, определив storm.yaml в пути к классам Nimbus и супервизоров. Наконец, вы можете определить специфическую для топологии конфигурацию, которую вы отправляете вместе с топологией при использовании StormSubmitter. Однако конфигурация, относящаяся к топологии, может переопределять только конфиги с префиксом "TOPOLOGY".

Storm 0.7.0 и более поздние версии позволяют переопределять конфигурацию для каждого болта / носика.

На http://nathanmarz.github.io/storm/doc/backtype/storm/StormSubmitter.html вы также увидите, что submitJar и submitTopology передаются карте с именем conf.

Надеюсь, это поможет вам начать.

Я решил эту проблему, просто предоставив конфиг в коде:

config.put(Config.TOPOLOGY_WORKER_CHILDOPTS, SOME_OPTS);

Я пытался указать топологию storm.yaml но это не работает Поправьте меня, если вы заставите его работать на storm.yaml.

Обновить:
Для тех, кто хочет знать, что такое SOME_OPTS, это от Сатиша Дугганы из списка рассылки Storm:

Config.TOPOLOGY_WORKER_CHILDOPTS: параметры, которые могут переопределять WORKER_CHILDOPTS для топологии. Вы можете настроить любые параметры Java, такие как память, GC и т. Д.

В вашем случае это может быть

config.put(Config.TOPOLOGY_WORKER_CHILDOPTS, "-Xmx1g");

На самом деле, вам лучше всего сохранить конфигурацию в хранилище изменяемых значений ключей (s3, redis и т. Д.), А затем использовать его для настройки соединения с базой данных, которое вы затем используете (я предполагаю, что вы уже планируете ограничить то, как часто вы общаетесь с базой данных, так что затраты на эту конфигурацию не имеют большого значения). Такая конструкция позволяет изменять соединение с базой данных на лету без необходимости даже повторного развертывания топологии.

Мы видели ту же проблему и решили ее, добавив приведенную ниже топологию

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, как показано ниже.

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

Я сталкиваюсь с той же проблемой, что и вы, и вот мое хитрое решение:

Используйте простой файл 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;
    // ...
}

Этот файл помещается в мою папку конфигурации, а затем написать сценарий, скажем, compile.sh который скопирует его в нужный пакет и выполнит компиляцию, выглядит так:

cp config/topo_config.java src/main/java/com/xxx/
mvn package

Конфигурация достигается напрямую:

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

Идея состоит в том, что когда вы строите свою топологию, вы создаете экземпляры своих патрубков и болтов (среди прочего), и эти экземпляры сериализуются и распределяются по нужным местам в кластере. Если вы хотите настроить поведение носика или болта, вы делаете это при создании топологии перед отправкой, и вы делаете это, устанавливая переменные экземпляра на болте или носике, которые, в свою очередь, управляют желаемым настраиваемым поведением.

Я также столкнулся с той же проблемой. Я решил ее, настроив NFS в своем кластере, и поместил этот файл конфигурации в общее местоположение, чтобы он был доступен для всех компьютеров кластера. Настроить NFS в системе linux очень просто.

Другие вопросы по тегам