Intellij Idea 编写 Scala Spark 程序



准备工作

安装 Java

C:\Users\Lin>java -version
java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)

安装 SBT (Scala Build Tool,类似 Maven,如果使用 Intellij Idea 可以不用安装)
https://www.scala-sbt.org/1.x/docs/Installing-sbt-on-Windows.html

安装 Intellij Idea

安装 Scala 插件

安装成功

Intellij 创建 Scala + IDEA 项目

建立项目

选择 Scala + IDEA

第一次建立 Scala 项目,需要 Create Scala SDK

如果是写 Spark 程序的话,要注意和 Spark 的 Scala 版本一致(以 Spark 2.4.6 为例选 2.11.12)

建立 Scala Class

选择 Object

代码

object Hello {
  def main(args: Array[String]) {
    println("Hello Scala!")
  }
}

或者

object Hello extends App {
  println("Hello, World!")
}

右键文件 -> Run

可以看到输出 Hello Scala

Intellij 创建 Scala + sbt 项目

为了更好的管理项目依赖,需要创建 sbt 的项目
https://docs.scala-lang.org/getting-started/intellij-track/building-a-scala-project-with-intellij-and-sbt.html

同样选择 Scala 版本

创建后可以看 sbt shell 是否可以正常启动

如不行,可在 File->Settings->Build,Execution,Deployment->Build Tools->sbt 选自己装的 sbt-launch.jar

在 build 界面可以看到可能会卡住(正常也需要 5 分钟左右的时间)

有可能是因为源的问题,到 ~\.sbt 目录下,创建 repositories 文件,换成速度快的源,比如

[repositories]
local
my-maven-repo: https://maven.aliyun.com/repository/public
typesafe-ivy-releases: https://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
sonatype-oss-releases
maven-central
sonatype-oss-snapshots

可能要到 File -> Settings -> Build, Execution, Deployment -> Build Tools -> sbt -> VM parameters 添加

-Dsbt.override.build.repos=true
-Dsbt.repository.config=~/.sbt/repositories

(但我没做这步,重启 IDEA 重新编译就可以了)

成功后,右键 -> New 下面才会有 Scala Class 可以选

代码

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.log4j.{Level, Logger}

object WordCount {
  def main(args: Array[String]) {
    //Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
    //Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)

    val conf = new SparkConf().setAppName("WordCount").setMaster("local[2]")
    val sc = new SparkContext(conf)

    val inputFile = "./src/main/scala/WordCount.scala"
    val textFile = sc.textFile(inputFile)

    // don't need to escape }, ], /
    // regexp should be \s, but in order to escape \, have to change to \\s
    val regex = "\\s+|\\.|\\(|\\)|\\{|}|\\[|]|/|\\\\|\"|\\||,|:"
    val wordCount = textFile.flatMap(line => line.split(regex))
                            .filter(word => word != "")
                            .map(word => (word, 1))
                            .reduceByKey((x, y) => x + y)

    wordCount.foreach(println)
  }
}

添加 spark 依赖

name := "structured-spark-kafka-example"

version := "0.1"

scalaVersion := "2.11.12"

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

运行

可以看到输出结果

(Level,3)
(=,6)
(scala,2)
(s,2)
(!=,1)
(server,1)
(args,1)
(textFile,3)
(don't,1)
(WordCount,3)
(s+,1)
(spark,3)
(x,2)
(import,3)
(log4j,1)
(main,2)
(need,1)
(flatMap,1)
(have,1)
(be,1)
(conf,2)
(y,2)
(filter,1)
(local,1)
(setMaster,1)
(wordCount,2)
(line,2)
(OFF,1)
(order,1)
(Array,1)
(split,1)
(to,4)
(setLevel,2)
(val,6)
(inputFile,2)
(in,1)
(2,1)
(object,1)
(foreach,1)
(regex,2)
(map,1)
(should,1)
(apache,4)
(eclipse,1)
(org,5)
(escape,2)
(jetty,1)
(regexp,1)
(word,4)
(println,1)
(setAppName,1)
(String,1)
(reduceByKey,1)
(=>,4)
(sc,2)
(1,1)
(new,2)
(but,1)
(def,1)
(src,1)
(SparkConf,2)
(WARN,1)
(+,1)
(getLogger,2)
(SparkContext,2)
(change,1)
(Logger,3)

修改 build.sbt 后,如果没有自动重 build,可以在右侧的 sbt 窗口点击 reimport project

如果还不重 build 或出错,尝试重启 IDEA

导入已有的 sbt 项目

如果是导入已有的项目,可以通过 Import Project,选择对应的 build.sbt

然后编译运行

打包并通过 spark-submit 提交

如果有安装 sbt 的话可以直接执行

sbt package

或者打开 IDEA 的 sbt shell 窗口,直接在上面执行 package 命令

然后可以在 target\scala-2.11 目录下找到 jar 包比如 word-count_2.11-0.1.jar

通过 spark-submit 命令提交 spark 程序

./spark-submit --master local \
               --class WordCount \
               word-count_2.11-0.1.jar

如果程序是指定 package 的,并且可以输入参数的,命令如下

./spark-submit --master local \
               --class com.example.WordCount \
               word-count_2.11-0.1.jar \
               input.txt

可以看到程序成功执行



posted @ 2021-03-11 21:51  moon~light  阅读(405)  评论(0编辑  收藏  举报