Пример классификации MLlib останавливается на этапе 1

ИЗМЕНИТЬ:

Я попытался использовать текст из ответа Габриэля и получил функции спама: 9 и функции ветчины: 13. Я попытался изменить HashingTF на numFeatures = 9, затем на 13, а затем создал по одному для каждого. Затем программа остановилась на «count at DataValidators.scala: 38», как и раньше.

Завершенные задания (4)
подсчитать на 21 (spamFeatures)
подсчитать на 23 (hamFeatures)
посчитать на 28 (trainingData.count ())
сначала на GeneralizedLinearAlgorithm на 34 (val model = lrLearner. запустить (trainingData)

1) Почему признаки подсчитываются по строкам, так как в коде они разделяются пробелами ("")

2) Две вещи, которые я вижу, отличаются от моего кода и кода Габриэля: а) У меня нет ничего о регистраторе, но это не должно быть проблемой ...
б) Мои файлы находятся на hdfs (hdfs: //ip-abc-de-.compute.internal:8020/user/ec2-user/spam.txt), опять же, не должно быть проблемой, но не уверен, что я что-то упускаю ...

3) Как долго я должен дать ему поработать? Я дал ему поработать не менее 10 минут с помощью: local [2] ..

Я предполагаю, что на данный момент это может быть какая-то проблема с моей настройкой Spark / MLlib? Есть ли еще более простая программа, которую я могу запустить, чтобы проверить, есть ли проблема с настройкой MLLib? Мне удалось запустить другие задания потоковой передачи искр / sql до ...

Спасибо!

[репост из сообщества искры]

Всем привет,

Я пытаюсь запустить этот пример MLlib из Learning Spark: https://github.com/databricks/learning-spark/blob/master/src/main/scala/com/oreilly/learningsparkexamples/scala/MLlib.scala#L48

Что я делаю по-другому:

1) вместо их spam.txt и normal.txt у меня есть текстовые файлы с 200 словами ... вообще ничего огромного и просто текст с точками, запятыми и т. Д.

3) Я использовал numFeatures = 200, 1000 и 10,000

Ошибка: я все время застреваю, когда пытаюсь запустить модель (на основе подробностей из пользовательского интерфейса ниже):

val model = new LogisticRegressionWithSGD (). run (trainingData)

Он зависнет примерно так:

[Этап 1: ==============> (1 + 0) / 4]

Некоторые подробности с webui:

org.apache.spark.rdd.RDD.count(RDD.scala:910)
org.apache.spark.mllib.util.DataValidators$$anonfun$1.apply(DataValidators.scala:38)
org.apache.spark.mllib.util.DataValidators$$anonfun$1.apply(DataValidators.scala:37)
org.apache.spark.mllib.regression.GeneralizedLinearAlgorithm$$anonfun$run$2.apply(GeneralizedLinearAlgorithm.scala:161)
org.apache.spark.mllib.regression.GeneralizedLinearAlgorithm$$anonfun$run$2.apply(GeneralizedLinearAlgorithm.scala:161)
scala.collection.LinearSeqOptimized$class.forall(LinearSeqOptimized.scala:70)
scala.collection.immutable.List.forall(List.scala:84)
org.apache.spark.mllib.regression.GeneralizedLinearAlgorithm.run(GeneralizedLinearAlgorithm.scala:161)
org.apache.spark.mllib.regression.GeneralizedLinearAlgorithm.run(GeneralizedLinearAlgorithm.scala:146)
$line21.$read$$iwC$$iwC$$iwC$$iwC.<init>(<console>:33)
$line21.$read$$iwC$$iwC$$iwC.<init>(<console>:38)
$line21.$read$$iwC$$iwC.<init>(<console>:40)
$line21.$read$$iwC.<init>(<console>:42)
$line21.$read.<init>(<console>:44)
$line21.$read$.<init>(<console>:48)
$line21.$read$.<clinit>(<console>)
$line21.$eval$.<init>(<console>:7)
$line21.$eval$.<clinit>(<console>)
$line21.$eval.$print(<console>)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Я не уверен, что делаю не так ... любая помощь приветствуется, спасибо!


person SparkKafkaSetup    schedule 27.03.2015    source источник


Ответы (3)


Спасибо за этот вопрос, я не знал об этих примерах, поэтому я их скачал и протестировал. Я вижу, что репозиторий git содержит файлы с большим количеством html-кода, он работает, но в конечном итоге вы добавите 100 функций, что, возможно, поэтому вы не получаете согласованных результатов, поскольку ваши собственные файлы содержат гораздо меньше функций. Что я сделал, чтобы проверить, что это работает без html-кода, так это удалил HTML-код из spam.txt и ham.txt следующим образом:

ham.txt =

Dear Spark Learner, Thanks so much for attending the Spark Summit 2014!       
Check out videos of talks from the summit at ...
Hi Mom, Apologies for being late about emailing and forgetting to send you  
the package.  I hope you and bro have been ...
Wow, hey Fred, just heard about the Spark petabyte sort.  I think we need to  
take time to try it out immediately ...
Hi Spark user list, This is my first question to this list, so thanks in  
advance for your help!  I tried running ...
Thanks Tom for your email.  I need to refer you to Alice for this one.  I    
haven&#39;t yet figured out that part either ...
Good job yesterday!  I was attending your talk, and really enjoyed it.  I   
want to try out GraphX ...
Summit demo got whoops from audience!  Had to let you know. --Joe

