sbt-idea-入門と構成

20780 ワード

Java環境構成
これは言うまでもなく、これが前提条件です.自分でインストールしてから正しく構成してください.分からない場合はjava環境変数の構成に関する問題を自分で検索してください.
Scala構成
まずscala環境を構成します.公式アドレスからダウンロードします.ここではscala 2を使用します.10.6バージョンなので、ここから対応するプラットフォームバージョンをダウンロードします.Windowsはscala-2.10.6をダウンロードしてください.zip、MacOS、Linuxはscala-2.10.6をダウンロードしてください.tgz .
ダウンロードが完了したら、ディレクトリに解凍し、環境変数SCALA_HOMEを構成し、scalaの解凍後の絶対パスを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:\sbtであり、PATHの変数値の後に;%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パケットを直接1つずつ提出しても問題ありませんが、大量のクラスライブラリに依存すると、この方法は明らかに非効率で骨が折れるので、どのようにしてこれらのサードパーティ依存を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プロジェクトを作成するには、scalaおよびsbtプラグインをインストールする必要があります.ideaのプリファレンスを開き、Pluginsを見つけ、Browser repositores...ボタンをクリックし、scalaを入力して検索し、scalasbtのプラグインを見つけてインストールします.下図に示すように、インストールが完了したらideaを再起動します.
sbtプロジェクトの作成
File->New->Project...プロジェクト作成ウィザードを開きます.作成が完了したら、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(プロジェクト管理のソフトウェアでもあります)と同じように、モジュール開発機能を提供しています.私たちは2つのモジュールを定義しています.1つのモジュールは私たちが作ったもので、もう1つは実行に使用されています.この中には実行時クラスライブラリが含まれています.構成は以下の通りです.
  • mainというフォルダを作成し、プロジェクトのsrcフォルダをこのディレクトリの下
  • に移動します.
  • プロジェクトルートディレクトリの下にrunというフォルダ
  • を作成する.
  • プロジェクトルートディレクトリの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)

  • サブプロジェクトmainで作成されたbuild.sbtの内容は、次のとおりです.
    1
    libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1" % "provided"

  • サブプロジェクトrunで作成されたbuild.sbtの内容は、次のとおりです.
    1
    libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1"

  • 運転パラメータを以下の図に設定します.次に、上の運転構成を選択して、運転すればいいです.ここで異常が発生する可能性があります.
    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ローカル依存ライブラリ保管場所構成
    時間を割いてから補うのは、実は接続を確立して、まず自分で案を考えます.