在阿里云ECS的Ubuntu中安装IntelliJ IDEA和Scala插件

大数据学习路线图

返回《在阿里云中搭建大数据实验环境》首页
现在介绍如何在阿里云ECS的Ubuntu系统中安装开发工具IntelliJ IDEA和Scala插件。

下载和安装IntelliJ IDEA

请在本地电脑中执行下载操作。笔者已经把IntelliJ IDEA安装包(版本号:2017.3.4)保存到了百度云盘中,可以点击这里直接从百度云盘下载文件ideaIC-2017.3.4.tar.gz(提取码:gx0b)。下载成功以后,可以在本地电脑,打开FTP软件,使用linziyu用户名登录到阿里云ECS的Ubuntu系统,把ideaIC-2017.3.4.tar.gz通过FTP软件上传到“/home/linziyu/Downloads”目录下。
然后,在本地电脑通过VNC Viewer连接远程的阿里云ECS实例中的Ubuntu系统,打开一个命令行终端,执行如下命令进行IntelliJ IDEA安装:

cd ~
sudo tar -zxvf /home/hadoop/download/ideaIC-2017.3.4.tar.gz -C /usr/local
cd /usr/local
sudo mv ./idea-IC-173.4548.28 ./idea

然后,使用ls命令查看目录的所有者:

linziyu@iZbp11gznj7n38xkztu64dZ:/usr/local$ ls -l idea
total 48
drwxr-xr-x  2 root root  4096 Apr  7 17:02 bin
-rw-r--r--  1 root root    14 Jan 30 07:13 build.txt
-rw-r--r--  1 root root  1909 Jan 30 07:13 Install-Linux-tar.txt
drwxr-xr-x  4 root root  4096 Apr  7 17:02 jre64
drwxr-xr-x  5 root root  4096 Apr  7 17:02 lib
drwxr-xr-x  2 root root  4096 Apr  7 17:02 license
-rw-r--r--  1 root root 11352 Jan 30 07:13 LICENSE.txt
-rw-r--r--  1 root root   128 Jan 30 07:13 NOTICE.txt
drwxr-xr-x 34 root root  4096 Apr  7 17:02 plugins
drwxr-xr-x  2 root root  4096 Apr  7 17:02 redist

可以看出,idea目录的所有者是root,下面使用如下命令修改目录所有者:

sudo chown -R linziyu:linziyu ./idea

下载Scala插件安装包

我们在Spark开发时,是使用Scala语言,所以,需要为IDEA工具安装Scala插件。
请在本地电脑中执行下载操作。笔者已经把Scala插件安装包保存到了百度云盘中,可以点击这里直接从百度云盘下载文件scala-intellij-bin-2017.3.4.zip(提取码:vsr2)。
或者,你也可以自己到Scala插件官网去下载。但是,一定要注意,Scala插件安装包的版本,一定要和自己电脑上安装的IntellJ IDEA的版本严格一致。笔者在本教程中安装的IDEA的版本是2017.3.4。
进入Scala插件官网以后,把网页往下拉一些,可以看到如下图所示的文件列表:

这个列表只是一部分版本,没有看到我们想要的2017.3.4这个版本,可以点击页面中的“PREVIOUS UPDATES”,显示更多的历史其他版本,如下图所示,就可以看到2017.3.4这个版本了,点击图中的“DOWNLOAD”按钮,把Scala插件安装包文件下载到本地电脑中,可以看到,下载后的文件名是scala-intellij-bin-2017.3.4.zip。

下载成功以后,可以在本地电脑,打开FTP软件,使用linziyu用户名登录到阿里云ECS的Ubuntu系统,把scala-intellij-bin-2017.3.4.zip通过FTP软件上传到“/home/linziyu/Downloads”目录下,后面我们会用到。

启动IDEA

然后,就可以启动开发工具IDEA了,使用如下命令启动:

cd /usr/local/idea
./bin/idea.sh

启动以后,会弹出如下界面,点击“OK”即可。

然后,会弹出如下界面,直接点击“Next:Desktop Entry”。

然后,会弹出如下界面,直接点击“Next:Launcher Script”。

然后,会弹出如下界面,点击“Next: Default plugins”。

然后,会弹出如下界面,点击“Next: Featured plugins”。

然后,会弹出如下界面,如果你打算在线安装Scala插件(笔者不建议这样做),点击Scala下面的“Install”按钮,但是,这样在线安装非常慢,不建议在线安装,所以,这里不要点击“Install”按钮,后面我们会手动安装Scala插件。现在,只需要做一个动作,就是点击“Start using IntelliJ IDEA”按钮。

然后,会弹出如下启动画面,可以看出版本时间是IntelliJ IDEA Community(社区)2017年3月版本。

为IntelliJ IDEA安装Scala插件

然后,会出现如下界面,点击界面右下角的“configure”按钮。

然后,会弹出如下界面,点击界面中的“Plugins”。

然后,会弹出如下界面,点击界面右下角的“Install plugin from disk...”按钮。

