org.apache.drill.yarn.client.StatusCommand.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.drill.yarn.client.StatusCommand.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.drill.yarn.client;

import org.apache.drill.yarn.core.DoYUtil;
import org.apache.drill.yarn.core.YarnClientException;
import org.apache.drill.yarn.core.YarnRMClient;
import org.apache.hadoop.yarn.api.records.ApplicationReport;
import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class StatusCommand extends ClientCommand {
    public static class Reporter {
        private YarnRMClient client;
        ApplicationReport report;

        public Reporter(YarnRMClient client) {
            this.client = client;
        }

        public void getReport() throws ClientException {
            try {
                report = client.getAppReport();
            } catch (YarnClientException e) {
                throw new ClientException("Failed to get report for Drill application master", e);
            }
        }

        public void display(boolean verbose, boolean isNew) {
            YarnApplicationState state = report.getYarnApplicationState();
            if (verbose || !isNew) {
                System.out.println("Application State: " + state.toString());
                System.out.println("Host: " + report.getHost());
            }
            if (verbose || !isNew) {
                System.out.println("Queue: " + report.getQueue());
                System.out.println("User: " + report.getUser());
                long startTime = report.getStartTime();
                System.out.println("Start Time: " + DoYUtil.toIsoTime(startTime));
                System.out.println("Application Name: " + report.getName());
            }
            System.out.println("Tracking URL: " + report.getTrackingUrl());
            if (isNew) {
                System.out.println("Application Master URL: " + getAmUrl());
            }
            showFinalStatus();
        }

        public String getAmUrl() {
            return StatusCommand.getAmUrl(report);
        }

        public void showFinalStatus() {
            YarnApplicationState state = report.getYarnApplicationState();
            if (state == YarnApplicationState.FAILED || state == YarnApplicationState.FINISHED) {
                FinalApplicationStatus status = report.getFinalApplicationStatus();
                System.out.println("Final status: " + status.toString());
                if (status != FinalApplicationStatus.SUCCEEDED) {
                    String diag = report.getDiagnostics();
                    if (!DoYUtil.isBlank(diag)) {
                        System.out.println("Diagnostics: " + diag);
                    }
                }
            }
        }

        public YarnApplicationState getState() {
            return report.getYarnApplicationState();
        }

        public boolean isStarting() {
            YarnApplicationState state = getState();
            return state == YarnApplicationState.ACCEPTED || state == YarnApplicationState.NEW
                    || state == YarnApplicationState.NEW_SAVING || state == YarnApplicationState.SUBMITTED;
        }

        public boolean isStopped() {
            YarnApplicationState state = getState();
            return state == YarnApplicationState.FAILED || state == YarnApplicationState.FINISHED
                    || state == YarnApplicationState.KILLED;
        }

        public boolean isRunning() {
            YarnApplicationState state = getState();
            return state == YarnApplicationState.RUNNING;
        }
    }

    public static String getAmUrl(ApplicationReport report) {
        return DoYUtil.unwrapAmUrl(report.getOriginalTrackingUrl());
    }

    @Override
    public void run() throws ClientException {
        YarnRMClient client = getClient();
        System.out.println("Application ID: " + client.getAppId().toString());
        Reporter reporter = new Reporter(client);
        try {
            reporter.getReport();
        } catch (Exception e) {
            removeAppIdFile();
            System.out.println("Application is not running.");
            return;
        }
        reporter.display(opts.verbose, false);
        if (reporter.isRunning()) {
            showAmStatus(reporter.report);
        }
    }

    private void showAmStatus(ApplicationReport report) {
        try {
            String baseUrl = getAmUrl(report);
            if (DoYUtil.isBlank(baseUrl)) {
                return;
            }
            SimpleRestClient restClient = new SimpleRestClient();
            String tail = "rest/status";
            if (opts.verbose) {
                System.out.println("Getting status with " + baseUrl + "/" + tail);
            }
            String result = restClient.send(baseUrl, tail, false);
            formatResponse(result);
            System.out.println("For more information, visit: " + baseUrl);
        } catch (ClientException e) {
            System.out.println("Failed to get AM status");
            System.err.println(e.getMessage());
        }
    }

    private void formatResponse(String result) {
        JSONParser parser = new JSONParser();
        Object status;
        try {
            status = parser.parse(result);
        } catch (ParseException e) {
            System.err.println("Invalid response received from AM");
            if (opts.verbose) {
                System.out.println(result);
                System.out.println(e.getMessage());
            }
            return;
        }
        JSONObject root = (JSONObject) status;
        showMetric("AM State", root, "state");
        showMetric("Target Drillbit Count", root.get("summary"), "targetBitCount");
        showMetric("Live Drillbit Count", root.get("summary"), "liveBitCount");
        showMetric("Unmanaged Drillbit Count", root.get("summary"), "unmanagedCount");
        showMetric("Blacklisted Node Count", root.get("summary"), "blackListCount");
        showMetric("Free Node Count", root.get("summary"), "freeNodeCount");
    }

    private void showMetric(String label, Object object, String key) {
        if (object == null) {
            return;
        }
        if (!(object instanceof JSONObject)) {
            return;
        }
        object = ((JSONObject) object).get(key);
        if (object == null) {
            return;
        }
        System.out.println(label + ": " + object.toString());
    }
}