복붙노트

[HADOOP] 외부 항아리를 hadoop 클래스 패스로 설정하기

HADOOP

외부 항아리를 hadoop 클래스 패스로 설정하기

나는 외부 항아리를 hadoop classpath로 설정하려하지만 지금까지 행운은 없다.

다음 설정이 있습니다.

클래스 패스

위의 HADOOP_CLASSPATH가 hadoop에 의해 선택되었음을 알 수 있습니다.

명령

나는 -libjars 옵션으로 시도했다.

스택 추적

어떤 도움을 주셔서 감사합니다.

해결법

  1. ==============================

    1.노드 실행 맵에서 외부 항아리가 누락되었습니다. 캐시를 사용 가능하게하려면 캐시에 추가해야합니다. 시도해보십시오.

    노드 실행 맵에서 외부 항아리가 누락되었습니다. 캐시를 사용 가능하게하려면 캐시에 추가해야합니다. 시도해보십시오.

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

    DistributedCache 버전이 더 이상 사용되지 않지만 Hadoop 2.2.0부터는 다음을 사용할 수 있습니다.

    job.addFileToClassPath(new Path("pathToJar")); 
    
  2. ==============================

    2.나는 hadoop 클래스 패스에서 opencsv jar를 설정하려고 시도했지만 작동하지 않았다. 클래스 패스에 jar를 명시 적으로 복사해야 작동 할 수있다. 나를 위해 일했다. 다음은 내가 따라야 할 단계입니다.

    나는 hadoop 클래스 패스에서 opencsv jar를 설정하려고 시도했지만 작동하지 않았다. 클래스 패스에 jar를 명시 적으로 복사해야 작동 할 수있다. 나를 위해 일했다. 다음은 내가 따라야 할 단계입니다.

    HDP CLuster에서이 작업을 수행했습니다. hcs libs에 내 opencsv jar 파일을 복사하고 내 항아리를 실행하기 전에 내 보냅니다.

    외부 항아리를 HDP LIBS에 복사 :

    열린 CSV Jar를 실행하려면 1. /usr/hdp/2.2.9.1-11/hbase/lib/ 및 /usr/hdp/2.2.9.1-11/hadoop-yarn/lib 디렉토리에있는 opencsv jar를 복사하십시오.

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

    2.Five를 사용하여 파일 권한 부여     sudo chmod 777 opencsv-3.7.jar 3. 파일 목록     ls -lrt

    4.exporthadoop 클래스 패스 : hbase 클래스 패스

    5. 이제 Jar 파일을 실행하십시오. 이것은 opencsv 항아리를 들고 제대로 실행됩니다.

  3. ==============================

    3.외부 JAR을 Hadoop 클래스 패스에 추가하는 경우, hadoop이보고있는 기존 디렉토리 중 하나에 JAR을 복사하는 것이 좋습니다. 커맨드 라인에서 "hadoop classpath"명령을 실행하고 적합한 폴더를 찾고 jar 파일을 해당 위치에 복사하면 hadoop이 종속 파일을 선택합니다. hadoop 클래스 경로 폴더에 파일을 복사 할 수있는 읽기 / 쓰기 권한이 없으므로 CloudEra 등에서는 작동하지 않습니다.

    외부 JAR을 Hadoop 클래스 패스에 추가하는 경우, hadoop이보고있는 기존 디렉토리 중 하나에 JAR을 복사하는 것이 좋습니다. 커맨드 라인에서 "hadoop classpath"명령을 실행하고 적합한 폴더를 찾고 jar 파일을 해당 위치에 복사하면 hadoop이 종속 파일을 선택합니다. hadoop 클래스 경로 폴더에 파일을 복사 할 수있는 읽기 / 쓰기 권한이 없으므로 CloudEra 등에서는 작동하지 않습니다.

    LIBJAR 옵션을 시도한 것처럼 보입니다. 드라이버 클래스를 편집하여 TOOL 인터페이스를 구현 했습니까? 먼저 아래와 같이 드라이버 클래스를 편집해야합니다.

        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;
          }
        }
    

    이제 아래와 같이 "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();
    
  4. ==============================

    4.아래 ToolRunner 구현하여 다른 해결 방법을 발견했다. 이 접근 방식으로 hadoop은 명령 행 옵션을 허용합니다. 우리는 DistributedCache에 파일을 추가하는 하드 코딩을 피할 수 있습니다.

    아래 ToolRunner 구현하여 다른 해결 방법을 발견했다. 이 접근 방식으로 hadoop은 명령 행 옵션을 허용합니다. 우리는 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);
           }
         }
    
  5. ==============================

    5.문제에 대한 매우 쉬운 해결책을 찾았습니다. 루트로 로그인 :

    문제에 대한 매우 쉬운 해결책을 찾았습니다. 루트로 로그인 :

    파일의 위치를 ​​선택하십시오. 내 경우 엔> /usr/lib/hive/lib/opencsv*.jar에서 찾았습니다.

    이제 명령을 제출하십시오.

    결과는 hadoop이 jar 파일을 검색하는 디렉토리를 보여줍니다. 하나의 디렉토리를 선택하고 opencsv * jar를 해당 디렉토리에 복사하십시오.

    내 경우에는 효과가 있었다.

  6. from https://stackoverflow.com/questions/26748811/setting-external-jars-to-hadoop-classpath by cc-by-sa and MIT license