scala, spark, sbt, mvn плюс тестовый пример

SCIF32

Пробую собрать тестовый пример, как будто это новый проект. SimpleTextClassificationPipeline из
./src/main/scala/org/apache/spark/examples/ml/SimpleTextClassificationPipeline.scala
Как это правильно делать?
Пробовал писать конфиг для sbt, пока не могу пройти ошибку java.lang.ClassNotFoundException: LabeledDocument
хотя вроде классы должны прогрузиться
 
 @BeanInfo
case class LabeledDocument(id: Long, text: String, label: Double)

Если длинно, то история такая:
Решил для расширения кругозора попробовать какие-нибудь примерчики машинного обучения на scala.
Поскольку работаю я на ubuntu, то и запускать всё решил на ней.
Вообще я как-то рассчитывал на то, что уж примерчики из интернета я смогу собрать, но как-то жестоко обломался.
Для начала столкнулся с тем, что почти все компоненты требуют 2-х этапной гуглежки чтобы их просто поднять. (сначала гуглим установку, потом выясняем, что установка падает и гуглим как исправлять падение)
В итоге установил:
1. hadoop 2.6.0 (поднял мастер и воркер)
2. scala 2.4.10
3. spark 1.4.1-bin-hadoop2.6
4. java стоит java-7-openjdk-amb64
Далее пытался банально собрать один пример SimpleTextClassificationPipeline (но не так, чтобы он был в составе spark-а а как свой отдельный проект) И с этим ничего не получается.
С mvn пока разбираюсь - там надо какую-то адскую xml-ку писать в качестве конфига, а конфиг для sbt у меня получился такой:
 

name := "Simple Project"

version := "1.0"

scalaVersion := "2.10.4"


val cdhVersion = "cdh5.3.0"
val hbaseVersion = s"0.98.4-hadoop2"
val hadoopVersion = s"2.5.0-$cdhVersion"

libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "1.4.1",
"org.apache.spark" %% "spark-mllib" % "1.4.1",
"org.apache.spark" %% "spark-sql" % "1.4.1",
"org.scalanlp" %% "breeze" % "0.10",
"org.scalanlp" %% "breeze-natives" % "0.10"
)
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-streaming" % "1.4.1",
"org.apache.spark" %% "spark-bagel" % "1.4.1",
"org.apache.spark" %% "spark-hive" % "1.4.1",
"org.apache.spark" %% "spark-graphx" % "1.4.1" ,
"org.apache.spark" %% "spark-streaming-twitter" % "1.4.1",
"org.apache.spark" %% "spark-streaming-flume" % "1.4.1",
"org.apache.spark" %% "spark-streaming-mqtt" % "1.4.1",
"org.apache.spark" %% "spark-streaming-zeromq" % "1.4.1",
"org.apache.spark" %% "spark-streaming-kafka" % "1.4.1",
"com.twitter" %% "algebird-core" % "0.9.0",
"com.github.scopt" %% "scopt" % "3.2.0",
"org.apache.spark" %% "spark-streaming-kinesis-asl" % "1.4.1"
)


resolvers ++= Seq(
"Sonatype Releases" at "http://oss.sonatype.org/content/repositories/releases/"
)


Но конфига видимо недостаточно.
Код программы:
 import scala.beans.BeanInfo
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.ml.feature.{HashingTF, Tokenizer}
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.sql.{Row, SQLContext}

@BeanInfo
case class LabeledDocument(id: Long, text: String, label: Double)

@BeanInfo
case class Document(id: Long, text: String)

object SimpleTextClassificationPipeline {

def main(args: Array[String]) {
val conf = new SparkConf.setAppName("SimpleTextClassificationPipeline").setMaster("spark://127.0.0.1:7077")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._

// Prepare training documents, which are labeled.
val training = sc.parallelize(Seq(
LabeledDocument(0L, "a b c d e spark", 1.0
LabeledDocument(1L, "b d", 0.0
LabeledDocument(2L, "spark f g h", 1.0
LabeledDocument(3L, "hadoop mapreduce", 0.0

// Configure an ML pipeline, which consists of three stages: tokenizer, hashingTF, and lr.
val tokenizer = new Tokenizer
.setInputCol("text")
.setOutputCol("words")
val hashingTF = new HashingTF
.setNumFeatures(1000)
.setInputCol(tokenizer.getOutputCol)
.setOutputCol("features")
val lr = new LogisticRegression
.setMaxIter(10)
.setRegParam(0.001)
val pipeline = new Pipeline
.setStages(Array(tokenizer, hashingTF, lr

// Fit the pipeline to training documents.
val model = pipeline.fit(training.toDF

// Prepare test documents, which are unlabeled.
val test = sc.parallelize(Seq(
Document(4L, "spark i j k"
Document(5L, "l m n"
Document(6L, "spark hadoop spark"
Document(7L, "apache hadoop"

// Make predictions on test documents.
model.transform(test.toDF
.select("id", "text", "probability", "prediction")
.collect
.foreach { case Row(id: Long, text: String, prob: Vector, prediction: Double) =>
println(s"($id, $text) --> prob=$prob, prediction=$prediction")
}

sc.stop
}

okis

добавил в sbt repo для paho: http://repo.eclipse.org/content/repositories/paho-releases/
скомпилировалось, запустилось (sbt compile && sbt run)
там дальше рантаймовая ошибка?
а, да, взял еще скалу 2.11.1 вместо 2.10.4

$ tail -n 5 build.sbt
"Sonatype Releases" at "http://oss.sonatype.org/content/repositories/releases/",
"paho-eclipse" at "http://repo.eclipse.org/content/repositories/paho-releases/"
)
$ head -n 5 src/main/scala/com/experiment/Program.scala
package com.experiment
import scala.beans.BeanInfo
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.ml.Pipeline

SCIF32

Сорри! забыл написать, что ошибка java.lang.ClassNotFoundException именно рантаймовая,
а компилироваться оно у меня тоже компилируется .
Добавил phao и package как у тебя - но ничего не изменилось, в плане ошибки.
Но, спасибо! твой пост натолкнул меня на мысль, что видимо дело не в программе. В итоге я полез в папочку спарка и начал ковырять - как же там всё запускается и нормально отрабатывает. Поковырял скрипты и обнаружил, что при запуске в качестве мастера указывается "local[*]", а не "spark://127.0.0.1:7077".
Сделал так же у себя и программа стала работать, слава богам!
Но выходит проблема кроется в окружении в котором запускаются пакеты на воркере - видимо там нет каких-то скаловских либ, буду ботать это дело.

Papazyan

ML на Lua модно писать, хотя хоть убей не пойму почему. Давно не видел настолько убогого языка.
Оставить комментарий
Имя или ник:
Комментарий: