概述
本文主要记录在win10环境下编译spark源码过程中的主要步骤,中间涉及一些问题导致运行example例子未成功,因此记录下来加深印象。话不多说,开始记录。
环境准备
- jdk version :1.8
- scala version :2.10.0
- maven version :3.3.9
- 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.com 和 http://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 打包
依赖你当前网络的状况 ,此刻进入漫长或者短暂的等待中。。。
当出现这一幕时,spark 源码编译成功,祝贺你!
step3
使用idea打开这个项目,等待idea导入完成后,我们运行example包下的SparkPi案例
所需参数 -Dspark.master=local
如图配置以后,点击运行
报错信息:
Exception in thread “main” java.lang.NoClassDefFoundError: scala/collection/Seq
简单明了,是因为scala的包未导入,不对呀,spark都是用scala编写的,怎么可能没有scala环境,打开pom文件,我们可以看到依赖作用域都为provided,修改provided 为compile,我是为了图方便,将所有的provided 改为compile,正常操做是不允许的,万一有个依赖名称叫provided 呢。
将pom文件中的依赖作用域修改完后,重新import maven以后,再次run
此时又会报另一个错
就是因为这一步浪费了我很多时间,具体原因不做分析,先看解决步骤吧
先恢复之前修改的 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
报错信息
not found: type SparkFlumeProtocol
val transactionTimeout: Int, val backOffInterval: Int) extends SparkFlumeProtocol with Logging {
解决办法:
1:打开Module (ctrl shift alt s ) 找到 spark-streaming-flume-sink_2.11 module
2:右键 target ,取消 excluded 如图所示
3:当前target ->scala-2.11->src_managed ->main->compiled-avro 右键 Sources
注:如果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 验证是否安装成功
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并填入。
由spark-submit,spark-class 脚本可知,程序最终的入口是 org.apache.spark.deploy.SparkSubmit 类
找到该类中的main方法并打上断点,开启debug,此时可以看到程序已经进来了,这时候你可以在你想要跟踪的代码前面打上断点,进行愉快的源码阅读了