Skip to content

Commit

Permalink
Upgraded CDP Libs for Ozone Client Integration. Cleaning up stats. pr…
Browse files Browse the repository at this point in the history
…ep for scheduler runs.
  • Loading branch information
dstreev committed Mar 28, 2023
1 parent 89bbf4d commit 1a02053
Show file tree
Hide file tree
Showing 10 changed files with 687 additions and 79 deletions.
10 changes: 5 additions & 5 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.cloudera.utils.hadoop</groupId>
<artifactId>hadoop-cli</artifactId>
<version>2.4.1.0</version>
<version>2.4.3.0</version>
<name>Hadoop CLI</name>
<description>Hadoop Command Line Interface</description>
<properties>
Expand Down Expand Up @@ -50,8 +50,8 @@
<commons-lang.version>3.12.0</commons-lang.version>

<hadoop.version>3.1.1</hadoop.version>
<ozone.version>1.1.0</ozone.version>
<cdp.version>7.1.7.1000-141</cdp.version>
<ozone.version>1.2.0</ozone.version>
<cdp.version>7.1.8.8-3</cdp.version>

<gateway-shell.version>1.0.0</gateway-shell.version>
<jline.version>2.5</jline.version>
Expand Down Expand Up @@ -92,8 +92,8 @@
<version>${hadoop.version}.${cdp.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-ozone-filesystem-hadoop3</artifactId>
<groupId>org.apache.ozone</groupId>
<artifactId>ozone-filesystem-hadoop3</artifactId>
<version>${ozone.version}.${cdp.version}</version>
</dependency>
<dependency>
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/com/cloudera/utils/hadoop/HadoopSession.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
import com.cloudera.utils.hadoop.shell.commands.Exit;
import com.cloudera.utils.hadoop.shell.commands.Help;
import com.cloudera.utils.hadoop.shell.commands.HistoryCmd;
import com.cloudera.utils.hadoop.yarn.ContainerStats;
import com.cloudera.utils.hadoop.yarn.SchedulerStats;
import com.cloudera.utils.hadoop.yarn.ContainerStatsCommand;
import com.cloudera.utils.hadoop.yarn.SchedulerStatsCommand;
import org.apache.commons.cli.*;

import java.io.*;
Expand Down Expand Up @@ -581,8 +581,8 @@ public void initialize() throws Exception {
// getEnv().addCommand(new JhsStats("jhsstat", getEnv(), Direction.NONE));

// Yarn Tools
getEnv().addCommand(new ContainerStats("cstat", getEnv(), Direction.NONE));
getEnv().addCommand(new SchedulerStats("sstat", getEnv(), Direction.NONE));
getEnv().addCommand(new ContainerStatsCommand("cstat", getEnv(), Direction.NONE));
getEnv().addCommand(new SchedulerStatsCommand("sstat", getEnv(), Direction.NONE));

getEnv().addCommand(new Exit("exit"));
getEnv().addCommand(new LocalLs("lls", getEnv()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public abstract class AbstractShell implements Shell {
private String bannerResource = "/banner.txt";
private boolean apiMode = false;

protected Environment getEnv() {
public Environment getEnv() {
return env;
}

Expand Down
99 changes: 62 additions & 37 deletions src/main/java/com/cloudera/utils/hadoop/yarn/ContainerStats.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,12 @@

package com.cloudera.utils.hadoop.yarn;

import com.cloudera.utils.hadoop.AbstractQueryTimeFrameStats;
import com.cloudera.utils.hadoop.hdfs.shell.command.Direction;
import com.cloudera.utils.hadoop.shell.Environment;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionGroup;
import org.apache.commons.cli.Options;
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;

import java.io.IOException;
import java.net.MalformedURLException;
Expand All @@ -38,7 +39,8 @@
* Using the Resource Manager JMX, collect the stats on applications since the last time this was run or up to
* 'n' (limit).
*/
public class ContainerStats extends AbstractQueryTimeFrameStats {
public class ContainerStats extends ResourceManagerStats {
public static final String URL_PATH = "/ws/v1/cluster/apps";
public static final String APP = "app";
// Not helpful for workload analysis. Leaving out for now.
public static final String ATTEMPT = "attempt";
Expand Down Expand Up @@ -67,34 +69,23 @@ public class ContainerStats extends AbstractQueryTimeFrameStats {
recordFieldMap.put(ATTEMPT, APP_ATTEMPT_FIELDS);
}

public ContainerStats(String name) {
super(name);
public Map<String, String[]> getRecordFieldMap() {
return recordFieldMap;
}

@Override
public String getDescription() {
return "Collect Container Stats from the YARN REST API";
}

public ContainerStats(String name, Environment env, Direction directionContext) {
super(name, env, directionContext);
}

public ContainerStats(String name, Environment env, Direction directionContext, int directives) {
super(name, env, directionContext, directives);
public ContainerStats(Configuration configuration) {
super(configuration);
}

public ContainerStats(String name, Environment env, Direction directionContext, int directives, boolean directivesBefore, boolean directivesOptional) {
super(name, env, directionContext, directives, directivesBefore, directivesOptional);
public ContainerStats() {
}

public ContainerStats(String name, Environment env) {
super(name, env);
// @Override
public String getDescription() {
return "Collect Application Container Stats from the YARN REST API";
}

@Override
public void process(CommandLine cmdln) {

public void execute() {
String baseRMUrlStr = getResourceManagerWebAddress();
// Test with Call.
// if (ResourceManagerResolvable(baseRMUrlStr)) {
Expand All @@ -104,9 +95,9 @@ public void process(CommandLine cmdln) {

System.out.println("Resource Manager Server URL: " + baseRMUrlStr);

String rootPath = baseRMUrlStr + "/ws/v1/cluster/apps";
String rootPath = baseRMUrlStr + URL_PATH;

Map<String, String> queries = getQueries(cmdln);
Map<String, String> queries = getQueries();

Iterator<Map.Entry<String, String>> iQ = queries.entrySet().iterator();

Expand All @@ -123,7 +114,7 @@ public void process(CommandLine cmdln) {
String appsJson = IOUtils.toString(appsConnection.getInputStream(), StandardCharsets.UTF_8);

if (raw) {
print(APP + "_raw", appsJson);
// print(APP + "_raw", appsJson);
} else {
YarnAppRecordConverter yarnRc = new YarnAppRecordConverter();

Expand Down Expand Up @@ -157,25 +148,59 @@ public void process(CommandLine cmdln) {
ioe.printStackTrace();
}

if (!raw) {
Iterator<Map.Entry<String, List<Map<String, Object>>>> rIter = getRecords().entrySet().iterator();
while (rIter.hasNext()) {
Map.Entry<String, List<Map<String, Object>>> recordSet = rIter.next();
print(recordSet.getKey(), recordFieldMap.get(recordSet.getKey()), recordSet.getValue());
}
}
clearCache();
// if (!raw) {
// Iterator<Map.Entry<String, List<Map<String, Object>>>> rIter = getRecords().entrySet().iterator();
// while (rIter.hasNext()) {
// Map.Entry<String, List<Map<String, Object>>> recordSet = rIter.next();
// }
// }
}

}
// @Override
public void process(CommandLine cmdln) {
init(cmdln);
execute();
}

protected void getHelp() {
StringBuilder sb = new StringBuilder();
sb.append("Collect Container Stats for the YARN REST API.").append("\n");

sb.append("Collect Application Container Stats for the YARN REST API.").append("\n");

System.out.println(sb.toString());
}

@Override
public Options getOptions() {
Options options = super.getOptions();

OptionGroup beginOptionGroup = new OptionGroup();
Option startOption = new Option("s", "start", true,
"Start time for retrieval in 'yyyy-MM-dd HH:mm:ss'");
startOption.setRequired(false);
beginOptionGroup.addOption(startOption);

Option lastOption = new Option("l", "last", true,
"last x-DAY(S)|x-HOUR(S)|x-MIN(S). 1-HOUR=1 hour, 2-DAYS=2 days, 3-HOURS=3 hours, etc.");
lastOption.setRequired(false);
beginOptionGroup.addOption(lastOption);

options.addOptionGroup(beginOptionGroup);

// TODO: WIP for current stats.
// Option currentOption = new Option("c", "current", false, "Get Current / Active Records");
// currentOption.setRequired(false);
// beginOptionGroup.addOption(currentOption);

Option endOption = new Option("e", "end", true,
"End time for retrieval in 'yyyy-MM-dd HH:mm:ss'");
endOption.setRequired(false);
options.addOption(endOption);

Option incOption = new Option("inc", "increment", true, "Query Increment in minutes");
incOption.setRequired(false);
options.addOption(incOption);

return options;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*
* Copyright (c) 2022. David W. Streever All Rights Reserved
*
* Licensed 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 com.cloudera.utils.hadoop.yarn;

import com.cloudera.utils.hadoop.AbstractStats;
import com.cloudera.utils.hadoop.hdfs.shell.command.Direction;
import com.cloudera.utils.hadoop.shell.Environment;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionGroup;
import org.apache.commons.cli.Options;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
* Created by streever on 2016-04-25.
* <p>
* Using the Resource Manager JMX, collect the stats on applications since the last time this was run or up to
* 'n' (limit).
*/
public class ContainerStatsCommand extends AbstractStats {

private ContainerStats containerStats = null;
@Override
public String getDescription() {
return "Collect Container Stats from the YARN REST API";
}

public ContainerStatsCommand(String name, Environment env, Direction directionContext) {
super(name, env, directionContext);
// appStats = new ContainerStatsImpl(env.getConfig());
}

public ContainerStatsCommand(String name, Environment env, Direction directionContext, int directives) {
super(name, env, directionContext, directives);
}

public ContainerStatsCommand(String name, Environment env, Direction directionContext, int directives, boolean directivesBefore, boolean directivesOptional) {
super(name, env, directionContext, directives, directivesBefore, directivesOptional);
}

public ContainerStatsCommand(String name, Environment env) {
super(name, env);
}

protected ContainerStats getContainerStats() {
if (containerStats == null)
containerStats = new ContainerStats(env.getConfig());
return containerStats;
}
@Override
public void process(CommandLine cmdln) {
getContainerStats().process(cmdln);
Iterator<Map.Entry<String, List<Map<String, Object>>>> rIter = getContainerStats().getRecords().entrySet().iterator();
while (rIter.hasNext()) {
Map.Entry<String, List<Map<String, Object>>> recordSet = rIter.next();
print(recordSet.getKey(), getContainerStats().getRecordFieldMap().get(recordSet.getKey()), recordSet.getValue());
}
getContainerStats().clearCache();
}

@Override
public Options getOptions() {
Options options = super.getOptions();
Options csOptions = getContainerStats().getOptions();
for (Object option: csOptions.getOptions()) {
if (option instanceof Option) {
options.addOption((Option)option);
} else if (option instanceof OptionGroup) {
options.addOptionGroup((OptionGroup)option);
}
}
return options;
}

protected void getHelp() {
StringBuilder sb = new StringBuilder();
sb.append("Collect Container Stats for the YARN REST API.").append("\n");

System.out.println(sb.toString());
}


}
Loading

0 comments on commit 1a02053

Please sign in to comment.