缺失依赖
在默认状态下,Maven 在 build 的时候不会包含所依赖的 jar 包。当运行一个 Spark 任务,如果 Spark worker 机器上没有包含所依赖的 jar 包会发生类无法找到的错误(ClassNotFoundException)。
有一个简单的方式,在 Maven 打包的时候创建 shaded 或 uber 任务可以让那些依赖的 jar 包很好地打包进去。
使用 <scope>provided</scope> 可以排除那些没有必要打包进去的依赖,对 Spark 的依赖必须使用 provided 标记,因为这些依赖已经包含在 Spark cluster中。在你的 worker 机器上已经安装的 jar 包你同样需要排除掉它们。
下面是一个 Maven pom.xml 的例子,工程了包含了一些需要的依赖,但是 Spark 的 libraries 不会被打包进去,因为它使用了 provided:
<project><groupId>com.databricks.apps.logs</groupId><artifactId>log-analyzer</artifactId><modelVersion>4.0.0</modelVersion><name>Databricks Spark Logs Analyzer</name><packaging>jar</packaging><version>1.0</version><repositories><repository><id>Akka repository</id><url>http://repo.akka.io/releases</url></repository></repositories><dependencies><dependency> <!-- Spark --><groupId>org.apache.spark</groupId><artifactId>spark-core_2.10</artifactId><version>1.1.0</version><scope>provided</scope></dependency><dependency> <!-- Spark SQL --><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.10</artifactId><version>1.1.0</version><scope>provided</scope></dependency><dependency> <!-- Spark Streaming --><groupId>org.apache.spark</groupId><artifactId>spark-streaming_2.10</artifactId><version>1.1.0</version><scope>provided</scope></dependency><dependency> <!-- Command Line Parsing --><groupId>commons-cli</groupId><artifactId>commons-cli</artifactId><version>1.2</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>2.3</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals></execution></executions><configuration><filters><filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude></excludes></filter></filters><finalName>uber-${project.artifactId}-${project.version}</finalName></configuration></plugin></plugins></build></project>
