Как запустить WordCountTopology от штормового стартера в Intellij

Я уже некоторое время работаю со Storm, но хочу начать с разработки. Как и предполагалось, я использую IntelliJ (до сих пор я использовал Eclipse и писал только топологии против Java API).

Я также смотрел на https://github.com/apache/storm/tree/master/examples/storm-starter

Эта документация не полная. Сначала я не смог ничего запустить в Intellij. Я мог бы понять, что мне нужно удалить область зависимости от штормового ядра (в шторм-стартере pom.xml). (найдено здесь: шторм-стартер с интеллигентной идеей, проект maven не может найти класс)

После этого мне удалось построить проект. Я тоже могу бегать ExclamationTopology без проблем в IntelliJ. Тем не мение, WordCountTopology выходит из строя.

Сначала я получил следующую ошибку:

java.lang.RuntimeException: backtype.storm.multilang.NoOutputException: канал к подпроцессу, кажется, сломан! Нет вывода читать. Исключение Serializer: Traceback (последний вызов был последним): файл "splitsentence.py", строка 16, в шторме импорта ImportError: Нет модуля с именем storm

Обновление: установка python-storm не требуется, чтобы это работало

Я смог решить это с помощью: apt-get install python-storm (из Stackru)

Тем не менее, я не говорю на Python, и мне было интересно, в чем проблема и почему я могу решить ее следующим образом. Просто хочу углубиться в это. Может быть, кто-то может объяснить.

К сожалению, сейчас я получаю другую ошибку:

java.lang.RuntimeException: backtype.storm.multilang.NoOutputException: канал к подпроцессу, кажется, сломан! Нет вывода читать. Исключение Serializer: Traceback (последний вызов был последним): файл "splitsentence.py", строка 18, в классе SplitSentenceBolt(storm.BasicBolt): AttributeError: объект "модуль" не имеет атрибута "BasicBolt"

Я не нашел никакого решения в интернете. Спрашивая в dev@storm.apache.org тоже не помогло. Я иду следующее предложение:

Я думаю, что всегда предполагалось, что топология всегда будет вызываться через командную строку шторма. Таким образом, рабочим каталогом будет ${STORM-INSTALLATION}/bin/storm Так как storm.py находится в этом каталоге, splitSentence.py сможет находить штормовые модули. Можете ли вы указать рабочему каталогу путь, где присутствует storm.py, а затем попробуйте. Если это работает, мы можем добавить это позже к документации

Однако выбор рабочего каталога не решил проблему.

И поскольку я не знаком с Python и, поскольку я новичок в IntelliJ, я застрял сейчас. Так как ExclamationTopology работает, я думаю, мои основные настройки правильны.

Что я делаю не так? Можно вообще бегать WordcountTopology в LocalCluster в IntelliJ?

2 ответа

Решение

К сожалению, AFAIK, вы не можете запустить многоязычную функцию с LocalCluster без упакованного файла.

ShellProcess использует codeDir объекта TopologyContext, который используется супервизором. Рабочие сериализуются в stormcode.ser, но многоязычные файлы должны быть извлечены за пределы сериализованного файла, чтобы python / ruby ​​/ node / etc мог загрузить его.

Достигнуть этого с помощью режима распространения легко, потому что всегда есть отправленный пользователем jar, и супервизор может знать, что это отправленный пользователем.

Но выполнить это в локальном режиме непросто, потому что супервизор не может знать jar, отправленный пользователем, и пользователи могут запускать топологию в локальном режиме без упаковки.

Таким образом, Supervisor в локальном режиме находит каталог ресурсов ("resources") из каждого jar (который заканчивается на "jar") в classpath и копирует первое вхождение в codeDir.

storm jar помещает пользовательскую топологию jar в первый из classpath, чтобы его можно было запускать без проблем.

Поэтому обычно ShellProcess не находит "splitsentence.py". Может быть, ваш рабочий каталог или PYTHONPATH сделали свое дело.

Я боролся с подобной проблемой, не с примерной топологией, а с моей собственной, использующей болт Python.

Также испытывалось, что объект "AttributeError: 'module' не имеет исключения атрибута" BasicBolt "- в локальном режиме и при отправке в кластер.

Ресурсов по этому вопросу очень мало, я нашел ваш вопрос и еще немного обсуждаю этот вопрос.

В случае, если у кого-то есть такая же проблема: убедитесь, что вы включили правильную зависимость "multilang-python" Maven в свой файл pom. Это упакует правильные зависимости времени выполнения в файл JAR, необходимый для запуска вашей топологии.

Мне удалось запустить его на моем virtualbox, шторм версии 1.2.2:

просто скачайте https://github.com/apache/storm/blob/master/storm-multilang/python/src/main/resources/resources/storm.py и поместите его в любую папку, например: /apache-storm-1.2.2/examples/storm-starter/multilang/resources/, а затем измените основную функцию:

public static void main(String[] args) throws Exception {

    SplitSentence pythonSplit = new SplitSentence();
    Map env = new HashMap();
    env.put("PYTHONPATH", "/apache-storm-1.2.2/examples/storm-starter/multilang/resources/");
    pythonSplit.setEnv(env);

    TopologyBuilder builder = new TopologyBuilder();

    builder.setSpout("spout", new RandomSentenceSpout(), 5);

    builder.setBolt("split",pythonSplit, 8).shuffleGrouping("spout");
    builder.setBolt("count", new WordCount(), 12).fieldsGrouping("split", new Fields("word"));

    Config conf = new Config();
    conf.setDebug(true);

    if (args != null && args.length > 0) {
      conf.setNumWorkers(3);

      StormSubmitter.submitTopologyWithProgressBar(args[0], conf, builder.createTopology());
    }
    else {
      conf.setMaxTaskParallelism(3);

      LocalCluster cluster = new LocalCluster();
      cluster.submitTopology("word-count", conf, builder.createTopology());

      Thread.sleep(600000);

      cluster.shutdown();
    }
  }

подробные инструкции можно найти в моем блоге, включая другие проблемы, возникающие при его работе в локальном режиме и режиме локального кластера: https://lyhistory.com/storm/

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