前面我们从github拉取了Spark2.4.0源码,并成功完成了编译。下面我们搭建Spark工程环境,并基于源码example工程,进行本地调试。
开发工具
intellij idea 2018.1.6
java version “1.8.0_181”
Apache Maven 3.5.4
工程导入
将下载源码导入到idea中,编译确保没有任何异常报错。
范例程序 WorldCount
代码概览
首先打开examples工程中的JavaWorldCount,熟悉一下代码逻辑。Spark源码中已经为我们提供好了测试文件,当然你也可以选择自己本地的测试文本文件。
入口类:JavaWorldCount
测试文本:prople.txt
运行配置参数
主类:org.apache.spark.examples.JavaWorldCount
VM option: -Dspark.master=local
Program arguments:/Users/didi/Documents/workspace/code/spark/examples/src/main/resources/people.txt
运行结果
排除完各种异常后,终于运行成功。
1 | 19: 1 |
当然,绝不会如此顺利。
##报错排查
###ClassNotFoundException(99%)
遇到的问题99%都是ClassNotFoundException。还有%1的我们单独解决。
解决方案:
将examples工程pom文件中的scope值provided改为空或compile。有帖子说
直接修改spark-examples_2.11.iml,将里面的scope=”PROVIDED” 全都替换成空就可以了
亲测不能完全解决问题。
笨办法也是最靠谱的,将pom文件中的PROVIDED注释掉。如:
ClassNotFoundException(1%)
还有1%的,基本都是jetty相关,还有一个是guava包相关。一开始始终想着通过scope参数来调整,后来发现始终无法加载到jetty相关类。最后简单粗暴,在example工程的pom文件中,重新引入。
解决方案:
在pom.xml文件中引入jetty相关依赖包。
1 | <dependency> |
###import org.apache.spark.sql.catalyst.parser.SqlBaseParser._不存在
解决方案:
有网友帖子解释了具体原因
使用了ANTLR来生成SQLParser导致的,直接在spark-catalyst工程下执行mvn clean compile就可以了,然后需要将生成的target/generated-sources/antlr4目录mark as sources
将生成的target/generated-sources/antlr4目录mark as sources
#范例程序JavaSparkPi
翻过了WorldCount的艰难坎坷,JavaSparkPi则显得苦尽甘来,测试异常简单。
代码概览
首先打开examples工程中的JavaSparkPi,熟悉一下代码逻辑。
入口类:JavaSparkPi
运行配置参数
主类:org.apache.spark.examples.JavaWorldCount
VM option: -Dspark.master=local
运行结果
1 | Pi is roughly 3.13664 |
至此,Spark源码环境搭建完毕,下面就在源码中打断点进行dubug调试,开启你的Spark源码阅读之旅吧。
本文链接: https://stefanxiepj.github.io/archives/484bfc5.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!