Как запустить 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/