2016-01-19 25 views
5

Ciągle otrzymuję wyjątek, ponieważ aplikacja Oozie dodaje nieprawidłową wersję słoika httpcore do ścieżki klasy. I tryed różne opcje, takie jakOozie dodawanie starej wersji słoika httpcore do ścieżki klasy

oozie.launcher.mapreduce.task.classpath.user.precedence 
oozie.launcher.mapreduce.user.classpath.first 

oozie.launcher.mapreduce.task.classpath.user.precedence nie reaguje w ogóle i kiedy używać oozie.launcher.mapreduce.user.classpath.first, aplikacja nie można załadować nawet jedna klasa.

W ścieżce klasy widzę dwie wersje jądra http.

httpcore-4.4.1.jar 
httpcore-4.2.4.jar 

Gdy aplikacja działa w trybie autonomicznym, nie otrzymuję tego wyjątku.

Wyjątek:

Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.JavaMain], main() threw exception, java.lang.NoSuchFieldError: INSTANCE 
org.apache.oozie.action.hadoop.JavaMainException: java.lang.NoSuchFieldError: INSTANCE 
    at org.apache.oozie.action.hadoop.JavaMain.run(JavaMain.java:59) 
    at org.apache.oozie.action.hadoop.LauncherMain.run(LauncherMain.java:47) 
    at org.apache.oozie.action.hadoop.JavaMain.main(JavaMain.java:35) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.oozie.action.hadoop.LauncherMapper.map(LauncherMapper.java:236) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) 
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) 
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 
Caused by: java.lang.NoSuchFieldError: INSTANCE 
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<clinit>(SSLConnectionSocketFactory.java:144) 
    at microsoft.exchange.webservices.data.core.ExchangeServiceBase.createConnectionSocketFactoryRegistry(ExchangeServiceBase.java:244) 
    at microsoft.exchange.webservices.data.core.ExchangeServiceBase.initializeHttpClient(ExchangeServiceBase.java:198) 
    at microsoft.exchange.webservices.data.core.ExchangeServiceBase.<init>(ExchangeServiceBase.java:174) 
    at microsoft.exchange.webservices.data.core.ExchangeServiceBase.<init>(ExchangeServiceBase.java:179) 
    at microsoft.exchange.webservices.data.core.ExchangeService.<init>(ExchangeService.java:3729) 
    at com.sonasoft.sonacloud.email.dispatcher.conn.EwsConnection.getConnection(EwsConnection.java:16) 
    at com.sonasoft.sonacloud.email.dispatcher.conn.EwsConnection.getConnection(EwsConnection.java:10) 
    at com.sonasoft.sonacloud.email.dispatcher.utils.EwsOperations.<init>(EwsOperations.java:47) 
    at com.sonasoft.sonacloud.email.dispatcher.utils.EwsOperations.getInstance(EwsOperations.java:53) 
    at com.sonasoft.sonacloud.email.dispatcher.main.MainClass.main(MainClass.java:41) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.oozie.action.hadoop.JavaMain.run(JavaMain.java:56) 
    ... 15 more 

Oozie budować klient wersja: 4.2.0.2.3.2.0-2950

Każda pomoc jest mile widziana.

+0

Czy możesz dać nam znać, co jest źródłem każdego z dwóch 'httpcore' plików JAR jest? –

+0

Hi Tim, httpcore-4.2.4.jar z pliku hdfs: // ip: port // użytkownik/oozie/share/lib/lib_20151027124452/oozie/ i słoik httpcore-4.4.1 z katalogu lib aplikacji Zbudowałem. –

+0

Załóżmy, że nie możesz zmienić programu ładującego klasy dla Hadoop. Jak więc zbudowałeś swoją aplikację? Czy możesz użyć czegoś podobnego do Mavena, które umożliwiłoby dołączenie JARu 'httpcore' w czasie kompilacji, ale wykluczy go z środowiska wykonawczego? –

Odpowiedz

0

Chcesz zbudować za pomocą lokalnej wersji JAR httpcore, ale nie chcesz, aby był obecny w ścieżce klas, ponieważ Hadoop dostarczy własną wersję. Następnie należy używać zakresu provided dla httpcore JAR:

<project> 
    ... 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpcore</artifactId> 
      <scope>provided</scope>   <!-- this line is important --> 
      <version>4.4.1</version> 
     </dependency> 
    </dependencies> 
</project> 

Z Maven documentation dla provided:

ten jest bardzo podobny do kompilacji, ale wskazuje się spodziewać JDK lub pojemnik aby zapewnić zależność w czasie wykonywania.

+0

dziękuję za odpowiedź. Ale wciąż widzę dwa pliki JARu z rdzeniem HTTP w ścieżce klas. Potrzebuję jedynie wersji 4.4.1.jar dostarczonej przeze mnie i zignorowania pliku JAR dostarczonego przez oozie. Czy to możliwe z "dostarczonym" tagiem? –

+0

Czy JAR 'httpcore' jest obecny w wynikach kompilacji Mavena? Nie powinno być. A jeśli pojawi się później, oznacza to, że framework wprowadza 2 JAR-y. –

+0

Używam następujących w moim pliku pom. com.microsoft.ews-java-api EWS-java-api 2,0 To dodaje http-core-4.4.1 do folderu lib podczas kompilacji przy użyciu Maven –

3

Mieliśmy ten przykry problem z HortonWorks dystrybucji 2.3.2 (wstyd na nich):

  • Oozie "wyrzutnia" praca zawsze dostaje httpcore i httpclient w CLASSPATH w ramach klient Hadoop
  • Oozie "wyrzutnia" praca zawsze dostaje httpcore i httpclient jak grupowane w "Oozie" ShareLib
  • Hive/Hive2 Sharelibs zawierać httpcore i httpclient w nowsza wersja
  • z Hadoop punktu widzenia user.classpath.first dotyczy zarówno ShareLibs więc jest to 50/50 szansa na uzyskanie właściwej kolejności dla każdego JAR (a więc całkowita szansa 25/75)

Konkluzja: musieliśmy

  1. usunąćhttpcore i httpclient z "Oozie" ShareLib HDFS reż (duh!)
  2. podbicie oozie.launcher.mapreduce.job.user.classpath.first flaga dla wszelkich działań polegających na Hive SŁOIKACH (czyli działanie Hive, akcja Hive2, akcja Shell wywołanie sterownika JDBC jakoś, itd.)

Post-scriptum - w Oozie serwer przechowuje w pamięci listę JARów w każdym ShareLibu, dzięki czemu usunięcie JARa podczas pracy serwera spowoduje błędy w nowych zadaniach. Jeśli nie chcesz zatrzymywać serwera Oozie, "właściwą drogą" do aktualizacji live ShareLib jest (a) utworzenie nowej wersji w nowym, oznaczonym czasowo katalogu [sprawdź dokumentację ... ] i (b) poinformować serwer do resync na nowszych libs z oozie admin -sharelibupdate

+0

Usunąłem słoik httpcore z hdfs. A następnie narzeka, mówiąc "Plik nie istnieje: hdfs: //sandbox.hortonworks.com: 8020/user/oozie/share/lib/lib_20151027124452/oozie/httpcore-4.2.4.jar" –

+0

I wtedy wykonałem to polecenie . oozie admin -sharelibupdate Więc teraz błąd zniknął! –

+0

Edytowałem odpowiedź. Zaakceptuj to, abym mógł oznaczyć to jako poprawne. –