本文记录下直接在IDEA中运行调试Spark代码踩到的几个小坑。下面用的是tag v2.1.0的代码。
本地运行org.apache.spark.examples.sql.SparkSQLExample
,需要加上-Dspark.master=local
,
然后遇到了下面几个错误,
编译时错误
- 找不到
org.apache.spark.sql.catalyst.parser.SqlBaseParser
。使用了ANTLR
来生成SQLParser导致的,直接在spark-catalyst工程下执行mvn clean compile
就可以了,然后需要将生成的target/generated-sources/antlr4目录mark as sources,
PS: mark的时候要避免mark了多层,例如上图中把target也mark了会出现各种XXX is already defined as XXX
这样的错误
- 找不到
org.apache.spark.streaming.flume.sink.SparkFlumeProtocol
。使用了Avro Protocol
导致的,打开Maven Projects视图,对Flume Sink工程执行generate sources,
然后同样需要将生成的target下的compiled_avro目录mark as sources,
运行时错误
- 各种
ClassNotFoundException
。这是因为example工程里面很多的依赖的scope都是provided
,本地运行时就找不到了。我们可以直接在IDEA里面修改scope而不用去改pom里面的配置,
但是这样一个一个改实在太蠢了,可以直接修改spark-examples_2.11.iml
,将里面的scope="PROVIDED"
全都替换成空就可以了。
- 找不到
spark-version-info.properties
。
Caused by: org.apache.spark.SparkException: Error while locating file spark-version-info.properties
at org.apache.spark.package$SparkBuildInfo$.liftedTree1$1(package.scala:75)
at org.apache.spark.package$SparkBuildInfo$.<init>(package.scala:61)
at org.apache.spark.package$SparkBuildInfo$.<clinit>(package.scala)
如下图添加一个空的spark-version-info.properties
文件就可以了,
alright,现在可以愉快的调Spark的代码了,have fun^_^