복붙노트

[HADOOP] java에서 yarn api로 mapreduce 작업을 제출하는 방법

HADOOP

java에서 yarn api로 mapreduce 작업을 제출하는 방법

YARN java API를 사용하여 MR 작업을 제출하고 싶습니다. WritingYarnApplications와 같이하려고하지만 amContainer를 추가 해야할지 모르겠습니다. 아래는 내가 작성한 코드입니다.

package org.apache.hadoop.examples;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.yarn.api.protocolrecords.GetNewApplicationResponse;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
import org.apache.hadoop.yarn.api.records.ContainerLaunchContext;
import org.apache.hadoop.yarn.api.records.Resource;
import org.apache.hadoop.yarn.client.api.YarnClient;
import org.apache.hadoop.yarn.client.api.YarnClientApplication;
import org.apache.hadoop.yarn.util.Records;
import org.mortbay.util.ajax.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class YarnJob {
    private static Logger logger = LoggerFactory.getLogger(YarnJob.class);

    public static void main(String[] args) throws Throwable {

        Configuration conf = new Configuration();
        YarnClient client = YarnClient.createYarnClient();
        client.init(conf);
        client.start();

        System.out.println(JSON.toString(client.getAllQueues()));
        System.out.println(JSON.toString(client.getConfig()));
        //System.out.println(JSON.toString(client.getApplications()));
        System.out.println(JSON.toString(client.getYarnClusterMetrics()));

        YarnClientApplication app = client.createApplication();
        GetNewApplicationResponse appResponse = app.getNewApplicationResponse();

        ApplicationId appId = appResponse.getApplicationId();

        // Create launch context for app master
        ApplicationSubmissionContext appContext = Records.newRecord(ApplicationSubmissionContext.class);
        // set the application id
        appContext.setApplicationId(appId);
        // set the application name
        appContext.setApplicationName("test");
        // Set the queue to which this application is to be submitted in the RM
        appContext.setQueue("default");

        // Set up the container launch context for the application master
        ContainerLaunchContext amContainer = Records.newRecord(ContainerLaunchContext.class);
        //amContainer.setLocalResources();
        //amContainer.setCommands();
        //amContainer.setEnvironment();

        appContext.setAMContainerSpec(amContainer);
        appContext.setResource(Resource.newInstance(1024, 1));

        appContext.setApplicationType("MAPREDUCE");

        // Submit the application to the applications manager
        client.submitApplication(appContext);
        //client.stop();
    }
}

명령 인터페이스를 사용하여 mapreduce 작업을 올바르게 실행할 수 있습니다.

hadoop jar wordcount.jar org.apache.hadoop.examples.WordCount /user/admin/input /user/admin/output/

그러나이 워드 카운트 작업을 실 자바 API로 제출하려면 어떻게해야합니까?

해결법

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

    1.Yarn 클라이언트를 사용하여 작업을 제출하지 않고 MapReduce API를 사용하여 작업을 제출하십시오. 예제는이 링크를 참조하십시오

    Yarn 클라이언트를 사용하여 작업을 제출하지 않고 MapReduce API를 사용하여 작업을 제출하십시오. 예제는이 링크를 참조하십시오

    그러나 완료 상태, 매퍼 단계 상태, 감속기 단계 상태 등의 작업에 대한 제어가 더 필요한 경우 다음을 사용할 수 있습니다.

    job.submit();
    

    대신에

    job.waitForCompletion(true)
    

    job.mapProgress () 및 job.reduceProgress () 함수를 사용하여 상태를 얻을 수 있습니다. 작업 개체에는 탐색 할 수있는 많은 기능이 있습니다.

    에 관한 질문까지

    hadoop jar wordcount.jar org.apache.hadoop.examples.WordCount /user/admin/input /user/admin/output/
    

    여기서 일어나는 일은 wordcount.jar에서 제공되는 드라이버 프로그램을 실행하는 것입니다. "java -jar wordcount.jar"대신 "hadoop jar wordcount.jar"을 사용하고 있습니다. "yarn jar wordcount.jar"을 사용할 수도 있습니다. Hadoop / Yarn은 java -jar 명령과 비교하여 필요한 추가 클래스 경로를 설정합니다. 명령에 지정된대로 클래스 org.apache.hadoop.examples.WordCount에서 사용 가능한 드라이버 프로그램의 "main ()"을 실행합니다.

    여기에서 소스를 확인할 수 있습니다. WordCount 클래스의 소스

    내가 원사를 통해 일자리를 제출한다고 가정하는 유일한 이유는 특정 이벤트에서 MapReduce2 작업을 시작하는 일종의 서비스와 통합하는 것입니다.

    이를 위해 항상 드라이버 main ()을 이와 같이 가질 수 있습니다.

    public class MyMapReduceDriver extends Configured implements Tool {
    public static void main(String[] args) throws Exception {
    
        Configuration conf = new Configuration();
    
        /******/
    
        int errCode = ToolRunner.run(conf, new MyMapReduceDriver(), args);
    
        System.exit(errCode);
    }
    
    @Override
    public int run(String[] args) throws Exception {
    
        while(true) {
    
            try{
    
                runMapReduceJob();
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }
    
    private void runMapReduceJob() {
    
        Configuration conf = new Configuration();
        Job job = new Job(conf, "word count");
        /******/
    
        job.submit();
    
        // Get status
        while(job.getJobState()==RUNNING || job.getJobState()==PREP){
            Thread.sleep(1000);
    
            System.out.println(" Map: "+ StringUtils.formatPercent(job.mapProgress(), 0) + " Reducer: "+ StringUtils.formatPercent(job.reduceProgress(), 0));
    
        }
    }}
    

    이것이 도움이되기를 바랍니다.

  2. from https://stackoverflow.com/questions/47767854/how-to-submit-mapreduce-job-with-yarn-api-in-java by cc-by-sa and MIT license