使用IntelliJ IDEA开发Spark应用程序

大数据学习路线图

现在介绍如何在Ubuntu系统中安装开发工具IntelliJ IDEA,以及如何使用IDEA开发Spark应用程序。这里使用的Spark版本号是2.4.0(Scala版本号是2.11.12)。

下载和安装IntelliJ IDEA

IDEA分为专业版和社区版,这里使用专业版。请到IDEA官网下载安装包ideaIU-2019.3.1.tar.gz,专业版软件免费试用30天,如果要破解激活(用于学习目的),可以到淘宝网购买激活账号(到淘宝网搜索“IDEA激活”,就可以找到店铺,花10元钱可以购买一个账号用于学习,不要用于商业用途)。
打开一个命令行终端,执行如下命令进行IntelliJ IDEA安装:

cd ~
sudo tar -zxvf /home/hadoop/download/ideaIU-2019.3.1.tar.gz -C /usr/local
cd /usr/local
sudo mv ./idea-IU-173.4548.28 ./idea  #对目录进行重命名

下面使用如下命令修改目录所有者:

sudo chown -R linziyu:linziyu ./idea  #假设Linux用户名为linziyu

我们在Spark开发时,是使用Scala语言。这里要注意,如果是专业版,不需要额外安装Scala插件,因为专业版已经自带了Scala插件。如果是IDEA社区版,则需要为IDEA工具安装Scala插件。
可以自己到Scala插件官网去下载。但是,一定要注意,Scala插件安装包的版本,一定要和自己电脑上安装的IntellJ IDEA的版本严格一致。与社区版ideaIC-2019.3.1.tar.gz对应的Scala插件安装包是scala-intellij-bin-2019.3.1.zip。安装Scala插件的方法很简单,在IDEA界面中,选择“File-->Settings”,打开设置界面,在界面左侧栏目中点击“Plugins”,在界面右侧上角点击齿轮图标,在弹出的菜单中选择“Install Plugin from Disk...”,然后找到scala-intellij-bin-2019.3.1.zip文件,点击确定即可。

创建一个新项目WordCount

在IDEA界面中,点击菜单“File-->New-->Project”,会弹出如下所示界面:

在上图中,点击界面左侧的“Maven”,并选择好Project SDK,然后,点击“Next”按钮,会弹出如下所示界面:

在上图中,把“Name”设置为“WordCount”,把“GroupId”设置为“dblab”,然后点击“Finish”按钮。

然后,如下图所示,在项目名称“WordCount”上单击鼠标右键,在弹出的菜单中点击“Add Framework Support”。

在弹出的界面中,如下图所示,在左侧栏目中找到“Scala”,点击选中(会出现勾号),然后在右侧的“Use Library”右边选择“scala_sdk_2.11.12”,最后点击“OK”按钮。

如下图所示,在“java”目录上单击鼠标右键,在弹出的菜单中选择“Refactor”,再在弹出的菜单中选择“Rename”,然后,在出现的界面中把“java”目录名称修改为“scala”。

然后,在IDEA界面中,如下图所示,在“scala”目录上单击鼠标右键,在弹出的菜单中选择“New”,再在弹出的菜单中选择“Scala Class”。

在弹出的界面中,如下图所示,点击选中“object”,然后在文本框中输入“WordCount”,然后回车。

在IDEA开发界面中,打开pom.xml,清空里面的内容,输入如下内容:

<project>
    <groupId>dblab</groupId>
    <artifactId>WordCount</artifactId>
    <modelVersion>4.0.0</modelVersion>
    <name>WordCount</name>
    <packaging>jar</packaging>
    <version>1.0</version>
    <repositories>
        <repository>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>
    </repositories>
    <properties>
        <spark.version>2.4.0</spark.version>
        <scala.version>2.11</scala.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>3.4.6</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

然后,再打开WordCount.scala代码文件,清空里面的内容,输入如下内容:

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object WordCount {
  def main(args: Array[String]) {
    val inputFile =  "file:///home/hadoop/word.txt"
    val conf = new SparkConf().setAppName("WordCount").setMaster("local")
    val sc = new SparkContext(conf)
    val textFile = sc.textFile(inputFile)
    val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)
    wordCount.foreach(println)
  }
}

这个代码文件的功能是对word.txt文件进行词频统计,所以,需要在本地文件系统中创建一个文件“/home/hadoop/word.txt”,里面输入一些英文单词,比如:

Hadoop is good
Spark is fast
Spark is better

现在需要做一个很重要的事情,那就是要IDEA使用2.11.12版本的Spark依赖库,方法如下,如下图所示,选择菜单“File-->Project Structure”。

在弹出的Project Structure设置界面中,如下图所示,点击“Libraries”,这里一定要确保使用的依赖库是"scala-sdk-2.11.12",不能是其他版本,否则会导致程序无法运行。

再点击“Global Libraries”,如下图所示,点击减号“-”把所有的依赖库都清空,然后点击加号“+”,新增依赖库"scala-sdk-2.11.12"。

点击加号以后,会出现如下图所示的界面,在界面中点击“Scala SDK”。

然后,会弹出如下图所示界面,在里面选择Maven的2.11.12版本依赖库,然后点击OK按钮。

然后,会弹出如下所示界面,直接点击OK按钮就可以。

然后,会返回到如下界面,可以看出来,在加号减号的下面的矩形框里,出现了scala-sdk-2.11.12,这时,只要点击界面底部的"Apply"按钮就可以,然后再点击OK按钮。

运行代码

在代码文件WordCount.scala窗口内,如下图所示,单击鼠标右键,在弹出的菜单中选择“Run WordCount”,就可以运行代码。

运行成功以后,就可以在运行信息窗口内看到词频统计结果,如下图所示:

把应用程序打包成JAR包

如下图所示,在IDEA开发界面的右侧,点击“Maven”图标,会弹出Maven调试界面,在Maven调试界面中点击“package”,就可以对应用程序进行打包,打包成JAR包。

这时,到IDEA开发界面左侧的项目目录树中,在“target”目录下,就可以看到生成了两个JAR文件,分别是:WordCount-1.0.jar和WordCount-1.0-jar-with-dependencies.jar。

然后,打开一个Linux终端,执行如下命令运行JAR包:

cd /usr/local/spark
./bin/spark-submit --class "WordCount" /home/hadoop/IdeaProjects/WordCount/target/WordCount-1.0-jar-with-dependencies.jar

执行成功后就可以在屏幕上看到词频统计结果。