在Windows-IntelliJ IDEA启动Spark集群、Spark App、Spark shell和Spark sql

举报
Lettle whale 发表于 2020/06/30 10:13:15 2020/06/30
【摘要】 在Windows-IntelliJ IDEA启动Spark集群、Spark App、Spark shell和Spark sql

Windows-IntelliJ IDEA启动Spark集群、Spark AppSpark shellSpark 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 directoryspark工程代码目录

3.    Profilesmaven编译时的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种访问端口,7077rpc6066Rest,用来跨网络

 

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脚本)命令提交JavaWordCountspark集群上运行,命令如下:

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.com: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部署模式来提交appspark集群上运行,此时application被称为driver,读者可以摸索如何使用。

备注:

1.      --master 使用spark://localhost:6066 (而不是7077端口)

2.      使用参数--deploy-mode cluster(默认是client模式)

 

4     Spark App使用local模式运行

4.1 local模式不需要把app提交到spark集群上运行,直接在IDEARun起来,配置如下:

备注:

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 directoryspark-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.2IDEA通过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 appclassPathBlockManagerId.classspark集群NodeManager启动ExecutorclassPath中的BlockManagerId.class版本号不匹配。

IDEA console输出的java –classpath中对比,前者是\spark\core\target\scala-2.11\classes\下获取,后者(Executor进程)启动时的classspark\assembly\target\scala-2.11\jars\*中获取,如下

 

至于为什么assembly\target目录下的jar中的BlockManagerId.classcore\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运行。

 

 

 

 

 

 

 


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。