[HADOOP] hadoop 작업에 외부 항아리를 추가하는 방법?
HADOOPhadoop 작업에 외부 항아리를 추가하는 방법?
mapper가 외부 항아리를 사용해야하는 Hadoop 작업이 있습니다.
나는이 항아리를 매퍼의 JVM에 전달하려고 시도했다.
hadoop 명령의 -libjars 인수를 통해
hadoop jar mrrunner.jar DAGMRRunner -libjars <path_to_jar>/colt.jar
via job.addFileToClassPath
job.addFileToClassPath(new Path("<path_to_jar>/colt.jar"));
HADOOP_CLASSPATH에 있습니다.
g1mihai@hydra:/home/g1mihai/$ echo $HADOOP_CLASSPATH
<path_to_jar>/colt.jar
이 방법들 중 어느 것도 작동하지 않습니다. 이것은 내가 얻은 스택 추적입니다. 불평 클래스는 SparseDoubleMatrix1D가 colt.jar에 있습니다.
추가 디버그 정보를 제공해야하는지 알려주세요. 감사.
15/02/14 16:47:51 INFO mapred.MapTask: Starting flush of map output
15/02/14 16:47:51 INFO mapred.LocalJobRunner: map task executor complete.
15/02/14 16:47:51 WARN mapred.LocalJobRunner: job_local368086771_0001
java.lang.Exception: java.lang.NoClassDefFoundError: Lcern/colt/matrix/impl/SparseDoubleMatrix1D;
at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)
Caused by: java.lang.NoClassDefFoundError: Lcern/colt/matrix/impl/SparseDoubleMatrix1D;
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2499)
at java.lang.Class.getDeclaredField(Class.java:1951)
at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1659)
at java.io.ObjectStreamClass.access$700(ObjectStreamClass.java:72)
at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:480)
at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:468)
at java.security.AccessController.doPrivileged(Native Method)
at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:468)
at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:365)
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:602)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1622)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at BoostConnector.ConnectCalculateBoost(BoostConnector.java:39)
at DAGMapReduceSearcher$Map.map(DAGMapReduceSearcher.java:46)
at DAGMapReduceSearcher$Map.map(DAGMapReduceSearcher.java:22)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:784)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: cern.colt.matrix.impl.SparseDoubleMatrix1D
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 java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 28 more
해결법
-
==============================
1.나는이 질문이 상세한 답변을받을 자격이 있다고 믿는다, 나는 어제 이것에 붙어 있었고 많은 시간을 낭비했다. 이 답변이이 문제에 부딪치게되는 모든 사람들에게 도움이되기를 바랍니다. 이 문제를 해결할 수있는 몇 가지 옵션이 있습니다.
나는이 질문이 상세한 답변을받을 자격이 있다고 믿는다, 나는 어제 이것에 붙어 있었고 많은 시간을 낭비했다. 이 답변이이 문제에 부딪치게되는 모든 사람들에게 도움이되기를 바랍니다. 이 문제를 해결할 수있는 몇 가지 옵션이 있습니다.
이제 아래와 같이 "hadoop jar"명령을 편집하십시오 :
hadoop jar YourApplication.jar [myDriverClass] args -libjars path/to/jar/file
이제 어떻게 될지 이해하십시오. 기본적으로 TOOL 인터페이스를 구현하여 새로운 명령 행 인수를 처리하고 있습니다. ToolRunner는 Tool 인터페이스를 구현하는 클래스를 실행하는 데 사용됩니다. GenericOptionsParser와 함께 작동하여 generic hadoop 명령 줄 인수를 구문 분석하고 도구 구성을 수정합니다.
우리의 Main () 내에서 ToolRunner.run (새로운 Configuration (), 새로운 myDriverClass (), args)을 호출합니다. - 주어진 generic 인자로 파싱 한 후 Tool.run (String [])에 의해 주어진 Tool을 실행합니다. 지정된 Configuration를 사용하는지, null의 경우는 구축해, 변경된 버젼의 conf로 Tool의 설정을 설정합니다.
이제 run 메소드 내에서 getConf ()를 호출하면 수정 된 버전의 Configuration이 생성됩니다. 따라서 코드에 아래 줄이 있는지 확인하십시오. 다른 모든 것을 구현하고 여전히 Configuration conf = new Configuration ()을 사용하면 아무 것도 작동하지 않습니다.
Configuration conf = getConf();
-
==============================
2.분산 캐시 사용 - 캐시에 실행 파일이나 작은 참조 파일을 넣고 MR 작업에 사용할 수 있습니다.
분산 캐시 사용 - 캐시에 실행 파일이나 작은 참조 파일을 넣고 MR 작업에 사용할 수 있습니다.
https://hadoop.apache.org/docs/r1.2.1/api/org/apache/hadoop/filecache/DistributedCache.html
MR 작업을 실행하는 두 가지 방법이 있습니다. 하나는 실행 시간에 클래스 이름으로, 다른 하나는 항아리를 내보낼 때 기본 클래스를 언급합니다.
hadoop jar jarname.jar DriverClassName Input-Location Output-Location hadoop jar jarname.jar Input-Location Output-Location
-
==============================
3.나는 이것을 사용했다 :
나는 이것을 사용했다 :
$ export LIBJARS=$HOME/.m2/repository/net/sf/opencsv/opencsv/2.3/opencsv-2.3.jar,$HOME/.m2/repository/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar,$HOME/.m2/repository/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar,$HOME/.m2/repository/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar $ export HADOOP_CLASSPATH=`echo ${LIBJARS} | sed s/,/:/g` $ $HADOOP_HOME/bin/hadoop jar $HOME/.m2/repository/hadoopTest/hadoopTest/0.0.2-SNAPSHOT/hadoopTest-0.0.2-SNAPSHOT.jar hadoopTest.testTask.TestTask -libjars ${LIBJARS} $HADOOP_HOME/input/ $HADOOP_HOME/output
그리고 Hadoop 3.2.0에서도 잘 작동합니다.
from https://stackoverflow.com/questions/28520821/how-to-add-external-jar-to-hadoop-job by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] spark-submit을 통해 추가 병을 Spark에 전달 (0) | 2019.05.31 |
---|---|
[HADOOP] 돼지 - 발견 된 인터페이스 org.apache.hadoop.mapreduce.JobContext, 그러나 클래스가 예상됩니다. (0) | 2019.05.31 |
[HADOOP] 높은 카디널리티 필드에 대한 하이브 쿼리 성능 (0) | 2019.05.31 |
[HADOOP] brute force 알고리즘은 확장 할 수 있습니까? (0) | 2019.05.31 |
[HADOOP] Hadoop WordCount 예제가지도에서 멈춤 100 % 감소 0 % (0) | 2019.05.31 |