2016-05-14 5 views
1

Я пытаюсь получить доступ к потоковым твитам из Spark Streaming.Spark Streaming - java.lang.NoSuchMethodError Error

Это конфигурация программного обеспечения.

Ubuntu 14.04.2 LTS

-версия Скала

Scala код бегуна версия 2.11.7 - Copyright 2002-2013, LAMP/EPFL

искры -submit -version

Искры версии 1.6.0

Ниже приведен код.

object PrintTweets 
{ 
def main(args: Array[String]) { 

    // Configure Twitter credentials using twitter.txt 
    setupTwitter() 

    // Set up a Spark streaming context named "PrintTweets" that runs locally using 
    // all CPU cores and one-second batches of data 
    val ssc = new StreamingContext("local[*]", "PrintTweets", Seconds(1)) 

    // Get rid of log spam (should be called after the context is set up) 
    setupLogging() 

    // Create a DStream from Twitter using our streaming context 
    val tweets = TwitterUtils.createStream(ssc, None) 


    // Now extract the text of each status update into RDD's using map() 
    val statuses = tweets.map(status => status.getText()) 

    // Print out the first ten 
    statuses.print() 

    // Kick it all off 
    ssc.start() 
    ssc.awaitTermination() 
} 
} 

Utilities.scala

object Utilities { 
/** Makes sure only ERROR messages get logged to avoid log spam. */ 
def setupLogging() = { 
    import org.apache.log4j.{Level, Logger} 
    val rootLogger = Logger.getRootLogger() 
    rootLogger.setLevel(Level.ERROR) 
} 

/** Configures Twitter service credentials using twiter.txt in the main workspace directory */ 
def setupTwitter() = { 
    import scala.io.Source 

    for (line <- Source.fromFile("./data/twitter.txt").getLines) { 
    val fields = line.split(" ") 
    if (fields.length == 2) { 
    System.setProperty("twitter4j.oauth." + fields(0), fields(1)) 
    } 
} 

}

}

Вопросы:

Поскольку она нуждается в библиотеку twitter4j, я добавил
twitter4j-ядро-4,0 .4, twitter4j-stream-4.0.4 в пути построения eclipse как ex красные банки.

Тогда я запустил программу, она не сделала никакой ошибки. Но твиты не появляются в консоли. Он был пуст.

Итак, я вижу некоторые форумы и пониженный twitter4j до 3.0.3. Также в Eclipse я выбрал Scala 2.10 Библиотечный контейнер в окне «Путь сборки».

После этого я получил java.lang.NoSuchMethodError ошибку времени выполнения.

16/05/14 11:46:01 ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0) 
java.lang.NoSuchMethodError: twitter4j.TwitterStream.addListener(Ltwitter4j/StreamListener;)V 
at org.apache.spark.streaming.twitter.TwitterReceiver.onStart(TwitterInputDStream.scala:72) 
at org.apache.spark.streaming.receiver.ReceiverSupervisor.startReceiver(ReceiverSupervisor.scala:148) 
at org.apache.spark.streaming.receiver.ReceiverSupervisor.start(ReceiverSupervisor.scala:130) 
at org.apache.spark.streaming.scheduler.ReceiverTracker$ReceiverTrackerEndpoint$$anonfun$9.apply(ReceiverTracker.scala:575) 
at org.apache.spark.streaming.scheduler.ReceiverTracker$ReceiverTrackerEndpoint$$anonfun$9.apply(ReceiverTracker.scala:565) 
at org.apache.spark.SparkContext$$anonfun$37.apply(SparkContext.scala:1992) 
at org.apache.spark.SparkContext$$anonfun$37.apply(SparkContext.scala:1992) 
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66) 
at org.apache.spark.scheduler.Task.run(Task.scala:89) 
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:745) 

Пожалуйста, помогите мне решить эту проблему. Первоначально я установил искру, используя Scala 2.11. Это проблема. Нужно ли мне удалять все и переустанавливать Scala 2.10, а затем пакет, скомпилированный Spark.

Или, кроме Scala 2.11, мне нужно иметь Scala 2.10 в моей системе?

+0

Вы ответили на свой вопрос. Поскольку все, что вы получаете, находится в scala 2.11, почему вы cose Scala 2.10 n Eclipse? Не могли бы вы изменить его на Scala 2.11 и попробовать еще раз? – user1314742

+0

Привет всем. Я могу решить его, посмотрев в интерфейс Spark, увидев график процесса. Я запускаю программу внутри VM, и проблема связана с настройкой 'local [*]'. После того как я изменил его на 'local [2]', я могу видеть твиты. Я думаю, что 'local [*]' не может получить достаточное количество потоков для обработки входных потоковых твитов. – user3057556

+0

Честно говоря, я не вижу, как это решило проблему. ИМХО, проблема не имеет ничего общего с объемом ресурсов, назначенных на работу. Но хорошо для вас все равно :) – user1314742

ответ

2

Вышеуказанное исключение, по-видимому, вызвано несовместимостью spark version 1.6.0 и twitter4j 3.0.3 version.

twitter4j.TwitterStream, который передается в onStart методе org.apache.spark.streaming.twitter.TwitterReceiver, есть метод, который принимает AddListener экземпляра twitter4j.StreamListener.

twitter4j 3.0.3 version не имеет какую-либо методы twitter4j.TwitterStream.addListener(StreamListener), вместо этого он имеет несколько других addListener методов, которые принимают подкласс StreamListener.

twitter4j 4.0.4 version имеет желаемый метод, поэтому к этой библиотеке не возникает ошибок. Поэтому изменение на twitter4j 3.0.3 version не решит проблему.

Проблема в другом месте.