在Windows-IntelliJ IDEA启动Spark集群、Spark App、Spark shell和Spark sql
在Windows-IntelliJ IDEA启动Spark集群、Spark App、Spark shell和Spark sql
软件 |
说明 |
JDK8 |
Scala运行依赖jvm |
Scala-2.11 |
Scala版本号选择2.11 |
Spark-2.3 |
Spark版本号选择2.3 |
Apache Maven 3.3.9 |
版本可选 |
IntelliJ IDEA社区版 |
官网可免费下载社区版 |
cygwin |
编译过程 ant 和sh脚本需要linux环境 |
1 Spark工程下载与编译
1.1 下载地址https://github.com/apache/spark ,切换到分支branch-2.3
1.2 IDEA通过maven方式导入工程,创建工程构建命令,如下图
备注:
1. Run Configurations是通过鼠标右键Lifecycle中的选项创建
2. Working directory时spark工程代码目录
3. Profiles是maven编译时的profile变量选项
1.3 双击spark-parent_2.11[package]触发工程编译,从IEDA Console中可以查阅到拼凑出的完整编译命令如下:
clean package -DskipTests -P scala-2.11,hadoop-2.7,Windows,hive,hive-thriftserver
1.4 构建成功,截图如下
2 Spark集群(Master进程和Worker进程)拉起
2.1 配置Master进程,如下
备注:
1. 随意命名
2. Master进程启动入口
3. Spark工程目录
4. 环境变量,都设置为localhost
5. Master进程入口类所在的工程模块
6. 勾选,进程启动依赖provided类型的jars包
2.2 IDEA点击Run按钮,启动Spark Master,查阅console输入日志,如下
2.3 在浏览器访问上述spark UI地址,如下
备注:Master提供2种访问端口,7077是rpc;6066是Rest,用来跨网络
2.4 配置worker进程,如下
1. 随意命名
2. Worker进程启动入口
3. Spark Master进程服务地址,在2.3步骤中获取
4. Spark工程目录
5. 环境变量,都设置为localhost
6. Worker进程入口类所在的工程模块
7. 勾选,进程启动依赖provided类型的jars包
2.5 IDEA点击Run按钮,启动Spark Worker,查阅console输入日志,如下
2.6 刷新步骤2.3中的Spark Master页面,页面显示新增Worker节点/计算节点,如下图
2.7 重复步骤2.5,可以启动更多的work进程/计算节点,如下图
3 Spark App通过spark-submit脚本提交到Spark集群运行
3.1 examples模块下,已有写好的Spark App(JavaWordCount),把JavaWordCount提交到Spark集群上运行
3.2 spark-submit最终调用spark-class脚本,编辑spark-class2.cmd, 打印脚本最终拼凑出的java运行命令, 如下新增“echo %SPARK_CMD%”
备注:该步骤是为了在Console中看日志来学习spark-submit脚本的输出
3.3 IDEA Terminal中,通过run-example(内部调用spark-submit脚本)命令提交JavaWordCount到spark集群上运行,命令如下:
run-example --master spark://localhost:7077 JavaWordCount "C:\Users\w00403095\Desktop\weizheng.txt"
3.4 上述命令最终转化为java -cp命令,如下:
C:\Progra~1\Java\jdk1.8.0_181\bin\java -cp "E:\code\spark\bin\..\conf\;E:\code\spark\assembly\target\scala-2.11\jars\*" -Xmx1g org.apache.spark.deploy.SparkSubmit --master spark://localhost:7077 --jars "E:\code\spark\examples\target\scala-2.11\jars\aircompressor-0.8.jar,E:\code\spark\examples\target\scala-2.11\jars\commons-codec-1.10.jar,E:\code\spark\examples\target\scala-2.11\jars\commons-lang-2.6.jar,E:\code\spark\examples\target\scala-2.11\jars\kryo-shaded-3.0.3.jar,E:\code\spark\examples\target\scala-2.11\jars\minlog-1.3.0.jar,E:\code\spark\examples\target\scala-2.11\jars\objenesis-2.1.jar,E:\code\spark\examples\target\scala-2.11\jars\orc-core-1.4.4-nohive.jar,E:\code\spark\examples\target\scala-2.11\jars\orc-mapreduce-1.4.4-nohive.jar,E:\code\spark\examples\target\scala-2.11\jars\scopt_2.11-3.7.0.jar,E:\code\spark\examples\target\scala-2.11\jars\spark-examples_2.11-2.3.4-SNAPSHOT,E:\code\spark\examples\target\scala-2.11\jars\spark-examples_2.11-2.3.4-SNAPSHOT.jar" --class org.apache.spark.examples.JavaWordCount spark-internal C:\Users\w00403095\Desktop\weizheng.txt
截图如下
备注:
1. spark-submit脚本最终是运行java org.apache.spark.deploy.SparkSubmit
2. JavaWordCount的所在的jar包是spark-examples_2.11-2.3.4-SNAPSHOT.jar
3. Spark app的主类是org.apache.spark.examples.JavaWordCount
3.5 上述命令提交app运行,本质上worker节点上也启动了Executor进程来做计算。查阅Worker Console的输出如下
ExecutorRunner: Launch command: "C:\Progra~1\Java\jdk1.8.0_181\bin\java" "-cp" "E:\code\spark\conf\;E:\code\spark\assembly\target\scala-2.11\jars\*" "-Xmx1024M" "-Dspark.driver.port=59390" "org.apache.spark.executor.CoarseGrainedExecutorBackend" "--driver-url" "spark://CoarseGrainedScheduler@SZXG4W004030951.china.huawei.cn:59390" "--executor-id" "0" "--hostname" "127.0.0.1" "--cores" "4" "--app-id" "app-20190723161053-0001" "--worker-url" "spark://Worker@127.0.0.1:58569"
截图如下
Spark Master WebUI上也会新增当前Application的执行状态,如下图
3.6 上述是默认的client模式部署app,也可以使用cluster部署模式来提交app到spark集群上运行,此时application被称为driver,读者可以摸索如何使用。
备注:
1. --master 使用spark://localhost:6066 (而不是7077端口)
2. 使用参数--deploy-mode cluster(默认是client模式)
4 Spark App使用local模式运行
4.1 local模式不需要把app提交到spark集群上运行,直接在IDEA上Run起来,配置如下:
备注:
1. 随意命名
2. App main函数入口类
3. Spark Master进程服务地址,这里配置local
4. App的入参
5. Spark工程目录
6. App入口类所在的工程模块
7. 勾选,进程启动依赖provided类型的jars包
5 IDEA中运行Spark shell
5.1 IDEA中配置如下
备注:
3. 如果为空,则默认local模式启动spark shell
5. Working directory是spark-shell.cmd所在目录
5.2 点击Run按钮,启动spark shell,运行结果如下
备注:
1. 从console输出日志可以看出shell的入口main函数是org.apache.spark.repl.Main
5.3 Spark Master UI上查看,spark shell本质上是一个spark app,如下图
6 IDEA中运行Spark SQL
待续补充
7 遇到的问题
7.1 mvn编译过程中报ant或者sh失败,安装cygwin软件
7.2在IDEA通过run样例代码想把app提交到spark集群中运行,结果报错java.io.InvalidClassException: org.apache.spark.storage.BlockManagerId; local class incompatible: stream classdesc serialVersionUID = -3720498261147521051, local class serialVersionUID = -6655865447853211720,如下图
原因:BlockManagerId 是spark-core.jar包中的类,spark app的classPath中BlockManagerId.class和spark集群NodeManager启动Executor的classPath中的BlockManagerId.class版本号不匹配。
从IDEA console输出的java –classpath中对比,前者是\spark\core\target\scala-2.11\classes\下获取,后者(Executor进程)启动时的class从spark\assembly\target\scala-2.11\jars\*中获取,如下
至于为什么assembly\target目录下的jar中的BlockManagerId.class和core\target\下的BlockManagerId.class不一致,没有去细纠。可以解药assembly下的spark-core.jar获取BlockManagerId.class来替换到core\target\下,重新
运行spark app,发现还会报其他的java.lang.NoClassDefFoundError异常,如下
解决方法:cluster模式运行spark app,请使用spark-submit脚本来提交任务,不要在IDEA中通过run来触发java –cp运行。
- 点赞
- 收藏
- 关注作者
评论(0)