杜龙少(sdvdxl)

sbt-idea-入门及配置

Word count: 2,485 / Reading time: 11 min
2016/05/10 Share

Java 环境配置

这个就不多说了这是前提条件请自行安装后配置正确如果不清楚请自行搜索 java 环境变量配置 相关问题

Scala 配置

首先要要配置 scala 环境官方地址下载这里我们使用scala2.10.6版本所以从这里下载对应的平台版本Windows请下载 scala-2.10.6.zipMacOSLinux请下载 scala-2.10.6.tgz

下载完成后解压到一个目录然后配置环境变量SCALA_HOMEscala的解压后的绝对路径配置到SCALA_HOME然后增加 PATH 的配置以下以 WIndows 和 Linux 举例来说假如这里解压后得到的文件夹为scala-2.10.6

Windows 环境

假如 scala-2.10.6 文件夹放在了 C:\目录下那么新增 SCALA_HOME 的值为C:\scala-2.10.6然后找到 PATH 这个环境变量 在已有的值后面添加 ;%SCALA_HOME%\bin 注意前面的分号重新打开一个新的命令行窗口即可操作关于windows环境变量的其他说明情自行补脑这里就不多啰嗦了

Linux 和 Mac 环境

这里假定我们 scala-2.10.6 的 scala 目录存放在 /usr/local/绝对路径就是/usr/local/scala-2.10.6

Bash 环境

bash 环境下可以修改 ~/.bashrc 或者 /etc/profile 文件添加一下内容

1
2
3
4
SCALA_HOME=/usr/local/scala-2.10.6
PATH=$PATH:$SCALA_HOME/bin

export SCALA_HOME PATH

然后执行 source ~/.bashrc 或者 source /etc/profile 即可

Zsh 环境

如果你的终端bash用的是 zsh那么需要在 ~/.zshrc 文件中增加上述内容然后执行 source ~/.zshrc 即可

Sbt 配置

官方地址从这里下载如果是MacOS的话可以依照这里提示的方法进行快捷安装如果是其他平台或者想手动配置点击这里直接下载即可

下载完成并解压得到文件夹sbt

Windows 环境

假如我们将 sbt 文件夹放到了 C:\目录下新增环境变量 SBT_HOME 值为C:\sbtPATH 变量值后面添加;%SBT_HOME%\bin重新打开一个新的命令行窗口即可

Linux 或者 Mac 环境

这里假定我们将 sbt 目录放在了 /usr/local/ 目录下同上面配置 scala 环境变量一样

Bash 环境

编辑 ~/.bashrc 或者/etc/profile新增以下内容:

1
2
3
4
SBT_HOME=/usr/local/sbt
PATH=$PATH:$SBT_HOEM/bin

export SBT_HOME PATH

然后执行 source ~/.bashrc 或者 source /etc/profile 即可生效

Zsh 环境

编辑~/.zshrc 添加上面的内容并保存后执行 source ~/.zshrc 即可生效

示例程序

项目结构

在随意一个地方创建一个文件夹名字为spark-sbt-demo下面是目录结构

1
2
3
4
5
6
7
8
9
spark-sbt-demo                                                                                                                                                                         
├── build.sbt
├── project
│   ├── build.properties
│   └── plugins.sbt
└── src
├── main
   ├── scala
      └── WordCount.scala

build.sbt 文件中添加如下内容注意每行要用空行隔开

1
2
3
4
5
6
7
8
9
10
11
name := "spark-sbt-demo"

version := "1.0"

scalaVersion := "2.10.6"

organization := "spark.demo"

version := "1.0.0-SNAPSHOT"

libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1" % "provided"

WordCount.scala 文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
import org.apache.spark.{SparkConf, SparkContext}

/**
* Created by sdvdxl on 16/5/11.
*/
object WordCount {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("spark-sbt-demo").setMaster("local[*]")
val sc = new SparkContext(conf)
sc.textFile("src/main/scala/WordCount.scala").flatMap(_.split(" ")).map(word=>(word,1)).reduceByKey(_+_).foreach(println)
sc.stop()
}
}

build.properties 文件内容

1
sbt.version = 0.13.11

plugins.sbt 文件先保持为空

至此我们已经创建了一个 sbt 机构的项目

接下来会说明使用sbt下载依赖使用 idea 创建 sbt 项目idea中如何运行sbt管理的 spark app

Sbt 的基本使用

上面我们创建了一个用 sbt 管理的 spark app 项目如果想要提交到spark中运行那么需要打包成jar好在 sbt 本身或者插件提供了这样的功能

应用打包

打开命令行切换到该项目目录下然后输入 sbt 之后进入 sbt 的交互中然后输入package开始打包最后如果看到类似

[info] Done packaging.
[success] Total time: 11 s, completed 2016-5-11 12:32:09

字样那么说明打包成功打成的 jar 包在上面的日志中可以找到

第三方 jar 统一打包

在写应用的时候我们不只是用到 spark 自身的 jar 包还会用到好多其他第三方类库那么在提交应用到 spark 运行的时候这些第三方依赖也需要一并提交上去否则会出现找不到类的问题如果依赖少的话直接将这些 jar 包直接一个一个提交上去也没问题但是一旦依赖了大量的类库这种方法显然是低效费力的那么怎么才能将这些所有的第三方依赖打成一个 jar 包呢

