2014-11-05 13 views
5

Próbuję ustawić zewnętrzne słoiki na ścieżkę klasy miaoop, ale niestety nie ma to szczęścia.Ustawianie zewnętrznych słoików na ścieżkę klasy miaoopu

Mam następujące ustawienia

$ hadoop version
Hadoop 2.0.6-alpha Subversion https://git-wip-us.apache.org/repos/asf/bigtop.git -r ca4c88898f95aaab3fd85b5e9c194ffd647c2109 Compiled by jenkins on 2013-10-31T07:55Z From source with checksum 95e88b2a9589fa69d6d5c1dbd48d4e This command was run using /usr/lib/hadoop/hadoop-common-2.0.6-alpha.jar

Classpath

$ echo $HADOOP_CLASSPATH
/home/tom/workspace/libs/opencsv-2.3.jar

jestem w stanie zobaczyć powyżej HADOOP_CLASSPATH została podchwycona przez Hadoop

$ hadoop classpath
/etc/hadoop/conf:/usr/lib/hadoop/lib/:/usr/lib/hadoop/.//:/home/tom/workspace/libs/opencsv-2.3.jar:/usr/lib/hadoop-hdfs/./:/usr/lib/hadoop-hdfs/lib/:/usr/lib/hadoop-hdfs/.//:/usr/lib/hadoop-yarn/lib/:/usr/lib/hadoop-yarn/.//:/usr/lib/hadoop-mapreduce/lib/:/usr/lib/hadoop-mapreduce/.//

poleceń

$ sudo hadoop jar FlightsByCarrier.jar FlightsByCarrier /user/root/1987.csv /user/root/result

Próbowałem z opcją -libjars także

$ sudo hadoop jar FlightsByCarrier.jar FlightsByCarrier /user/root/1987.csv /user/root/result -libjars /home/tom/workspace/libs/opencsv-2.3.jar

The StackTrace

14/11/04 16:43:23 INFO mapreduce.Job: Running job: job_1415115532989_0001 14/11/04 16:43:55 INFO mapreduce.Job: Job job_1415115532989_0001 running in uber mode : false 14/11/04 16:43:56 INFO mapreduce.Job: map 0% reduce 0% 14/11/04 16:45:27 INFO mapreduce.Job: map 50% reduce 0% 14/11/04 16:45:27 INFO mapreduce.Job: Task Id : attempt_1415115532989_0001_m_000001_0, Status : FAILED Error: java.lang.ClassNotFoundException: au.com.bytecode.opencsv.CSVParser at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at FlightsByCarrierMapper.map(FlightsByCarrierMapper.java:19) at FlightsByCarrierMapper.map(FlightsByCarrierMapper.java:10) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:757) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:158) 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:1478) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:153)

Każda pomoc jest bardzo ceniona.

+0

Spróbuj tego: sudo Hadoop słoik FlightsByCarrier.jar FlightsByCarrier -libjars /home/tom/workspace/libs/opencsv-2.3.jar /user/root/1987.csv/user/root/rezultat –

+0

Sprawdź moją odpowiedź tutaj, wyjaśniłem wszystkie dostępne opcje rozwiązania tego problemu tutaj: stackoverflow.com/a/36227260/1766402 – Isaiah4110

Odpowiedz

3

Twój zewnętrzny słoik nie ma na mapach węzła. Musisz go dodać do pamięci podręcznej, aby była dostępna. Spróbuj:

DistributedCache.addFileToClassPath(new Path("pathToJar"), conf); 

Nie wiesz, w którą wersję DistributedCache była przestarzała, ale z Hadoop 2.2.0 naprzód można użyć:

job.addFileToClassPath(new Path("pathToJar")); 
+0

Dzięki temu zadziałało. – mnm

+0

Trzymałem jar w HDFS używając .. hadoop fs -put java-json.jar /user/root/jars/java-json.jar ... W mojej klasie dałem job.addFileToClassPath (new Path ("/ user /root/jars/java-json.jar ")); Ale podczas pracy z otrzymaniem NoClassDefFoundError Czy czegoś mi brakuje? –

+0

Próbowałem tej samej 'job.addFileToClassPath (new Path (" pathToJar ")); 'i podana ścieżka mojego pliku HDFS.Próbowałem dać 777 uprawnień do pliku, ale wciąż nie jestem w stanie tego rozwiązać. Czy możesz mi w tym pomóc? – Manindar

0

znalazłem innego obejścia poprzez wdrożenie ToolRunner jak poniżej. Dzięki temu podejściu hasoop akceptuje opcje linii poleceń. Możemy uniknąć twarde kodowania plików dodając do DistributedCache

public class FlightsByCarrier extends Configured implements Tool { 