然后,会弹出如下界面,请找到前面Scala插件安装包scala-intellij-bin-2017.3.4.zip所在的目录“/home/linziyu/Downloads”,然后,点击“OK”按钮。

然后,会弹出如下界面,请点击右上角的“Restart IntelliJ IDEA”,重新启动IDEA。

重启动以后,会再次出现如下的欢迎界面:

配置项目的JDK

在上面这个欢迎界面中,请点击“Configure”,在弹出的菜单中点击“Project Defaults”,在弹出的菜单中点击“Project Structure”,如下图所示:

然后,在弹出的界面(如下图所示)中,点击左侧“Project Settings”中的“Project”,在右边点击No SDK后面的“New”按钮,在弹出的菜单中点击“JDK”。

然后,会弹出如下界面,要找到之前已经在Ubuntu中安装的JDK的目录,也就是“/usr/lib/jvm/jdk1.8.0_162”,点击“OK”按钮。

然后会返回到如下界面,请在界面中点击“OK”按钮。

创建一个新项目WordCount

然后,又会返回到欢迎界面,如下所示,请点击“Create New Project”,开始创建一个新项目。

然后,弹出如下界面,请点击左侧的“Maven”,右侧“Create from archetype”这个复选框,不要选中,不用管它,直接点击界面底部的“Next”按钮。

然后,会弹出如下界面,在GroupId中填入dblab,在ArtifactId中填入WordCount,然后,点击“Next”。

会弹出如下界面,请点击“Finish”按钮。

然后,进入如下所示的项目界面,界面中出现一个“Tip of the Day”提示框,直接点击“Close”关闭。另外,请点击界面底部的“Maven projects need to be imported”这个区域的“Enable Auto-Import”。这样,IDEA就可以自动到网络上下载Maven相关的依赖文件,以后,每次修改项目中的pom.xml内容时,IDEA都会自动到网络下载相关的依赖文件。

然后,项目的界面应该呈现如下样子:

为WordCount项目添加Scala框架支持

在界面左侧的项目名称“WordCount”上单击鼠标右键,在弹出的菜单中选择“Add Framework Support...”,如下图所示:

会弹出如下界面,请在界面左侧点击“Scala”复选框,勾中,选上,右侧点击“Use Library”右边的“Create”按钮。

会弹出如下界面,请点击界面底部的“Browse...”按钮。

会弹出如下界面,需要找到之前Scala的安装目录/usr/local/scala,然后,点击界面底部的“OK”按钮。

然后,返回到如下界面,点击界面底部的“OK”按钮。

然后会返回到如下图所示界面,注意界面底部的状态信息,会显示正在构建索引。

新建Scala代码目录

然后,如下图所示,在界面左侧的项目栏中,在src目录的main子目录上,单击鼠标右键,在弹出的菜单中点击"New",然后,在弹出的菜单中点击“Directory”,创建一个新目录。

会弹出如下界面,请在里面输入新的目录的名称scala,点击OK按钮。

然后,如下图所示,在scala这个子目录上,单击鼠标右键,在弹出的菜单中点击"Mark Directory as",然后,在弹出的菜单中点击“Sources Root”,把scala目录设置为源代码目录。


然后,如下图所示,在java子目录上,单击鼠标右键,在弹出的菜单中点击"Delete...",删除这个目录。


会弹出一个删除确认界面,询问你是否删除,可以直接点击“Delete”按钮。

新建Scala代码文件

然后,在scala目录上单击鼠标右键,,在弹出的菜单中点击"New",然后,在弹出的菜单中点击“Scala Class”,新建一个Scala代码文件。


如下图所示,在Name后面输入WordCount,在Kind后面选择Object,然后点击OK按钮。

然后,就可以看到,在项目界面中,生成了一个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:///usr/local/spark/mycode/wordcount/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)
  }
}

需要注意的是,上面代码是对阿里云ECS中的Ubuntu系统中的“/usr/local/spark/mycode/wordcount/word.txt”这个文件进行词频统计,统计出word.txt中每个单词出现的次数,所以,一定要在阿里云ECS中的Ubuntu系统中创建这个word.txt文件,并且在里面随便输入几行英文单词,用来做词频统计。

修改pom.xml文件

然后,再打开项目中的pom.xml文件,清空这个文件里面的内容,然后,把如下代码粘贴到里面:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>dblab</groupId>
    <artifactId>WordCount</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <spark.version>2.1.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>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-hive_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>

            <plugin>
                <groupId>org.scala-tools</groupId>
                <artifactId>maven-scala-plugin</artifactId>
                <version>2.15.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19</version>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>

        </plugins>
    </build>
</project>

然后,如下图所示,界面底部就会出现正在运行后台进程的相关信息。

更新Maven的依赖文件

