2012-02-16 3 views
1

간단한 병에서 Hadoop으로 작업하는 jar를 트리거하여 HDFS, Actully를 사용하는 방법.이 명령을 수동으로 실행하고 있습니다. bin/hadoop jar ~/wordcount_classes/word.jar org. myorg.WordCount ~/hadoop-0.20.203.0/input1 ~/hadoop-0.20.203/output2 여기서 HDFS에 입력 및 출력 디렉토리를 제공하고 여기에 word.jar를 사용하고 있습니다. 그렇게하고 싶습니다. Java Project에서 자동으로 트리거됩니다.자바 코드에 의한 Hadoop 명령 트리거

+0

달성하려는 목표를 더 잘 설명 할 수 있습니까? – inquire

+0

작업에 대한 Java 클래스에 의해 트리거되도록 Mapreducer 작업을 실행하려고 시도하고 입력 세트를 HDFS의 입력 디렉토리에 덤핑 한 후에 시작되었습니다. –

답변

1

당신이 요구하는 모든 것은 항아리의 메인에 의해 수행됩니다. 매개 변수를 읽고, 작업 구성을 작성하고, 입력 및 출력 형식을 설정하고 마지막으로 작업을 실행합니다.

0

동일한 문제를 해결하기 위해 노력하고 있습니다.

public void runJar(File jar, String mainClass, File inputDir, File outputDir); 

, 나는 당신의 명령 줄에서 호출하는 것입니다 org.apache.hadoop.util.RunJar.main(String[])를 호출하고이 작업을 수행하려면 : 나는 다음과 같은 방법을 구현해야하는 프로그램 (의 드라이버를 부르 자)이있다. 이것은 커맨드 라인에서 당신이 운전사를 달리는 경우에 중대한 만 작동한다.

드라이버가 Tomcat 또는 Jetty와 같은 컨테이너 내부에서 실행되는 경우 문제가 발생합니다. 당신은

java.lang.ClassNotFoundException: org.apache.hadoop.fs.Path 

이 때문에 클래스 로더와 방법 RunJar 놨입니다 같은 오류를 얻을 수 있습니다. 다음과 같이 수동으로 클래스 로더를 생성해야합니다.

final ClassLoader original = Thread.currentThread().getContextClassLoader(); 
try { 
    URL[] urls = new URL[] { jar.toURI().toURL() }; 
    ClassLoader loader = new URLClassLoader(urls, originalLoader); 
    Thread.currentThread().setContextClassLoader(loader); 

    Class<?> mainClass = Class.forName(driverClass, true, loader); 
    Class[] argTypes = new Class[]{ Array.newInstance(String.class, 0).getClass()}; 
    Method main = mainClass.getMethod("main", argTypes); 
    main.invoke(null, new Object[] { args }); 
} finally { 
    Thread.currentThread().setContextClassLoader(original); 
} 
관련 문제