• Intellij Idea 编写 Scala Spark 程序




    准备工作

    安装 Java

    C:UsersLin>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 命令

    然后可以在 targetscala-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
    

    可以看到程序成功执行



  • 相关阅读:
    LeetCode
    LeetCode
    ELK系列(5)
    ELK系列(4)
    ELK系列(3)
    ELK系列(2)
    ELK系列(1)
    计算机网络常见面试题总结
    mosquitto启动时Address already in use 和 一般的 Address already in use
    size和STL中的size_type
  • 原文地址:https://www.cnblogs.com/moonlight-lin/p/14520827.html
Copyright © 2020-2023  润新知