LoginSignup
8
7

More than 5 years have passed since last update.

Sparkのローカル開発環境作る方法(Scala向け)

Last updated at Posted at 2016-05-23

Scalaのパッケージ管理としてsbtがあるらしいが、そもそもScala初めてで何もわからなかったので、自分の備忘録として。
せっかくだしEclipseからIntelliJに移行しようと思ったので、IntelliJベースで話進めます。Eclipserは適宜読み替えてもらえると。

sbt

Scalaのパッケージ管理。Rubyのgemみたいにグローバル汚さないで済むし(Bundler使えば良い話だが)便利。
機能的には幾つかあるらしいが、自分は依存関係の整理にしかまだ使ってない(使いこなせてない)のでいいプラグインあったら教えて下さい。
Sparkの各種ライブラリもここで管理する

IntelliJでプロジェクトを作る

  • New -> Projectで新規プロジェクトを作成する
  • Scala -> sbtを選択する。もしこの選択肢がなかったら環境設定からScalaのプラグインをインストールし再起動すると出てくる。
    79347a7f-5b58-bcf8-c8a6-c2490a197877.png

  • 適当に名前入れてfinish.勝手にプロジェクトができる。
    92cc3587-c80c-5e93-006b-099c3f873e06.png

  • 生成されるbuild.sbtに以下の項目を追記する
    バージョンは適宜指定すること。

build.sbt
libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "1.4.1",
  "org.apache.spark" %% "spark-graphx" % "1.4.1",
  "org.apache.spark" %% "spark-sql" % "1.4.1"
)
  • 保存してsbt実行。auto importにチェック入れておけば保存した瞬間に依存関係の整理が走る

  • 正常終了すると、ディレクトリが何個かできる。この中のsrc/scala以下にパッケージ切ってコード書けばOK。試しにGraphX使ってみる。PageRankを求めてみる。

example.scala
package hellospark

import org.apache.spark.graphx.{Graph, GraphLoader}
import org.apache.spark.{SparkConf, SparkContext}

/**
 * Created by nishimuuu on 2015/08/16.
 */
object example {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("appname").setMaster("local[*]")
    val sc   = new SparkContext(conf)

    val edge_path = "/path/to/edge.csv"
    val node_path = "/path/to/node.csv"
    val graph: Graph[Int, Int] = GraphLoader.edgeListFile(sc, edge_path).cache()

    val ranks = graph.pageRank(0.001).vertices
    val nodes = sc.textFile(node_path).map{line =>
      val fields = line.split(",")
      (fields(0).toLong, fields(1))
    }

    val ranksByNode = nodes.join(ranks).map {
      case(id, (node, rank)) => (node, rank)
    }
    println(ranksByNode.collect().mkString("\n"))


    sc.stop()
  }
}
  • 結果
(follower2 follow1 A,0.3300364712764322)
(follower2 follow0,0.4854936516596302)
(follower3 follow3,0.6927675771080204)
(follower4 follow4,0.8482247574912182)
(follower2 follow2,0.5260649857706428)
(follower2 follow1 B,0.3300364712764322)

こんな感じ。ファイルの場合、edgeを読み込んでnodeを張り付けていく、のが楽。
まだ細かく触ってないけど、読み込み時にゴニョゴニョやる必要がないのを知れてよかった。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7