sbt 本身没有提供这样的功能但是我们可以依靠相应的插件完成此操作记得上面有个文件内容留空的 plugins.sbt 文件吗这个文件中可以配置我们想要完成特定功能的插件现在我们在其中添加如下内容

1
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.2")

然后重新 进入 sbt 交互式环境输入 assemblyPackageDependency 回车稍后将看到类似如下输出

[info] Done packaging.
[success] Total time: 41 s, completed 2016-5-11 13:36:37

这样就成功的将所有依赖的第三方类库打包到一个 jar 包中了具体打包的文件可以在上面的日志中看到

使用 idea 创建 sbt 项目

安装插件

使用 idea 创建 sbt 项目需要安装 scalasbt 插件
打开idea的首选项然后找到Plugins点击 Browser repositores... 按钮输入 scala 搜索然后找到 scalasbt 的插件进行安装如下图所示
scala-sbt-plugins
安装完成后重启idea

创建 sbt 项目

File -> New -> Project… 打开项目创建向导
创建sbt项目
创建完成后等待idea刷新项目目录结构大体如下project/project 和 target相关没有列出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spark-sbt-demo                                                                                                                                                                
├── build.sbt
├── project
│   ├── build.properties
│   └── plugins.sbt
└── src
├── main
│   ├── java
│   ├── resources
│   ├── scala
│   └── scala-2.11
└── test
├── java
├── resources
├── scala
└── scala-2.11
  • plugins.sbt 文件放置插件配置
  • build.sbt 是整体的项目配置信息
  • build.properties 可以设置 sbt 版本
  • java 目录存放 java 文件
  • scala 目录存放 scala 文件
  • resources 目录用来存放配置文件
  • test 相关目录用来存放测试相关文件

    在 idea 中 运行 spark app

    上面我们介绍了如何使用 idea 项目向导创建一个 sbt 项目现在我们来说一下如何在 idea 中直接运行 sbt 构建的 spark app

这里我们使用一开始我们创建的那个项目使用 idea 导入功能File -> Open 找到项目目录打开即可
WordCount.scala 文件中右键选择Run WordCount开始运行但是结果可能不是我们所期望的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/SparkConf
at WorldCount$.main(WorldCount.scala:8)
at WorldCount.main(WorldCount.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.SparkConf
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 more

Process finished with exit code 1

这是为什么呢原因是我们在 build.sbt 中配置的 spark 依赖是这样的

1
libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1" % "provided"

注意到后面的 provided 了吗这个代表打包或者运行的时候不会将这个 jar 包的文件包含进去注意spark app 要求这样注意不要把spark相关的jar包包含进去这样导致我们无法再 idea 中调试或者运行 spark app

解决方案还是有的sbt 和 maven也是一个项目管理的软件一样提供了模块开发功能我们定义两个模块一个模块就是我们上面我们做好的另一个是用来运行的这个里面包含了运行时类库配置如下

  1. 创建一个名为 main 的文件夹把项目中的 src 文件夹移动到这个目录下
  2. 在项目根目录下创建名为 run 的文件夹
  3. 修改项目根目录下的 build.sbt 文件内容为

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    name := "spark-sbt-demo"

    version := "1.0"

    scalaVersion := "2.10.4"

    organization := "spark.demo"

    version := "1.0.0-SNAPSHOT"

    libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1" % "provided"

    lazy val root = (project in file(".")).aggregate(main, run)

    lazy val main = (project in file("main"))

    lazy val run = (project in file("run")).dependsOn(main)
  4. 在子项目 main 创建 build.sbt 内容为

    1
    libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1" % "provided"
  5. 在子项目 run 创建 build.sbt 内容为

    1
    libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1"
  6. 配置运行参数如下图
    idea-spark-run-config
    然后选择上面的运行配置运行即可这里可能会碰到一个异常

1
2
3
4
Exception in thread "main" org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: file:/Users/du/workspace/hekr/spark-sbt-demo/src/main/scala/WorldCount.scala
at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:251)
at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:270)
......

这是由于上面我们修改了改程序main文件的位置导致找不到该文件所致请自行设置为一个存在的文件路径或者修改为 main/src/main/scala/WorldCount.scala 重新运行即可成功

Sbt 本地依赖库存储位置配置

抽空再补上其实就是建立一个连接先自行思考方案

项目下载

没有源码下载的都是耍流氓点这里下载

CATALOG
  1. 1. Java 环境配置
  2. 2. Scala 配置
    1. 2.1. Windows 环境
    2. 2.2. Linux 和 Mac 环境
      1. 2.2.1. Bash 环境
      2. 2.2.2. Zsh 环境
  3. 3. Sbt 配置
    1. 3.1. Windows 环境
    2. 3.2. Linux 或者 Mac 环境
      1. 3.2.1. Bash 环境
      2. 3.2.2. Zsh 环境
    3. 3.3. 示例程序
      1. 3.3.1. 项目结构
    4. 3.4. Sbt 的基本使用
      1. 3.4.1. 应用打包
      2. 3.4.2. 第三方 jar 统一打包
    5. 3.5. 使用 idea 创建 sbt 项目
      1. 3.5.1. 安装插件
      2. 3.5.2. 创建 sbt 项目
    6. 3.6. 在 idea 中 运行 spark app
    7. 3.7. Sbt 本地依赖库存储位置配置
  4. 4. 项目下载