스파크 공부중 노트

소소하게 스파크 설치 체험중 (MacOS, JDK1.8)

작업 목표

  • 스파크로 문서 내의 단어 세기
  • 포스트그레스큐엘 접속하기

환경 변수

export SPARK_MASTER_IP=127.0.0.1
export SPARK_LOCAL_IP=127.0.0.1
export SCALA_HOME=/usr/local/scala
export $PATH=$PATH:$SCALA_HOME/bin

스칼라 설치

http://www.scala-lang.org/download/2.10.5.html 에서 2.10.5 다운로드.

  • 2.11은 안됨, brew는 기본이 2.11임
  • 압축을 풀어서 /usr/local/scala 에 넣어두자.

http://www.scala-sbt.org/release/tutorial/Manual-Installation.html 에서

  • jar 파일 다운로드후
  • /usr/local/scala/bin 에 넣음.

스파크 설치

http://spark.apache.org/ 에서 spark 1.5 다운로드하고 압축 풀기

cd spark-1.5.0
./sbin/start-master.sh
./bin/spark-class org.apache.spark.deploy.worker.Worker spark://localhost:7077 -c 1 -m 512M

프로젝트 생성 (프로젝트이름은 hanal)

mkdir hanal
cd hanal
mkdir -p src/main/scala/asense
mkdir -p project/target
mkdir -p target

소스 작업

SBT 설정 (build.sbt)

organization := "asense"
name := "analizer"
version := "0.0.1"
scalaVersion := "2.10.7"
scalacOptions += "-deprecation"
libraryDependencies ++= List(
"org.apache.spark" % "spark-mllib_2.11" % "1.5.0",
"org.postgresql" % "postgresql" % "9.4-1202-jdbc42"
)

메인 소스 (src/main/scala/asense/Anal.scala)

import org.apache.spark.rdd.RDD
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.mllib.feature.HashingTF
import org.apache.spark.mllib.linalg.Vector
import java.util.HashMap
import java.sql.{Connection, DriverManager, ResultSet, SQLException}
object Anal {

    def mul(x: Int) = {
        ("aa","bb")
    }

    def main(args: Array[String]) = {
        val (a,b) = mul(1)
        println("Hi!", a)
        val conf = new SparkConf().setAppName("Hotel Text Analizer").setMaster("local[1]")
        val sc = new SparkContext(conf)
        val logData = sc.textFile("hotel.txt", 2).cache()
        val s1 = "파타야"
        val s2 = "방콕"
        val numAs = logData.filter(line => line.contains("호텔")).count()
        val numBs = logData.filter(line => line.contains("방콕")).count()
        println("Lines with %s: %s, Lines with %s: %s".format(s1, numAs, s2, numBs))

        try {
            val db = DriverManager.getConnection("jdbc:postgresql://localhost/hotels_dev","jdb", "")
            val st = db.createStatement
            val res = st.executeQuery("SELECT title from blinks LIMIT 9")
            while( res.next) {
                println(res.getString("title"))
            }

            val sqlContext = new org.apache.spark.sql.SQLContext(sc)
            println("jdbc load #1")

            val prop = Map( "url"->"jdbc:postgresql://localhost/hotels_dev", "dbtable" -> "(select title, body from blinks limit 10) as blogs")

            println("jdbc load #2")

            val jdbc1 = sqlContext.load("jdbc",prop)
            println(jdbc1)

            val it = jdbc1.collectAsList().iterator()

            while(it.hasNext) {
                val x=it.next
                println(x)
            }
        }

        catch{
            case e: Exception => println("ERR");
            e.printStackTrace();
        }
    }
}

컴파일

sbt compile
sbt run
  • 꽤 많은 jar 파일들이 ~/.m2 에 자동으로 쌓인다.

감상

  • 스칼라 2.11은 이전 버전과 호환되지 않음
    • 스파크 1.5.0 은 스칼라 2.10 이 필요함 (2.11을 쓰려면 소스 컴파일 필요)
    • 스칼라를 이버전 저버전 깔아서 테스트하다보면 요상한 에러가 발생
  • 플레이(playframework) 도 테스트해봤는데,
    • 맥북프로에 팬이 있다는 걸 기억나게 해준다.
    • 이건 자바 1.8이 필요

이후에 탐사할 곳들

최종 목표는

  • 백만건의 문서를 내가 원하는 백개 정도의 키워드 관련도로 소팅.