3.2 使用IDEA开发Spark程序
IDEA的全称是IntelliJ IDEA,是一款非常高效和优秀的集成开发环境。IDEA支持Java、Scala等多种语言。在所有支持Scala的集成开发环境中,IDEA对Scala的支持最好,因此,本书采用IDEA作为Scala的集成开发环境,在IDEA中,使用Scala编写Spark程序。
本节对IDEA的安装和基本使用、使用IDEA开发Scala程序、编辑Spark代码、编译和打包Spark程序,以及远程提交Spark程序的进行详细说明。
IDEA 的主界面如图 3-3 所示,主要分为菜单工具栏、Project 信息栏、代码栏和调试输出信息栏等几个部分,具体使用后面会详细说明。
图3-3 IDEA主界面
3.2.1 IDEA安装和基本使用
本节介绍IDEA及其依赖的安装方法。因为IDEA是图形界面,它在Linux下有很多的依赖,因此,本节除了安装 IDEA 本身外,还将安装 IDEA 的依赖。IDEA 安装后,本节还将介绍 IDEA 开发Scala程序的基本方法,这些都将为我们后续使用 IDEA 开发Spark程序打下基础。
1.轻量级图形桌面Xfce安装
IDEA是图形界面,需要在scala_dev(CentOS 7)的图形界面上工作。因此,本小节介绍如何使得scala_dev支持图形显示,并安装一个轻量级桌面Xfce。
本节“安装轻量级图形桌面 Xfce”属于实践内容,因为后续章节会用到本节成果,所以本实践必须完成。请参考本书配套资料《Spark 大数据编程实践教程》中的“实践 7:安装轻量级图形桌面Xfce”完成本节任务。
2.IDEA安装
Scala程序开发的IDE主要有两个,一个是Eclipse,另一个则是IDEA(IntelliJ IDEA),它们都是以插件的形式(即在这两个 IDE 上,安装支持 Scala 开发的插件)来支持 Scala 开发,其中IDEA是目前公认的对Scala支持度最好的IDE。
本节“安装IDEA和Scala插件”属于实践内容,因为后续章节会用到本节成果,所以本实践必须完成。请参考本书配套资料《Spark 大数据编程实践教程》中的“实践 8:安装IDEA和Scala插件”完成本节任务。
3.IDEA开发Scala程序
本节介绍如何使用IDEA开发Scala应用程序。
本节介绍如何使用IDEA开发Scala应用程序。本节属于实践内容,因为后续章节会用到本节成果,所以本实践必须完成。请参考本书配套资料《Spark 大数据编程实践教程》中的“实践9:使用IDEA开发一个最简单的Scala程序”完成本节任务。
3.2.2 使用IDEA编辑Spark代码
本节说明如何使用IDEA来编辑Spark代码,步骤如下。
1.确定Module
Module 中文翻译为模块,是 IDEA 中非常重要的概念。IDEA 中只有 1 个 Project(项目),没有子 Project 的概念,因此,IDEA 使用 Module 来解决这个问题。Module 的功能和子 Project 类似,不同的 Module,可以分别设置编译时的依赖、编译后的输出等,这样互相隔离,便于管理和分工,也不容易出错。Module在IDEA中的图案如图3-4所示。
以本书为例,不同的章的示例代码其编译时的依赖可能不一样。因此,在代码组织上可以以章为单位,每章的示例代码对应一个 Module,其名称以章序号命名,例如第三章的示例代码的Module名就是“03”。
请参照实践9的方法创建Module 03,并指定Module 03的编译时依赖如图3-5所示,其中,scala-sdk为Scala安装包中带的scala-sdk-2.11.12;Jars and one more file对应Spark安装目录下jars下的所有jar包。
Module 03 创建好后,会有对应的存储目录,其路径是:/home/user/prog/examples/03,因此本例中,“03”既是Module名,又是目录名。
图3-4 Module图标
图3-5 Spark程序编译依赖
2.确定代码的Package
Package 是 Scala(Java)中的重要概念,用来描述代码的层次关系。Package 使用点(.)来连接代码的各个层次,例如examples.idea.spark中,examples、idea、spark分别表示代码的一个层次,它们之间使用(.)进行连接。代码的Package还应包含代码的特征信息。例如,从 Package 名 examples.idea.spark 就可以看出该 Package 中代码表示示例(examples),而且是用IDEA(idea)开发的,示例代码是Spark程序(spark)。
有关Package的更多说明,请参考本书配套资源《零基础快速入门Scala》3.1.1节中内容。
在 IDEA Module 03 图标下,单击 src 图标,然后单击鼠标右键,在菜单中选择 New->Package,然后输入Package的名称examples.idea.spark,可以看到在src图标下,出现三个图标,如图 3-6 所示,第一个图标是 examples,这是因为 Package examples.idea.spark 和Package examples.vim.spark在同一个Module(Module 03)下,这两个Package的公共部分是examples,所以把examples提取出来共用;第二个图标则是idea.spark,这是因为Package examples.idea.spark 的 examples 提取后的剩余部分,它和上一级的 examples 组成了完整的Package examples.idea.spark;第三个图标是 vim.spark,这是我们在实践 9 中所创建的Package,它和上一级的examples组成了完整的Package examples.vim.spark。
3.创建示例源码文件
本示例代码文件名为:HelloSpark.scala。在 IDEA 中选择图标 idea.spark,单击鼠标右键,在菜单中选择New->Scala Class,会弹出一个“Create New Scala Class”的对话框,如图3-7所示,在Kind下拉菜单中选择Object,在Name文本框中输入HelloSpark。
图3-6 示例程序的Package图标
图3-7 Scala Class创建界面
单击“OK”按钮后,IDEA会根据Package信息自动创建源码文件HelloSpark.scala,存储到/home/user/prog/examples/03/src 下,对应的路径如下列代码所示。可以看到,src 下的存储路径examples/idea/spark/是和Package信息examples.idea.spark一一对应的。
4.代码组织说明
Package和Scala Object创建后的代码组织架构如图3-8所示。
如图 3-8 所示,03 既是章节代码目录,又是一个 Module。在该 Module 下,有两个Package:examples.idea.spark和examples.vim.spark,它们前面的 examples 是公共的,因此,就把它抽出来。idea.spark下面有个HelloSpark,它是Scala Object,完整的 Package 信息是 examples.idea.spark.HelloSpark,vim.spark下面的HelloSpark同样如此,完整的Package信息是examples.vim.spark.HelloSpark,尽管两个Object名字相同,但它们的Package不同,因此不会冲突,而且它们处在不同的目录下,也容易区分。
图3-8 代码组织架构图
5.编辑代码
双击examples.idea.spark下的HelloSpark,输入下面的代码内容。
3.2.3 IDEA编译、打包
本节介绍如何将3.2.2节编辑的HelloSpark.scala文件编译成class文件,然后将class文件打包成example.jar。
1.编译代码
如图3-9所示,可以选择Build Module ‘03’命令来编译03模块下的代码。
图3-9 Module编译菜单
编译后,会在Project的根目录examples/out/production/03下按照Package路径生成class文件。
列出spark目录下的文件,命令如下。
spark下的文件显示如下。
2.打包(不加依赖)
1)单击File->Project Struct,在弹出的Project Struct界面中,选择Artifacts,如图3-10所示;
2)将Module 03的compile output添加到examples.jar包中,双击“’03’ compile output”项,如图3-11所示;
图3-10 Artifacts选项界面
图3-11 内容添加前的界面
添加后的examples.jar内容界面如图3-12所示。
3)单击OK按钮,然后单击Build->Build Artifacts,生成jar包菜单,如图3-13所示;
图3-12 内容添加后的界面
图3-13 内容添加后的界面
4)在图3-14中,选中examples,单击Rebuild,生成jar包;
图3-14 jar包操作菜单
Rebuild 结束后,会在 Project 的根目录 examples/out/artifacts/examples生成对应的jar包,如下所示。
5)解压新生成的jar包。
可以看到对应的class文件都被成功打包进去了。
3.2.4 IDEA远程提交Spark程序
下面介绍在 IDEA 中远程提交Spark程序到 Standalone 运行,这样,Spark程序从编辑、编译、打包、运行、调试都可以在 IDEA 中完成,不需要切换,非常方便。而且运行、调试环境一致,都是Standalone模式下,可以避免环境不一致带来的问题。具体步骤如下。
1)单击 Run->Edit Configurations,新建 Application Configuration,名字为 HelloSpark StandaloneExp,参数配置如图3-15所示;
图3-15 运行参数配置界面
2)修改Configuration中的VM ops;
VM options的配置如图3-16所示,其中:
●-Dspark.master 用来配置此程序要连接到 Standalone 的 Master,地址为 spark://scaladev:7077。如果改成-Dspark.master=local,就是local运行;
●-Dspark.jars用来配置在Driver和Executor中所都要用到的jar包。
图3-16 VM options配置
spark.jars的属性也可以在HelloSpark.scala代码中通过调用conf.setJars函数指定,但这样做会把jar包路径“写死”在代码中,而且在使用 spark-submit 提交程序时,这行代码是不需要的,因此,写入代码这种方法很不灵活。因此,采用将“jar 包路径”作为 VM options 参数的方法来解决,这样,HelloSpark.scala代码不做任何修改,既能兼容spark-submit提交,又可以在IDEA中提交,非常方便。
3)运行程序。
单击Run,IDEA会将examples.jar提交到Spark集群,以Standalone模式运行。运行时的输出会在IDEA中显示,如图3-17所示。
图3-17 IDEA远程提交Spark程序输出结果图
当代码修改后,一定要重新编译、打包,才能运行,否则运行的还是原来的程序。
扩展阅读:[企业级] IDEA+Spark快速入门实战
对 IDEA 的掌握直接关系到后续Spark程序开发的熟练度和效率。笔者在此总结了自身多年Spark开发使用IDEA的经验,开发了专门针对Spark的IDEA高清视频课程《[企业级] IDEA+Spark快速入门实战》,课程部分内容如下:
●IDEA开发Spark程序的最常用功能和快捷键;
●IDEA调试Spark程序;
●IDEA+Module+Maven开发大型Spark程序;
●IDEA 编译Spark源码。
课程内容覆盖Spark开发初级、中级和高级的各个阶段 IDEA 的使用。该课程可以帮助Spark学习者快速而又全面地掌握 IDEA 开发Spark程序的技能。本课程在国内最专业的IT在线教育平台51CTO学院长期排名大数据(Spark)课程的年销量的第一名,受到学习者的一致好评,如图3-18所示。
图3-18 51CTO大数据(Spark)课程年销量排名