/ / Nie można uruchomić Flume z powodu konfliktu JAR - java, hadoop, twitter4j, flume

Nie można uruchomić Flume z powodu konfliktu JAR - java, hadoop, twitter4j, flume

Zainstalowałem Flume i Hadoop ręcznie (to znaczy nie CDH) i próbuję uruchomić Twittera przykład z Cloudera.

w apache-flume-1.5.0-SNAPSHOT-bin katalogu, uruchamiam agenta następującą komendą:

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

Mój conf/twitter.conf plik używa rejestratora jako ujścia. The conf/flume-env.sh przypisuje do CLASSPATH flume-sources-1.0-SNAPSHOT.jar która zawiera definicję źródła Twittera. Wynikowy wynik to:

(...) [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)

Konflikt wynika z: FilterQuery klasa, która jest zdefiniowana gdzie indziej w flume lib i która nie zawiera setIncludeEntities metoda. Dla mnie plik zawierający tę klasę to twitter4j-stream-3.0.3.jar i nie mogę wykluczyć pliku ze ścieżki klas zgodnie z sugestią tutaj.

Odpowiedzi:

5 dla odpowiedzi № 1

Uważam, że to doświadczenie było dość frustrującedla ciebie, dla mnie to na pewno. Głównym problemem jest to, że zarówno pliki flume-sources-1.0-SNAPSHOT.jar, jak i twitter4j-stream-3.0.3.jar zawierają tę samą klasę FilterQuery.class. Dlatego komunikat o konflikcie jest generowany w pliku dziennika.

Nie jestem ekspertem od Java ani Big Data, ale mogę dać ci alternatywę dla tego problemu. Pobierz Twitter4j-stream-2.6.6.jar lub niższą wersję z tutaj i zastąp twitter4j-stream-3.0.3.jar. Wszystkie wersje 3.X.X korzystają z tej klasy. Po wymianie wszystko powinno działać poprawnie. Ale możesz pobrać błąd sterty po pobraniu dużej ilości tweetów. Przejdź do rozwiązania, które zostało rozwiązane w plikach 3.X.X.

-Edytować Nie zapomnij też pobrać izamień wszystkie pliki twitter4j w folderze / usr / lib / flume-ng. Mianowicie twitter4j-media-support-2.2.6.jar, twitter4j-stream-2.2.6.jar i twitter4j-core-2.2.6.jar. Wszelkie niedopasowanie związane z wersją tych plików również spowoduje problem.


1 dla odpowiedzi nr 2

Jak sugerowano w poście Problematycznym plikiem może być również search-contrib-1.0.0-jar-with-dependencies.jar.


1 dla odpowiedzi nr 3

Musisz ponownie skompilować flume-sources-1.0-SNAPSHOT.jar z git:https://github.com/cloudera/cdh-twitter-example

Zainstaluj Maven, a następnie pobierz repozytorium cdh-twitter-example.

Rozpakuj, a następnie uruchom wewnątrz (jak wspomniano):

$ cd flume-sources

Pakiet $ mvn

$ cd ..

Ten problem wystąpił, gdy wersja twitter4j zaktualizowała się z 2.2.6 do 3.X, usunęli metodę setIncludeEntities, a JAR jest nieaktualny.

PS: Nie pobieraj gotowej wersji, jest ona wciąż stara.


0 dla odpowiedzi nr 4

Po prostu zmień nazwę wszystkich plików jar twitter4j-stream * i uruchom ponownie flume. Będzie działać z wdziękiem. :)


0 dla odpowiedzi № 5

Miałem ten sam problem i w końcu rozwiązałem następujące kroki:

  • Najpierw zmieniłem nazwę wszystkich plików jar w jarx: z twitter4j-stream-3.0.3.jar -> twitter4j-stream-3.0.3.jarx, ...

To rozwiązało błąd, ale gdy próbowałem nawiązać połączenie, otrzymałem błąd 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.)