spam.txt =

 Dear sir, I am a Prince in a far kingdom you have not heard of.  I want to 
 send you money via wire transfer so please ...
 Get Viagra real cheap!  Send money right away to ...
 Oh my gosh you can be really strong too with these drugs found in the     
 rainforest. Get them cheap right now ...
 YOUR COMPUTER HAS BEEN INFECTED!  YOU MUST RESET YOUR PASSWORD.  Reply to    
 this email with your password and SSN ...
 THIS IS NOT A SCAM!  Send money and get access to awesome stuff really   
 cheap and never have to ...

Затем используйте приведенный ниже модифицированный MLib.scala, убедитесь, что в вашем проекте есть ссылка на log4j для перенаправления вывода в файл, а не в консоль, поэтому вам в основном нужно запускать дважды, при первом запуске наблюдайте за выводом, печатая количество функций в спаме и ветчину, вы можете затем установить правильное количество функций (вместо 100), которое я использовал 5.

package com.oreilly.learningsparkexamples.scala

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.classification.LogisticRegressionWithSGD
import org.apache.spark.mllib.feature.HashingTF
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.log4j.Logger

object MLlib {

private val logger = Logger.getLogger("MLlib")

def main(args: Array[String]) {
    logger.info("This is spark in Windows")
    val conf = new SparkConf().setAppName(s"Book example: Scala").setMaster("local[2]").set("spark.executor.memory","1g")
    //val conf = new SparkConf().setAppName(s"Book example: Scala")
    val sc = new SparkContext(conf)
    // Load 2 types of emails from text files: spam and ham (non-spam).
    // Each line has text from one email.
    val spam = sc.textFile("spam.txt")
    val ham = sc.textFile("ham.txt")
    // Create a HashingTF instance to map email text to vectors of 5 (not 100) features.
    val tf = new HashingTF(numFeatures = 5)
    // Each email is split into words, and each word is mapped to one feature.
    val spamFeatures = spam.map(email => tf.transform(email.split(" ")))
    println ("features in spam " + spamFeatures.count())
    val hamFeatures = ham.map(email => tf.transform(email.split(" ")))
    println ("features in ham " + ham.count())
    // Create LabeledPoint datasets for positive (spam) and negative (ham) examples.
    val positiveExamples = spamFeatures.map(features => LabeledPoint(1, features))
    val negativeExamples = hamFeatures.map(features => LabeledPoint(0, features))
    val trainingData = positiveExamples ++ negativeExamples
    trainingData.cache() // Cache data since Logistic Regression is an iterative algorithm.
    // Create a Logistic Regression learner which uses the LBFGS optimizer.
    val lrLearner = new LogisticRegressionWithSGD()
    // Run the actual learning algorithm on the training data.
    val model = lrLearner.run(trainingData)
    // Test on a positive example (spam) and a negative one (ham).
    // First apply the same HashingTF feature transformation used on the training data.
    val ex1 = "O M G GET cheap stuff by sending money to ...";
    val ex2 = "Hi Dad, I started studying Spark the other ..."
    val posTestExample = tf.transform(ex1.split(" "))
    val negTestExample = tf.transform(ex2.split(" "))
    // Now use the learned model to predict spam/ham for new emails.
    println(s"Prediction for positive test example: ${ex1} : ${model.predict(posTestExample)}")
    println(s"Prediction for negative test example: ${ex2} : ${model.predict(negTestExample)}")
    sc.stop()
  }
}

Когда я запускаю это на выходе, я получаю:

features in spam 5
features in ham 7
Prediction for positive test example: O M G GET cheap stuff by sending money    
to ... : 1.0
Prediction for negative test example: Hi Dad, I started studying Spark the    
other ... : 0.0
person Gabriel Hernandez    schedule 27.03.2015
comment
Спасибо, Габриэль, за подробное объяснение. Пара дополнительных вопросов, так как я все еще не смог запустить программу ... не могли бы вы проверить мою правку в основном вопросе, так как это сложно задать в комментарии? Большое спасибо. - person SparkKafkaSetup; 29.03.2015

У меня была такая же проблема со Spark 1.5.2 в моем локальном кластере. Моя программа остановилась на «count at DataValidators.scala: 40». Устранено запуском Spark как "spark-submit --master local"

person Roman    schedule 03.02.2016

У меня была аналогичная проблема со Spark 1.5.2 в моем локальном кластере. Моя программа остановилась на «count at DataValidators.scala: 40». Я кешировал свои тренировочные функции. Убрал кеширование (просто не вызывал функцию кеширования) и решилось. Хотя не уверен в истинной причине.

person Pushpender    schedule 08.03.2016
comment
Не могли бы вы объяснить логику этого? Насколько мне известно, итерационные алгоритмы MLib должны лучше работать с кэшированными данными. - person Duckling; 16.09.2017