복붙노트

[HADOOP] hadoop 작업에 외부 항아리를 추가하는 방법?

HADOOP

hadoop 작업에 외부 항아리를 추가하는 방법?

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. ==============================

    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. ==============================

    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. ==============================

    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에서도 잘 작동합니다.

  4. from https://stackoverflow.com/questions/28520821/how-to-add-external-jar-to-hadoop-job by cc-by-sa and MIT license