请打开项目中的pom.xml文件,在该文件内容窗口内的任意位置,用鼠标单击右键,如下图所示,在弹出的菜单中点击“Maven”,在弹出的菜单中点击“Generate Sources and Update Folders”。然后,IDEA就会开始到网络上下载相关的依赖文件。界面底部可以看到,正在运行“Resolving dependencies of WordCount...”。IDEA正在从网络上下载相关的依赖文件,由于是一次运行Scala代码,所以,需要从网络上下载大量依赖文件,会耗费较长时间,大概半个小时到1个小时左右。以后再运行时,就不需要再次下载,速度就会快很多。

如果界面中的圆圈一直在转动,长条型的状态条一直在闪动,就说明IDEA一直在下载文件。当圆圈静止,长条型的状态条不动时,就说明下载结束。就可以进行下面的操作。

运行WordCount程序

如下图所示,请在项目中打开WordCount.scala代码文件,在该代码文件内容窗口内的任意位置,用鼠标单击右键,在弹出的菜单中点击“Run WordCount”,就可以运行WordCount程序了。

然后,IDEA就开始对WordCount.scala程序进行编译,如下图所示,编译过程中会显示状态条信息。

最终,如下图所示,程序顺利运行得到结果。

打包WordCount程序生成jar包

首先,在IDE中,打开菜单File->Project Structure,如下图所示。

然后,会弹出如下图所示界面,请依次点击“Artifacts”、绿色加号、JAR和From modules with dependencies...。


然后,在弹出的界面(如下图所示)中,点击“Main Class”右边的省略号按钮。

然后,在弹出的界面(如下图所示)中,在搜索文本框中输入wordcount,再点击OK按钮。

然后,在弹出的界面(如下图所示)中,点击OK按钮。

然后,返回到了如下图所示的界面,因为我们只是在Spark上运行的,所以我们要删除下图红框里多余的部分,保留WordCount.jar以及‘WordCount’ compile output。小提示,可以用鼠标点击红色方框区域,然后可以利用Ctrl+A全选功能,选中红色方框中的全部选项,然后,配合Crtl加上鼠标左键进行反选,也就是按住Ctrl键的同时用鼠标左键分别点击WordCount.jar和‘WordCount’ compile output,从而不选中这两项,最后,点击界面中的删除按钮(是一个红色减号图标),这样就把其他选项都删除,只保留了WordCount.jar以及‘WordCount’ compile output。

删除以后,剩下两项就是WordCount.jar以及‘WordCount’ compile output,如下图所示,然后点击界面中的OK按钮。

最后,如下图所示,点击顶部菜单中的“Build”菜单,在弹出的子菜单中点击“Build Artifacts...”。

然后,会弹出如下界面,请点击“Build”,就开始打包了。

把jar提交到Spark中运行

打包成功以后,生成的JAR包文件在“/home/linziyu/IdeaProjects/WordCount/out/artifacts/WordCount_jar/WordCount.jar”。
下面可以在Ubuntu系统中打开一个命令行终端,执行如下Shell命令,运行WordCount.jar程序:

cd /usr/local/spark
./bin/spark-submit --class "WordCount" /home/linziyu/IdeaProjects/WordCount/out/artifacts/WordCount_jar/WordCount.jar

然后,程序就开始运行,得到词频统计结果。

让IntelliJ IDEA中的WordCount程序访问HDFS中的文件

上面我们在进行词频统计程序时,我们使用的是阿里云ECS实例的Ubuntu系统中的本地文件,现在,我们修改一下,让WordCount程序访问HDFS中的“/user/linziyu/word.txt”文件(如果不存在该HDFS文件,请先使用HDFS Shell命令创建该文件,点击这里阅读HDFS Shell命令使用方法)。请把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 =  "hdfs://192.168.1.106:9000/user/linziyu/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)
  }
}

上面代码中的192.168.1.106,是阿里云ECS实例的私网IP地址(你的可能不是这个IP地址,请查询你自己的私网IP)。
然后,按照上面介绍的步骤,在WordCount.scala代码窗口内,单击鼠标右键,在弹出的菜单中点击“Run as WordCount”,运行程序。可以看到,可以成功运行程序,如下图所示:

如果运行失败,提示信息反馈说访问HDFS失败,首先,请使用jps命令检查HDFS是否已经启动成功。如果HDFS已经成功启动,WordCount还是执行失败,就请去修改 /etc/hosts文件。具体方法是:
使用用户名linziyu登录ECS中的Ubuntu系统,打开一个终端,执行如下命令修改hosts文件内容:

cd ~
sudo vim /etc/hosts

/etc/hosts这个文件的原来内容如下:

192.168.1.106 iZbp11gznj7n38xkztu64dZ
127.0.0.1       localhost

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

修改后,请把里面的最后三行注释掉,使用#可以注释掉一行内容,修改后如下:

192.168.1.106 iZbp11gznj7n38xkztu64dZ
127.0.0.1       localhost

# The following lines are desirable for IPv6 capable hosts
#::1     localhost ip6-localhost ip6-loopback
#ff02::1 ip6-allnodes
#ff02::2 ip6-allrouters

修改后保存文件并退出vim编辑器。
这样,再去调试WordCount程序就可以成功了。