     public int run(String[] args) throws Exception { 
     // Configuration processed by ToolRunner 
     Configuration conf = getConf(); 

     // Create a JobConf using the processed conf 
     JobConf job = new JobConf(conf, FlightsByCarrier.class); 

     // Process custom command-line options 
     Path in = new Path(args[1]); 
     Path out = new Path(args[2]); 

     // Specify various job-specific parameters  
     job.setJobName("my-app"); 
     job.setInputPath(in); 
     job.setOutputPath(out); 
     job.setMapperClass(MyMapper.class); 
     job.setReducerClass(MyReducer.class); 

     // Submit the job, then poll for progress until the job is complete 
     JobClient.runJob(job); 
     return 0; 
     } 

     public static void main(String[] args) throws Exception { 
     // Let ToolRunner handle generic command-line options 
     int res = ToolRunner.run(new Configuration(), new FlightsByCarrier(), args); 

     System.exit(res); 
     } 
    } 
0

znalazłem bardzo proste rozwiązanie problemu: logowania jako root:

cd /usr/lib find . -name "opencsv.jar"

Podnieść locatin pliku. W moim przypadku> Znalazłem ją pod /usr/lib/hive/lib/opencsv*.jar

teraz złożyć Komenda

hadoop classpath

Wynik pokazuje direcory gdzie Hadoop wyszukuje Jar-plików. Odbierz jeden katalog i skopiuj plik jar opencsv * do tego katalogu.

W moim przypadku zadziałało.

1

Jeśli dodajesz zewnętrzny plik JAR do ścieżki klasy Hadoop, lepiej jest skopiować plik JAR do jednego z istniejących katalogów, które przegląda. W wierszu poleceń uruchom polecenie "hadoop classpath", a następnie znajdź odpowiedni folder i skopiuj plik jar do tej lokalizacji, a hadoop pobierze stąd zależności. To nie będzie działać z CloudEra itp., Ponieważ możesz nie mieć uprawnień do odczytu/zapisu, aby kopiować pliki do folderów ścieżek classpath.

Wygląda na to, że wypróbowałeś również opcję LIBJAR, czy edytowałeś swoją klasę sterowników, aby zaimplementować interfejs TOOL?Najpierw upewnij się, że jesteś edytować klasę sterownika, jak pokazano poniżej:

public class myDriverClass extends Configured implements Tool { 

     public static void main(String[] args) throws Exception { 
     int res = ToolRunner.run(new Configuration(), new myDriverClass(), args); 
     System.exit(res); 
     } 

     public int run(String[] args) throws Exception 
     { 

     // Configuration processed by ToolRunner 
     Configuration conf = getConf(); 
     Job job = new Job(conf, "My Job"); 

     ... 
     ... 

     return job.waitForCompletion(true) ? 0 : 1; 
     } 
    } 

Teraz edytować polecenia „Hadoop Jar”, jak pokazano poniżej:

hadoop jar YourApplication.jar [myDriverClass] args -libjars path/to/jar/file 

Teraz pozwala zrozumieć, co dzieje się pod spodem. Zasadniczo obsługujemy nowe argumenty wiersza poleceń, implementując TOOL Interface. ToolRunner służy do uruchamiania klas implementujących interfejs Tool. Działa w połączeniu z GenericOptionsParser, aby parsować ogólne argumenty wiersza poleceń i modyfikuje konfigurację narzędzia.

ramach naszej main() wzywamy ToolRunner.run(new Configuration(), new myDriverClass(), args) - to działa dany narzędzi przez Tool.run (string []), po parsowania z podanych ogólnych argumentów. Korzysta z podanej konfiguracji lub tworzy ją, jeśli jest pusta, a następnie ustawia konfigurację narzędzia z potencjalnie zmodyfikowaną wersją conf.

Teraz w metodzie run, gdy wywołujemy getConf() otrzymujemy zmodyfikowaną wersję konfiguracji. Upewnij się, że masz poniższy kod w swoim kodzie. Jeśli zaimplementujesz wszystko inne i nadal będziesz korzystać z konfiguracji conf = new Configuration(), nic nie zadziała.

Configuration conf = getConf(); 
2

Próbowałem ustawienie słoik opencsv w ścieżce klasy Hadoop ale nie work.We trzeba jawnie skopiować słoik w ścieżce klasy do tego, aby work.It nie pracował dla mnie. Poniżej przedstawiono kroki I przestrzegać:

Zrobiłem to w HDP CLuster.I ahave kopiowane mój opencsv słoik bibliotekami HBase i wywożone go przed uruchomieniem mój słoik

Kopiowanie ExternalJars do HDP LIBS:

To Run Otwórz CSV słoika: 1.Copy słoik opencsv w katalogu /usr/hdp/2.2.9.1-11/hbase/lib/ i /usr/hdp/2.2.9.1-11/hadoop-yarn/lib

**sudo cp /home/sshuser/Amedisys/lib/opencsv-3.7.jar /usr/hdp/2.2.9.1-11/hbase/lib/** 

2.Give uprawnienia do pliku przy użyciu sudo chmod 777 opencsv-3.7.jar 3.List Pliki ls -lrt

4. eksport hadoop classpath: hbase classpath

5. Teraz uruchom Jar.Zostanie on słoik opencsv i wykona poprawnie.

Powiązane problemy