шторм-развертывание отправить топологию java.lang.NoClassDefFoundError

1

после запуска топологии в локальном кластере я создал удаленный грозный кластер (штурм-развертывание Натана). Я удалил Storm jars из пути сборки в eclipse, прежде чем создавать runnable jar с "зависимостями пакета". моя топология использует storm-kafka-0.9.0-wip16a-scala292.jar, которую я либо оставил в пути сборки, либо удалил из пути сборки до создания runnable jar (просто чтобы решить эту проблему..). когда я использую следующую команду:

./storm jar /home/ubuntu/Virtual/stormTopologia4.jar org.vicomtech.main.StormTopologia

он всегда отвечает:

Exception in thread "main" java.lang.NoClassDefFoundError: OpaqueTridentKafkaSpout
  at java.lang.Class.getDeclaredMethods0(Native Method)
  at java.lang.Class.privateGetDeclaredMethods(Class.java:2451)
  at java.lang.Class.getMethod0(Class.java:2694)
  at java.lang.Class.getMethod(Class.java:1622)
  at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
  at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: OpaqueTridentKafkaSpout
  at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
  at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:356)

Поскольку эта топология отлично работала на AWS на одном экземпляре в качестве исполняемой банки, я не могу понять, что мне не хватает... вот код внутри моего основного метода:

        Config conf = new Config();

        OpaqueTridentKafkaSpout tridentSpout = crearSpout(
                kafkadir, "test");


        OpaqueTridentKafkaSpout logUpvSpout = crearSpout(kafkadir,
                "logsUpv");

        OpaqueTridentKafkaSpout logSnortSpout = crearSpout(
                kafkadir, "logsSnort");

        try {
            StormSubmitter.submitTopology(
                    "hackaton",
                    conf,
                    buildTopology( tridentSpout, logUpvSpout,
                            logSnortSpout));
        } catch (AlreadyAliveException | InvalidTopologyException e) {

            e.printStackTrace();
        }



    } catch (IOException e) {
        e.printStackTrace();
    } catch (TwitterException e) {
        e.printStackTrace();
    }

}

private static OpaqueTridentKafkaSpout crearSpout(
        String testKafkaBrokerHost, String topic) {
    KafkaConfig.ZkHosts hosts = new ZkHosts(testKafkaBrokerHost, "/brokers");

    TridentKafkaConfig config = new TridentKafkaConfig(hosts, topic);
    config.forceStartOffsetTime(-2);

    config.scheme = new SchemeAsMultiScheme(new StringScheme());
    return new OpaqueTridentKafkaSpout(config);
}


public static StormTopology buildTopology(OpaqueTridentKafkaSpout tridentSpout,
        OpaqueTridentKafkaSpout logUpvSpout,
        OpaqueTridentKafkaSpout logSnortSpout
        ) throws IOException,
        TwitterException {

    TridentTopology topology = new TridentTopology();



    topology.newStream("tweets2", tridentSpout)
            .each(new Fields("str"), new OnlyEnglishSpanish())
            .each(new Fields("str"), new WholeTweetToMongo())
            .each(new Fields("str"), new TextLangExtracter(),
                    new Fields("text", "lang")).parallelismHint(6)
            .project(new Fields("text", "lang"))
            .partitionBy(new Fields("lang"))
            .each(new Fields("text", "lang"), new Analisis(),
                    new Fields("result")).parallelismHint(6)
            .each(new Fields("result"), new ResultToMongo());


    return topology.build();

}

Есть ли способ сделать OpaqueTridentKafkaSpout доступным? заранее спасибо

Надеюсь, это не глупый вопрос, я очень новичок в этой области

Теги:
amazon-web-services
apache-kafka
apache-storm

1 ответ

1
Лучший ответ

Мы можем сохранить баннер бури в пути сборки, когда вы создаете jar-with-dependencies, нам просто нужно сказать maven, чтобы он не связывает его (см. "Предоставленную" область действия, что означает, что jar предоставляется средой выполнения, следовательно, не нужно связывать):

<dependency>
    <groupId>storm</groupId>
    <artifactId>storm</artifactId>
    <version>0.9.0-rc2</version>
    <scope>provided</scope>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Однако кафка-носик должен быть включен в jar-with-dependencies, поэтому его выражение maven выглядит следующим образом:

<dependency>
        <groupId>storm</groupId>
        <artifactId>storm-kafka</artifactId>
        <version>0.9.0-wip16a-scala292</version>
</dependency>

Чтобы проверить материал, вы всегда можете разархивировать полученную банку и проверить вручную, что необходимые классы присутствуют/отсутствуют, как они должны, прежде чем развертывать штурм.

  • 0
    спасибо @Svend, я попробую ваше решение! кстати, у вас есть отличные учебники по этим областям, очень полезно!
  • 0
    спасибо, рад что они тебе понравились :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню