/ / Impossibile eseguire Flume a causa del conflitto JAR: java, hadoop, twitter4j, flume

Impossibile eseguire Flume a causa del conflitto JAR: java, hadoop, twitter4j, flume

Ho installato Flume e Hadoop manualmente (voglio dire, non CDH) e sto cercando di eseguire il twitter esempio da Cloudera.

Nel apache-flume-1.5.0-SNAPSHOT-bin directory, avvio l'agente con il seguente comando:

bin/flume-ng agent -c conf -f conf/twitter.conf -Dflume.root.logger=DEBUG,console -n TwitterAgent

Mio conf/twitter.conf il file utilizza il logger come sink. Il conf/flume-env.sh assegna a CLASSPATH il flume-sources-1.0-SNAPSHOT.jar che contiene la definizione della fonte di Twitter. L'output risultante è:

(...) [ERROR org.apache.flume.lifecycle.LifecycleSupervisor$MonitorRunnable.run(LifecycleSupervisor.java:253)] Unable to start EventDrivenSourceRunner: { source:com.cloudera.flume.source.TwitterSource{name:Twitter,state:IDLE} } - Exception follows. java.lang.NoSuchMethodError:
twitter4j.FilterQuery.setIncludeEntities(Z)Ltwitter4j/FilterQuery;
at com.cloudera.flume.source.TwitterSource.start(TwitterSource.java:139)

Il conflitto risulta da a FilterQuery classe che è definita altrove nella lib flume e che non contiene il setIncludeEntities metodo. Per me, il file che contiene questa classe è il twitter4j-stream-3.0.3.jar e non posso escludere il file dal classpath come suggerito Qui.

risposte:

5 per risposta № 1

Credo che questa esperienza sia stata abbastanza frustranteper te, per me era sicuro. Il problema principale è che entrambi i file, flume-sources-1.0-SNAPSHOT.jar e twitter4j-stream-3.0.3.jar contengono lo stesso FilterQuery.class. Questo è il motivo per cui il messaggio di conflitto viene generato nel file di registro.

Non sono un esperto di Java o Big Data, ma posso darti un'alternativa a questo problema. Scarica Twitter4j-stream-2.6.6.jar o versione precedente da Qui e sostituisce twitter4j-stream-3.0.3.jar. Tutto il 3.X.X utilizza questa classe. Dopo la sostituzione, tutto dovrebbe funzionare correttamente. Ma potresti ottenere un errore di heap dopo aver scaricato una grande quantità di tweet. Si prega di google la soluzione come è stata risolta in file 3.X.X.

-Modificare Inoltre, per favore non dimenticare di scaricare esostituire tutti i file twitter4j nella cartella / usr / lib / flume-ng. Vale a dire, twitter4j-media-support-2.2.6.jar, twitter4j-stream-2.2.6.jar e twitter4j-core-2.2.6.jar. Anche eventuali disallineamenti legati alla versione tra questi file creeranno problemi.


1 per risposta № 2

Come suggerito nella posta un file problematico può essere search-contrib-1.0.0-jar-with-dependencies.jar.


1 per risposta № 3

È necessario ricompilare flume-sources-1.0-SNAPSHOT.jar dal git:https://github.com/cloudera/cdh-twitter-example

Installa Maven, quindi scarica il repository di cdh-twitter-example.

Decomprimere, quindi eseguire all'interno (come mentionned):

$ cd flume-sources

pacchetto $ mvn

$ cd ..

Questo problema si è verificato quando la versione twitter4j è stata aggiornata dalla 2.2.6 alla 3.X, hanno rimosso il metodo setIncludeEntities e il JAR non è aggiornato.

PS: non scaricare la versione preinstallata, è ancora vecchia.


0 per risposta № 4

È sufficiente rinominare tutti i file jar di twitter4j-stream * ed eseguire nuovamente il flume. Funzionerà con fascino. :)


0 per risposta № 5

Ho avuto lo stesso problema e alla fine ho risolto seguendo questi passaggi:

  • Per prima cosa ho rinominato tutti i file jar in jarx: da twitter4j-stream-3.0.3.jar -> twitter4j-stream-3.0.3.jarx, ...

Questo ha risolto l'errore, ma quando ha provato a stabilire una connessione, ho ricevuto l'errore 404:

(Twitter Stream consumer-1[Establishing connection])
[INFO - Twitter4j.internal.logging.SLF4JLogger.info(SLF4JLogger.java:83)] 404:
The URI requested is invalid or the resource requested, such as a user, does not exist.)