配置 Intellij Idea 和 Sbt 开发、打包、运行 Spark 程序

摘要

使用 Idea 集成 Sbt 配置 Scala 开发环境,开发 Spark 程序。

配置基本环境

首先需要几个基本环境,一个是 JDK,还有 Scala,另外安装 Idea,以及在 Idea 中安装 Scala 插件,这里就不赘述了。

创建项目

首先创建一个 Scala - sbt 项目:

enter image description here

填写项目名称,项目路径。另外需要注意的是选择合适的 sbt 和 scala 版本。
enter image description here

创建完成之后,会从远处服务器拉取项目结构信息,可能会耗费一些时间。
enter image description here

完成之后会生成如图所示的一个项目结构:
enter image description here

导入依赖

编辑 build.sbt 文件,填写项目依赖,这里是 Spark 程序,需要添加 Spark-core依赖。另外这里还声明了 Scala 依赖。

enter image description here

1
2
3
4
5
6
7
name := "MedicalQA"

version := "0.1"

scalaVersion := "2.11.12"

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0"

在编辑了 build.sbt 文件后,会提示是否导入这些依赖,选择自动导入即可。

如果是第一次添加某个依赖,会从远程服务器下载,根据网络情况,耗费一定时间,需耐心等待。

导入之后,可以在 External Libraries 中看到这些依赖。

enter image description here

添加 SBT 依赖

如果 External Libraries 中没有 sbt 相关的 JAR 包,可以手动添加。

打开 Project Structure,在 File 或者界面右上角的文件图标打开。

enter image description here

点击上方的小加号,选择 Scala SDK,图片中的实例是添加后的效果,一开始应该是空的。

enter image description here

在弹出的如下界面中选择 Browse,浏览本地目录,选中本地 Scala 的根目录即可。

编写测试程序

创建一个 Scala 文件。

enter image description here

这里面写了一个小李子,是在hdfs上写入一个文本文件。完成之后就需要将项目编译成一个JAR包,上传到spark中执行。

enter image description here

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.BufferedOutputStream

import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.spark._

object DataImport {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("yarn")
conf.set("spark.app.name", "MedicalQA")
val sc = new SparkContext(conf)

val sentence = "some words"

val fs = FileSystem.get(sc.hadoopConfiguration)
val output = fs.create(new Path("/test/somewords.txt"))
val ops = new BufferedOutputStream(output)
ops.write(sentence.getBytes("UTF-8"))
ops.close()
output.close()
fs.close()
}
}

编译打包

再次打开 Project Structure,选择 Artifacts,点击小加号

enter image description here

选择 Module,也就是项目,以及程序入口 Main Class,也就是主函数所在的类。

enter image description here

然后会看到如下的界面:

enter image description here

接下来我们要把jar包中引用的jar包去除掉,不打包在里面。选中这些JAR包,用上面的减号删除掉。

enter image description here

最后只剩下项目的代码

enter image description here

完成之后会在项目目录下看到 META-INF 目录。

然后进行编译。

enter image description here

enter image description here

编译打包完成之后,会在项目目录中看到打包的结果

enter image description here

运行测试

接下来我们把这个JAR包提交到spark集群中跑跑看。

把 JAR 包放到 /home/workspace 目录下,执行命令:

1
/usr/local/spark-2.4.0-bin-hadoop2.6/bin/spark-submit --class "DataImport" --deploy-mode cluster /home/workspace/MedicalQA.jar

跑完之后如果没有报什么错的话,用HDFS命令检查一下

1
2
3
[root@weilu131 bin]# ./hdfs dfs -ls /test
Found 1 items
-rw-r--r-- 3 root supergroup 10 2018-11-16 15:52 /test/somewords.txt

发现文件确实写进去了,当然如果不放心还可以看看文件内容

1
2
[root@weilu131 bin]# ./hdfs dfs -cat /test/somewords.txt
some words

还可以看看 Yarn 上面提交的任务执行情况

enter image description here