2015-10-26 2 views
4

, когда я пытался представить топологию я нашел этотНайдено несколько defaults.yaml ресурсов

Exception in thread "main" java.lang.RuntimeException: Found multiple defaults.yaml resources. You're probably bundling the Storm jars with your topology jar. 
at backtype.storm.utils.Utils.findAndReadConfigFile(Utils.java:115) 
at backtype.storm.utils.Utils.readDefaultConfig(Utils.java:135) 
at backtype.storm.utils.Utils.readStormConfig(Utils.java:155) 
at backtype.storm.StormSubmitter.submitTopology(StormSubmitter.java:61) 
at backtype.storm.StormSubmitter.submitTopology(StormSubmitter.java:40) 
at trident.myproject.main(myproject.java:288) 

Но эта ошибка появилась после того, как обновляемые в pom.xml по

<scope>compile</scope> instead of <scope>provided</scope>

, что, поскольку я был ошибка

An exception occured while executing the Java class. storm/trident/state/StateFactory 

здесь пОМ файл

<plugins> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <configuration> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <archive> 
        <manifest> 
         <mainClass>trident.myproject</mainClass> 
         <!-- <mainClass>crawler.Crawler</mainClass> --> 
        </manifest> 
       </archive> 
      </configuration> 

часть 2 из п файла

<executions> 
       <execution> 
        <id>make-assembly</id> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

часть 3 из п файла

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
    </plugins> 
+0

Кажется, что в вашем банке по-прежнему имеется 'defaults.yaml'. Вы пытались «mvn clean» перед упаковкой? Как вы упаковываете свою банку? Возможно, вам нужно явно исключить файл. –

+0

да, я попробовал mvn clean теперь файл pom проекта содержит , предоставленный, и попытался использовать эту команду. Mvn compile exec: java -Dexec.classPathScope = compile -Dexec.mainClass = trident.TheProject и результат. Исключение произошло во время выполнение класса Java. storm/trident/state/StateFactory –

+0

Можете ли вы опубликовать сообщение об ошибке/стеке? Вы пытались отправить через 'storm jar myJarFile.jar package.and.MyMainClass'? –

ответ

7

Существует принципиальная разница в управлении топологией в LocalCluster или удаленно через StormSubmitter (который по умолчанию в проекте).

Значение storm-core установлено равным <scope>provided</scope>, поскольку эти файлы классов доступны в кластере в любом случае. provided сообщает maven, что эти классы не должны быть включены в файл jar, который собран, тем самым уменьшая размер банки. Кроме того, это позволяет избежать конфликтов, если файлы предоставляются несколько раз - это то, что происходит с default.yaml, если вы измените область действия на compile. В этом случае все файлы от storm-core упакованы в вас jar и отправлены в кластер. Storm находит файл defaults.yaml «локально» (то есть локально на рабочем компьютере в кластере) и в вашем jar. Таким образом, Storm не знает, какой из них использовать и вызывает ошибку.

Однако provided исключает эти файлы классов, если вы также запускаете локально. Конечно, локально эти файлы недоступны автоматически, но должны быть включены в CLASSPATH при запуске локальной JVM. Поскольку provided исключает файлы с storm-core, вы получаете исключение ClassNotFound.

В качестве альтернативы изменить область действия каждый раз, когда вы хотите отправить в другую среду, вы можете установить область действия на compile и включить классы топологии Main/Bolt/Spout в явные настройки maven-jar-plugin. Это явное включение автоматически исключает все другие файлы из банки, то есть все файлы с storm-core.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.6</version> 

    <executions> 
    <execution> 
     <id>MyTopology</id> 
     <phase>package</phase> 
     <goals> 
     <goal>jar</goal> 
     </goals> 
     <configuration> 
     <includes> 
      <include>my/topology/package/**/*.class</include> 
     </includes> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
+1

Спасибо за ваше замечательное объяснение, я попробую сейчас –

+0

, так что часть 2 файла pom, я должен его изменить? Я разместил части файла pom –

+0

Используйте 'maven-jar-plugin' вместо' maven-assembly-plugin' или исключаем 'storm-core' через' ': https://maven.apache.org/plugins/ maven-assembly-plugin/examples/single/includes-and-exclusion-artifacts.html –

Смежные вопросы