win7下IntelliJ IDEA使用Maven搭建本地spark开发环境及解决执行错误

开发环境:IntelliJ IDEA ULTIMATE 2017.2
运行环境:jdk1.8.0_2,scala-2.11.4

安装jdk和scala

在win7机器上安装jdk和scala,添加环境变量JAVA_HOME和SCALA_HOME,并追加到Path环境变量中:%JAVA_HOME\bin%;%JAVA_HOME\jre\bin%;%SCALA_HOME%\bin;


win7下IntelliJ IDEA使用Maven搭建本地spark开发环境及解决执行错误win7下IntelliJ IDEA使用Maven搭建本地spark开发环境及解决执行错误

IDEA导入jdk

安装完IDEA**后(**网址:http://idea.lanyus.com/)进入主界面,点击菜单File --> Project Structure --> SDKs,点击+号选择JDK,在右侧选择jdk的存放位置,点击OK即可


win7下IntelliJ IDEA使用Maven搭建本地spark开发环境及解决执行错误

IDEA导入scala插件

点击菜单File --> Settings --> Plugins:


win7下IntelliJ IDEA使用Maven搭建本地spark开发环境及解决执行错误

在2处搜索框输入scala,右侧出现3所示,如果没有安装过,会显示instal按钮,这里我已经安装了并且是2017.2.0版本所以显示update,如果直接点击install则会在线安装。建议大家先离线下载好IDEA对应的scala插件,不同版本的IDEA对应不同版本的scala插件,插件下载地址:https://plugins.jetbrains.com/plugin/1347-scala。如下图我找到自己的2017.2.0对应的版本下载:

win7下IntelliJ IDEA使用Maven搭建本地spark开发环境及解决执行错误

离线下载好scala插件后,在plugins页面下点击Install plugin form disk后选择插件的存放位置,点击OK即可


win7下IntelliJ IDEA使用Maven搭建本地spark开发环境及解决执行错误

IDEA导入sdk

点击菜单File --> Project Settings --> Global Libraries,点击+号的Scala SDK,右侧选择scala的存放路径,点击ok即可


win7下IntelliJ IDEA使用Maven搭建本地spark开发环境及解决执行错误

IDEA利用Maven创建spark环境

点击File --> New Project创建新项目,左侧选择Maven,右侧依次选择下图红框,点击Next:


win7下IntelliJ IDEA使用Maven搭建本地spark开发环境及解决执行错误

填写GroupId和ArtifactId,名字任意就行,点击Next


win7下IntelliJ IDEA使用Maven搭建本地spark开发环境及解决执行错误

选择Maven的目录,这里我选择的是IDEA自带的Maven,路径在IDEA安装目录下plugins里,你也可以自己下载Maven然后载入进来,User settings file就是Maven里的settings.xml,Local repository可以选用默认位置也可以自己修改位置,存放通过Maven下载的各jar包,记得勾选上override,点击next


win7下IntelliJ IDEA使用Maven搭建本地spark开发环境及解决执行错误

填写Project name和选择Project存放路径,点击Finish即可完成创建


win7下IntelliJ IDEA使用Maven搭建本地spark开发环境及解决执行错误

Maven创建好project后,我们修改在settings.xml里面修改Maven为国内镜像,否则下载jar包的速度很慢,这里我的settings.xml文件位于idea自带的maven里,具体是F:\ideaIU-2017.2.win\plugins\maven\lib\maven3\conf\settings.xml,打开settings.xml文件后,在mirrors标签里添加如下配置:

  </mirrors>
    <mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </mirror>
  </mirrors>

接下来在pom.xml里加入spark所依赖的包,我选用的spark版本是2.0.2,对应的scala版本是2.11.4,spark各种依赖包及其对应的scala version可在https://mvnrepository.com/artifact/org.apache.spark查看,我的spark依赖配置如下:

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spark.version>2.0.2</spark.version>
    <scala.version>2.11.4</scala.version>
    <hadoop.version>2.6.5</hadoop.version>
  </properties>

  <repositories>
    <repository>
      <id>scala-tools.org</id>
      <name>Scala-Tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>scala-tools.org</id>
      <name>Scala-Tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </pluginRepository>
  </pluginRepositories>

  <dependencies>
    <!-- scala -->
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>2.11.4</version>
    </dependency>

    <!-- spark -->
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_2.11</artifactId>
      <version>2.0.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-streaming_2.11</artifactId>
      <version>2.0.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_2.11</artifactId>
      <version>2.0.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-hive_2.11</artifactId>
      <version>2.0.2</version>
    </dependency>

    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-mllib_2.11</artifactId>
      <version>2.0.2</version>
    </dependency>

    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
      <version>2.0.2</version>
    </dependency>

配置好以上依赖关系后,maven就自动下载所依赖的jar包,存放于Local repository路径里。

本地运行spark wordcount示例

在src/main/scala/com.boya下新建一个scala class,选择类型为object

package com.boya

import org.apache.spark.{SparkContext, SparkConf}

object wordcount {
  def main(args: Array[String]) {
    /**
    * SparkContext 的初始化需要一个SparkConf对象
    * SparkConf包含了Spark集群的配置的各种参数
    */
    val conf = new SparkConf()
                .setMaster("local[2]")//启动本地化计算
                .setAppName("testRdd")//设置本程序名称
    // Spark程序的编写都是从SparkContext开始的
    val sc=new SparkContext(conf)
    //以上的语句等价与val sc=new SparkContext("local","testRdd")
    val data=sc.textFile("e://The_Man_of_Property.txt")//读取本地文件
    data.flatMap(_.split(" "))//下划线是占位符,flatMap是对行操作的方法,对读入的数据进行分割
        .map((_,1))//将每一项转换为key-value,数据是key,value是1
        .reduceByKey(_+_)//将具有相同key的项相加合并成一个
        //.sortBy(_._2,false).take(10) // 按照value进行降序排序,取value较大的前10个返回一个array
        .top(10)(Ordering.by(e => e._2))
        .foreach(println)//循环打印

  }
}

若直接运行,会报Failed to locate the winutils binary in the hadoop binary path的错误,若程序中用到saveAsTextFile,还会报(null) entry in command string: null chmod 0700的错误,解决方法如下:

此时我的win7机器上没有安装hadoop和spark,其jar包通过maven依赖引入的。在https://github.com/steveloughran/winutils/tree/master/hadoop-2.6.0/bin下分别下载winutils.exe、libwinutils.lib和hadoop.dll。
第一,新建hadoop/bin文件夹,将winutils.exe和libwinutils.lib放入hadoop/bin文件夹中,并添加HADOOP_HOME环境变量,比如我是放到E:\hadoop\bin下,则变量值为E:\hadoop\,然后在Path变量里追加%HADOOP_HOME%\bin。
第二,将hadoop.dll复制到C:\Windows\System32。

以上两步完成即可,若还报错,重启机器(至少我是这样解决的),wordcount运行结果如下:


win7下IntelliJ IDEA使用Maven搭建本地spark开发环境及解决执行错误