缺失依赖

在默认状态下,Maven 在 build 的时候不会包含所依赖的 jar 包。当运行一个 Spark 任务,如果 Spark worker 机器上没有包含所依赖的 jar 包会发生类无法找到的错误(ClassNotFoundException)。

有一个简单的方式,在 Maven 打包的时候创建 shadeduber 任务可以让那些依赖的 jar 包很好地打包进去。

使用 <scope>provided</scope> 可以排除那些没有必要打包进去的依赖,对 Spark 的依赖必须使用 provided 标记,因为这些依赖已经包含在 Spark cluster中。在你的 worker 机器上已经安装的 jar 包你同样需要排除掉它们。

下面是一个 Maven pom.xml 的例子,工程了包含了一些需要的依赖,但是 Spark 的 libraries 不会被打包进去,因为它使用了 provided

  1. <project>
  2. <groupId>com.databricks.apps.logs</groupId>
  3. <artifactId>log-analyzer</artifactId>
  4. <modelVersion>4.0.0</modelVersion>
  5. <name>Databricks Spark Logs Analyzer</name>
  6. <packaging>jar</packaging>
  7. <version>1.0</version>
  8. <repositories>
  9. <repository>
  10. <id>Akka repository</id>
  11. <url>http://repo.akka.io/releases</url>
  12. </repository>
  13. </repositories>
  14. <dependencies>
  15. <dependency> <!-- Spark -->
  16. <groupId>org.apache.spark</groupId>
  17. <artifactId>spark-core_2.10</artifactId>
  18. <version>1.1.0</version>
  19. <scope>provided</scope>
  20. </dependency>
  21. <dependency> <!-- Spark SQL -->
  22. <groupId>org.apache.spark</groupId>
  23. <artifactId>spark-sql_2.10</artifactId>
  24. <version>1.1.0</version>
  25. <scope>provided</scope>
  26. </dependency>
  27. <dependency> <!-- Spark Streaming -->
  28. <groupId>org.apache.spark</groupId>
  29. <artifactId>spark-streaming_2.10</artifactId>
  30. <version>1.1.0</version>
  31. <scope>provided</scope>
  32. </dependency>
  33. <dependency> <!-- Command Line Parsing -->
  34. <groupId>commons-cli</groupId>
  35. <artifactId>commons-cli</artifactId>
  36. <version>1.2</version>
  37. </dependency>
  38. </dependencies>
  39. <build>
  40. <plugins>
  41. <plugin>
  42. <groupId>org.apache.maven.plugins</groupId>
  43. <artifactId>maven-compiler-plugin</artifactId>
  44. <version>2.3.2</version>
  45. <configuration>
  46. <source>1.8</source>
  47. <target>1.8</target>
  48. </configuration>
  49. </plugin>
  50. <plugin>
  51. <groupId>org.apache.maven.plugins</groupId>
  52. <artifactId>maven-shade-plugin</artifactId>
  53. <version>2.3</version>
  54. <executions>
  55. <execution>
  56. <phase>package</phase>
  57. <goals>
  58. <goal>shade</goal>
  59. </goals>
  60. </execution>
  61. </executions>
  62. <configuration>
  63. <filters>
  64. <filter>
  65. <artifact>*:*</artifact>
  66. <excludes>
  67. <exclude>META-INF/*.SF</exclude>
  68. <exclude>META-INF/*.DSA</exclude>
  69. <exclude>META-INF/*.RSA</exclude>
  70. </excludes>
  71. </filter>
  72. </filters>
  73. <finalName>uber-${project.artifactId}-${project.version}</finalName>
  74. </configuration>
  75. </plugin>
  76. </plugins>
  77. </build>
  78. </project>

阅读原文