概述

本文主要记录在win10环境下编译spark源码过程中的主要步骤,中间涉及一些问题导致运行example例子未成功,因此记录下来加深印象。话不多说,开始记录。

环境准备

  1. jdk version :1.8
  2. scala version :2.10.0
  3. maven version :3.3.9
  4. spark version : 2.2.0

step1

在一切准备妥当之后,就可以动手了,首先下载spark源码,
可以去官网下载源码包,此处不做赘述
可以去github上直接下载源码包https://github.com/apache/spark/releases/tag/v2.2.0 ,如果你想下载其他版本的,就修改后面的版本号为你需要的版本号就好了

接下来我使用命令行方式从github上来下载源码。

进入你需要存放源码的文件夹中,在git bash 中clone github上的spark源码
执行命令:git clone -b branch-2.2 https://github.com/apache/spark (-b 指定分支名 )
此时你会遇到第一个问题,下载速度太慢了或者压根没有反应,没事,接着走
这时候有多重选择,选择适合你的一种
<一> 修改ip映射来提高下载速度
(1)在 https://www.ipaddress.com/ 查找 http://github.comhttp://global.ssl.fastly.net对应的ip地址
(2)添加对应的 ip 和 urlname 映射到 C:\Windows\System32\drivers\etc\ 下的 hosts 文件里
例如
199.232.68.249 github.global.ssl.fastly.net
140.82.112.3 github.com
(3)在powerShell中刷新DNS 快捷键: win+r cmd 回车
输入 ipconfig/flushdns 回车
这时候再次执行clone命令,大概率会有速度突变
<二> 使用github的镜像库下载
git clone -b branch-2.2 https://github.com.cnpmjs.org/apache/spark.git (https://github.com.cnpmjs.org就是github.com的镜像站)
<三> 使用gitee创建github仓库的国内仓库
使用gitee来导入git上的spark仓库,gitee会内部优化网络问题,这时你只需要改变git地址为你gitee上的地址(前提是你得先注册gitee的地址,然后将spark源码clone到你的gitee地址里),然后执行
git clone -b branch-2.2 https://gitee.com/xxx/spark.git (xxx 为你的gitee路径,此处只记录地址格式)

step2

下载好源码之后,就可以开始编译源码了,首先进入到spark目录下

执行 mvn -T 4 -DskipTests clean package

-T 4 使用4个线程编译

-DskipTests 不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下

clean 清除项目环境

package 打包

依赖你当前网络的状况 ,此刻进入漫长或者短暂的等待中。。。

github spark源码 spark源码在哪下载_github


当出现这一幕时,spark 源码编译成功,祝贺你!

step3

使用idea打开这个项目,等待idea导入完成后,我们运行example包下的SparkPi案例

所需参数 -Dspark.master=local

github spark源码 spark源码在哪下载_spark_02

如图配置以后,点击运行

github spark源码 spark源码在哪下载_git_03


报错信息:

Exception in thread “main” java.lang.NoClassDefFoundError: scala/collection/Seq

简单明了,是因为scala的包未导入,不对呀,spark都是用scala编写的,怎么可能没有scala环境,打开pom文件,我们可以看到依赖作用域都为provided,修改provided 为compile,我是为了图方便,将所有的provided 改为compile,正常操做是不允许的,万一有个依赖名称叫provided 呢。

github spark源码 spark源码在哪下载_spark_04


将pom文件中的依赖作用域修改完后,重新import maven以后,再次run

此时又会报另一个错

github spark源码 spark源码在哪下载_spark_05


就是因为这一步浪费了我很多时间,具体原因不做分析,先看解决步骤吧

先恢复之前修改的 pom文件,import changes 以后

进入到File>Project Structure>Modules>spark-examples_2.11>Dependencies栏目中

将 spark-branch-2.2\assembly\target\scala-2.11\jars 添加到依赖里 重新 import changes

再次执行 run

github spark源码 spark源码在哪下载_spark_06


报错信息

not found: type SparkFlumeProtocol

val transactionTimeout: Int, val backOffInterval: Int) extends SparkFlumeProtocol with Logging {

github spark源码 spark源码在哪下载_git_07


解决办法:

1:打开Module (ctrl shift alt s ) 找到 spark-streaming-flume-sink_2.11 module

2:右键 target ,取消 excluded 如图所示

github spark源码 spark源码在哪下载_github_08


3:当前target ->scala-2.11->src_managed ->main->compiled-avro 右键 Sources

github spark源码 spark源码在哪下载_github spark源码_09


注:如果target下没有下面的子目录,请重新 Rebuild-Project 或者进入到该module根目录下执行

mvn clean compile 或者 mvn clean package 命令

此时源码编译已大功告成!
补充:spark on yarn 配置

spark jar 包下载
 https://archive.apache.org/dist/spark/scala下载
 wget https://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.tgzscala-version 2.2.0
 https://archive.apache.org/dist/spark/spark-2.2.0/spark-2.2.0-bin-hadoop2.7.tgz/conf目录下
 cp log4j.properties.template log4j.properties
 cp spark-env.sh.template spark-env.sh
 cp spark-defaults.conf.template spark-defaults.confvi spark-env.sh
 HADOOP_HOME=/opt/module/hadoop-2.7.7
 HADOOP_CONF_DIR=/opt/module/hadoop-2.7.7/etc/hadoop
 SPARK_MASTER_IP=centos101
 SPARK_MASTER_PORT=7077
 SPARK_LOCAL_IP=centos101
 SPARK_DRIVER_MEMORY=500m
 SPARK_WORKER_CORES=2
 SPARK_WORKER_INSTANCES=1
 SPARK_WORKER_MEMORY=300m
 JAVA_HOME=/opt/module/jdk1.8.0_144
 SCALA_HOME=/opt/module/scala-2.11.8
 SPARK_HOME=/opt/module/spark
 #SPARK_MASTER_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER-Dspark.deploy.zookeeper.url=centos101:2181,centos102:2181,centos103:2181-Dspark.deploy.zookeeper.dir=/spark"vi slaves
 centos101
 centos102
 centos103scp -r /opt/module/spark centos102:/opt/module/
 scp -r /opt/module/spark centos103:/opt/module/

修改各节点上的spark-env.sh下的 SPARK_LOCAL_IP 为当前节点的 hostname或者ip

spark-shell 验证是否安装成功

github spark源码 spark源码在哪下载_github spark源码_10


spark远程debug调试

本地安装的虚拟机,共三台节点,使用yarn提交程序,本地idea中通过debug端口来调试spark程序

集群提交命令 8787 (端口号可以自己设置)

spark-submit --master yarn --deploy-mode client --executor-memory 1G --executor-cores 1 --class org.apache.spark.examples.SparkPi --driver-java-options “-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8787” /opt/module/spark/examples/jars/spark-examples_2.11-2.2.0.jar 1000

idea中新建remote jvm debug。这里因为是使用的yarn client提交的程序,所以ip即是你提交任务的节点ip和8787。如果你使用的cluster模式提交的程序,你需要找到Driver所在的ip并填入。

github spark源码 spark源码在哪下载_spark_11


由spark-submit,spark-class 脚本可知,程序最终的入口是 org.apache.spark.deploy.SparkSubmit 类

找到该类中的main方法并打上断点,开启debug,此时可以看到程序已经进来了,这时候你可以在你想要跟踪的代码前面打上断点,进行愉快的源码阅读了

github spark源码 spark源码在哪下载_github spark源码_12