Смешанная топология apache-storm с python - ModuleNotFoundError: нет модуля с именем storm

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

Для болта на основе Python я написал оболочку Java:

class PythonBolt extends ShellBolt implements IRichBolt {

    public PythonBolt() {
        super("python", "C:\\somepath\\sample.py");
    }
    @Override
    public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
    }

    @Override
    public Map<String, Object> getComponentConfiguration() {
        return null;
    }
}

Вот как выглядит мой sample.py:

импортный шторм

class SplitSentenceBolt(storm.BasicBolt):
    def process(self, tup):
        print("Python rocks!")
        words = tup.values[0].split(" ")
        print(tup.values[0])

SplitSentenceBolt().run()

Затем я собрал все это вместе и попытался запустить следующий фрагмент:

public class SampleBolt {

    public static void main(String[] args) throws Exception {
        TopologyBuilder builder = new TopologyBuilder();
        builder.setSpout("Hello", new RawDataLevelSpout(), 12);
        builder.setBolt("World", new PythonBolt(), 12);

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


        LocalCluster cluster = new LocalCluster();
        cluster.submitTopology("Hello-World-BaiJian", config, builder.createTopology());
        Utils.sleep(100000);
        cluster.killTopology("Hello-World-BaiJian");
        cluster.shutdown();
    }
}

Все загружается правильно, однако я получаю следующее исключение:

import storm
ModuleNotFoundError: No module named 'storm'

    at org.apache.storm.utils.ShellProcess.launch(ShellProcess.java:94) ~[storm-client-2.0.0-SNAPSHOT.jar:2.0.0-SNAPSHOT]
    at org.apache.storm.task.ShellBolt.prepare(ShellBolt.java:154) ~[storm-client-2.0.0-SNAPSHOT.jar:2.0.0-SNAPSHOT]
    at org.apache.storm.executor.bolt.BoltExecutor.init(BoltExecutor.java:84) ~[storm-client-2.0.0-SNAPSHOT.jar:2.0.0-SNAPSHOT]
    at org.apache.storm.executor.bolt.BoltExecutor.call(BoltExecutor.java:93) ~[storm-client-2.0.0-SNAPSHOT.jar:2.0.0-SNAPSHOT]
    at org.apache.storm.executor.bolt.BoltExecutor.call(BoltExecutor.java:45) ~[storm-client-2.0.0-SNAPSHOT.jar:2.0.0-SNAPSHOT]
    at org.apache.storm.utils.Utils$2.run(Utils.java:329) ~[storm-client-2.0.0-SNAPSHOT.jar:2.0.0-SNAPSHOT]

Любые намеки на то, как это преодолеть? Как мне установить этот пакет Python Storm? Можно ли установить его через Anaconda (мне не удалось найти пакет)?

2 ответа

Решение

Просто для будущих людей - сообщение было очень точным. Я просто пропустил storm.py в той же папке, где находился мой sample.py. Простое добавление следующего файла: https://github.com/apache/storm/blob/v1.2.1/storm-multilang/python/src/main/resources/resources/storm.py в эту папку решило проблему! Также возможно выполнить этот код через LocalCluster.

Я не уверен, что поддержка multilang работает с LocalCluster, когда вы запускаете его из IDE. См. /questions/1377588/kak-zapustit-wordcounttopology-ot-shtormovogo-startera-v-intellij/1377600#1377600. Кажется, что есть обходной путь, упомянутый в разговоре после этого ответа.

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