找到多个 defaults.yaml 资源

Found multiple defaults.yaml resources

当我尝试提交拓扑时,我发现了这个

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

这里是pom文件

<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>

pom 文件的第 2 部分

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

pom 文件的第 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>

运行在 LocalCluster 中或通过 StormSubmitter 远程设置拓扑(这是项目中的默认设置)存在根本区别。

storm-core 的范围默认设置为 <scope>provided</scope>,因为这些 class 文件无论如何都在集群中可用。 provided 告诉 maven,那些 classes 不能包含在组装的 jar 文件中,从而减少 jar 的大小。此外,如果多次提供文件,这可以避免冲突——如果将范围更改为 compiledefault.yaml 就会发生这种情况。对于这些情况,来自 storm-core 的所有文件都打包到您 jar 中并提交给集群。 Storm 找到文件 defaults.yaml "locally"(即,在集群中的本地工作机器上)和您的 jar。因此,Storm 不知道使用哪一个并引发错误。

但是,如果您也在本地 运行,provided 会排除那些 class 文件。当然,在本地这些文件不会自动可用,但在启动本地 JVM 时必须包含在 CLASSPATH 中。由于 providedstorm-core 中排除了文件,您会得到 ClassNotFound 异常。

作为每次要提交到不同环境时更改范围的替代方法,您可以将范围设置为 compile 并明确包含拓扑 Main/Bolt/Spout classes在您的 maven-jar-plugin 设置中。此显式包含会自动从 jar 中排除所有其他文件,即来自 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>