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 № 1Uważ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.)
- Po przeczytaniu tej strony (https://twittercommunity.com/t/twitter-streaming-api-not-working-with-twitter4j-and-apache-flume/66612/11) w końcu rozwiązałem pobieranie nowej wersji twitter4j (na stronie znajduje się link). Prawdopodobnie nie najlepsze rozwiązanie, ale działało dla mnie.