YARN-2123. Progress bars in Web UI always at 100% due to non-US locale.
Contributed by Akira AJISAKA
This commit is contained in:
parent
9b01f81eb8
commit
b7dd3a4f04
|
@ -18,7 +18,6 @@
|
||||||
|
|
||||||
package org.apache.hadoop.mapreduce.v2.app.webapp;
|
package org.apache.hadoop.mapreduce.v2.app.webapp;
|
||||||
|
|
||||||
import static org.apache.hadoop.yarn.util.StringHelper.percent;
|
|
||||||
import static org.apache.hadoop.yarn.webapp.view.JQueryUI.ACCORDION;
|
import static org.apache.hadoop.yarn.webapp.view.JQueryUI.ACCORDION;
|
||||||
import static org.apache.hadoop.yarn.webapp.view.JQueryUI.DATATABLES;
|
import static org.apache.hadoop.yarn.webapp.view.JQueryUI.DATATABLES;
|
||||||
import static org.apache.hadoop.yarn.webapp.view.JQueryUI.DATATABLES_ID;
|
import static org.apache.hadoop.yarn.webapp.view.JQueryUI.DATATABLES_ID;
|
||||||
|
@ -31,6 +30,7 @@ import org.apache.commons.lang.StringEscapeUtils;
|
||||||
import org.apache.hadoop.mapreduce.v2.app.job.TaskAttempt;
|
import org.apache.hadoop.mapreduce.v2.app.job.TaskAttempt;
|
||||||
import org.apache.hadoop.mapreduce.v2.app.webapp.dao.TaskAttemptInfo;
|
import org.apache.hadoop.mapreduce.v2.app.webapp.dao.TaskAttemptInfo;
|
||||||
import org.apache.hadoop.mapreduce.v2.util.MRWebAppUtil;
|
import org.apache.hadoop.mapreduce.v2.util.MRWebAppUtil;
|
||||||
|
import org.apache.hadoop.util.StringUtils;
|
||||||
import org.apache.hadoop.yarn.webapp.SubView;
|
import org.apache.hadoop.yarn.webapp.SubView;
|
||||||
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
|
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
|
||||||
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TABLE;
|
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TABLE;
|
||||||
|
@ -77,7 +77,7 @@ public class TaskPage extends AppView {
|
||||||
|
|
||||||
for (TaskAttempt attempt : getTaskAttempts()) {
|
for (TaskAttempt attempt : getTaskAttempts()) {
|
||||||
TaskAttemptInfo ta = new TaskAttemptInfo(attempt, true);
|
TaskAttemptInfo ta = new TaskAttemptInfo(attempt, true);
|
||||||
String progress = percent(ta.getProgress() / 100);
|
String progress = StringUtils.formatPercent(ta.getProgress() / 100, 2);
|
||||||
|
|
||||||
String nodeHttpAddr = ta.getNode();
|
String nodeHttpAddr = ta.getNode();
|
||||||
String diag = ta.getNote() == null ? "" : ta.getNote();
|
String diag = ta.getNote() == null ? "" : ta.getNote();
|
||||||
|
|
|
@ -21,7 +21,6 @@ package org.apache.hadoop.mapreduce.v2.app.webapp;
|
||||||
import static org.apache.hadoop.mapreduce.v2.app.webapp.AMParams.TASK_STATE;
|
import static org.apache.hadoop.mapreduce.v2.app.webapp.AMParams.TASK_STATE;
|
||||||
import static org.apache.hadoop.mapreduce.v2.app.webapp.AMParams.TASK_TYPE;
|
import static org.apache.hadoop.mapreduce.v2.app.webapp.AMParams.TASK_TYPE;
|
||||||
import static org.apache.hadoop.yarn.util.StringHelper.join;
|
import static org.apache.hadoop.yarn.util.StringHelper.join;
|
||||||
import static org.apache.hadoop.yarn.util.StringHelper.percent;
|
|
||||||
import static org.apache.hadoop.yarn.webapp.view.JQueryUI.C_PROGRESSBAR;
|
import static org.apache.hadoop.yarn.webapp.view.JQueryUI.C_PROGRESSBAR;
|
||||||
import static org.apache.hadoop.yarn.webapp.view.JQueryUI.C_PROGRESSBAR_VALUE;
|
import static org.apache.hadoop.yarn.webapp.view.JQueryUI.C_PROGRESSBAR_VALUE;
|
||||||
|
|
||||||
|
@ -30,6 +29,7 @@ import org.apache.hadoop.mapreduce.v2.api.records.TaskType;
|
||||||
import org.apache.hadoop.mapreduce.v2.app.job.Task;
|
import org.apache.hadoop.mapreduce.v2.app.job.Task;
|
||||||
import org.apache.hadoop.mapreduce.v2.app.webapp.dao.TaskInfo;
|
import org.apache.hadoop.mapreduce.v2.app.webapp.dao.TaskInfo;
|
||||||
import org.apache.hadoop.mapreduce.v2.util.MRApps;
|
import org.apache.hadoop.mapreduce.v2.util.MRApps;
|
||||||
|
import org.apache.hadoop.util.StringUtils;
|
||||||
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
|
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
|
||||||
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TABLE;
|
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TABLE;
|
||||||
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TBODY;
|
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TBODY;
|
||||||
|
@ -94,7 +94,7 @@ public class TasksBlock extends HtmlBlock {
|
||||||
|
|
||||||
TaskInfo info = new TaskInfo(task);
|
TaskInfo info = new TaskInfo(task);
|
||||||
String tid = info.getId();
|
String tid = info.getId();
|
||||||
String pct = percent(info.getProgress() / 100);
|
String pct = StringUtils.formatPercent(info.getProgress() / 100, 2);
|
||||||
tasksTableData.append("[\"<a href='").append(url("task", tid))
|
tasksTableData.append("[\"<a href='").append(url("task", tid))
|
||||||
.append("'>").append(tid).append("</a>\",\"")
|
.append("'>").append(tid).append("</a>\",\"")
|
||||||
//Progress bar
|
//Progress bar
|
||||||
|
|
|
@ -17,8 +17,6 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hadoop.mapreduce.v2.app.webapp.dao;
|
package org.apache.hadoop.mapreduce.v2.app.webapp.dao;
|
||||||
|
|
||||||
import static org.apache.hadoop.yarn.util.StringHelper.percent;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -39,6 +37,7 @@ import org.apache.hadoop.mapreduce.v2.app.job.TaskAttempt;
|
||||||
import org.apache.hadoop.mapreduce.v2.util.MRApps;
|
import org.apache.hadoop.mapreduce.v2.util.MRApps;
|
||||||
import org.apache.hadoop.mapreduce.v2.util.MRApps.TaskAttemptStateUI;
|
import org.apache.hadoop.mapreduce.v2.util.MRApps.TaskAttemptStateUI;
|
||||||
import org.apache.hadoop.security.authorize.AccessControlList;
|
import org.apache.hadoop.security.authorize.AccessControlList;
|
||||||
|
import org.apache.hadoop.util.StringUtils;
|
||||||
import org.apache.hadoop.yarn.util.Times;
|
import org.apache.hadoop.yarn.util.Times;
|
||||||
|
|
||||||
@XmlRootElement(name = "job")
|
@XmlRootElement(name = "job")
|
||||||
|
@ -102,11 +101,13 @@ public class JobInfo {
|
||||||
this.mapsTotal = job.getTotalMaps();
|
this.mapsTotal = job.getTotalMaps();
|
||||||
this.mapsCompleted = job.getCompletedMaps();
|
this.mapsCompleted = job.getCompletedMaps();
|
||||||
this.mapProgress = report.getMapProgress() * 100;
|
this.mapProgress = report.getMapProgress() * 100;
|
||||||
this.mapProgressPercent = percent(report.getMapProgress());
|
this.mapProgressPercent =
|
||||||
|
StringUtils.formatPercent(report.getMapProgress(), 2);
|
||||||
this.reducesTotal = job.getTotalReduces();
|
this.reducesTotal = job.getTotalReduces();
|
||||||
this.reducesCompleted = job.getCompletedReduces();
|
this.reducesCompleted = job.getCompletedReduces();
|
||||||
this.reduceProgress = report.getReduceProgress() * 100;
|
this.reduceProgress = report.getReduceProgress() * 100;
|
||||||
this.reduceProgressPercent = percent(report.getReduceProgress());
|
this.reduceProgressPercent =
|
||||||
|
StringUtils.formatPercent(report.getReduceProgress(), 2);
|
||||||
|
|
||||||
this.acls = new ArrayList<ConfEntryInfo>();
|
this.acls = new ArrayList<ConfEntryInfo>();
|
||||||
if (hasAccess) {
|
if (hasAccess) {
|
||||||
|
|
|
@ -310,6 +310,9 @@ Release 2.8.0 - UNRELEASED
|
||||||
YARN-3552. RM Web UI shows -1 running containers for completed apps
|
YARN-3552. RM Web UI shows -1 running containers for completed apps
|
||||||
(Rohith via jlowe)
|
(Rohith via jlowe)
|
||||||
|
|
||||||
|
YARN-2123. Progress bars in Web UI always at 100% due to non-US locale.
|
||||||
|
(Akira AJISAKA via xgong)
|
||||||
|
|
||||||
Release 2.7.1 - UNRELEASED
|
Release 2.7.1 - UNRELEASED
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -174,9 +174,4 @@ public final class StringHelper {
|
||||||
}
|
}
|
||||||
sb.append(part);
|
sb.append(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String percent(double value) {
|
|
||||||
return String.format("%.2f", value * 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ import org.apache.commons.lang.StringEscapeUtils;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.apache.hadoop.security.UserGroupInformation;
|
import org.apache.hadoop.security.UserGroupInformation;
|
||||||
|
import org.apache.hadoop.util.StringUtils;
|
||||||
import org.apache.hadoop.yarn.api.ApplicationBaseProtocol;
|
import org.apache.hadoop.yarn.api.ApplicationBaseProtocol;
|
||||||
import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationsRequest;
|
import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationsRequest;
|
||||||
import org.apache.hadoop.yarn.api.records.ApplicationReport;
|
import org.apache.hadoop.yarn.api.records.ApplicationReport;
|
||||||
|
@ -123,7 +124,7 @@ public class AppsBlock extends HtmlBlock {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
AppInfo app = new AppInfo(appReport);
|
AppInfo app = new AppInfo(appReport);
|
||||||
String percent = String.format("%.1f", app.getProgress());
|
String percent = StringUtils.format("%.1f", app.getProgress());
|
||||||
appsTableData
|
appsTableData
|
||||||
.append("[\"<a href='")
|
.append("[\"<a href='")
|
||||||
.append(url("app", app.getAppId()))
|
.append(url("app", app.getAppId()))
|
||||||
|
|
|
@ -63,7 +63,7 @@ public class ResourceWeights {
|
||||||
}
|
}
|
||||||
ResourceType resourceType = ResourceType.values()[i];
|
ResourceType resourceType = ResourceType.values()[i];
|
||||||
sb.append(StringUtils.toLowerCase(resourceType.name()));
|
sb.append(StringUtils.toLowerCase(resourceType.name()));
|
||||||
sb.append(String.format(" weight=%.1f", getWeight(resourceType)));
|
sb.append(StringUtils.format(" weight=%.1f", getWeight(resourceType)));
|
||||||
}
|
}
|
||||||
sb.append(">");
|
sb.append(">");
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
|
|
|
@ -94,7 +94,8 @@ class CapacitySchedulerPage extends RmView {
|
||||||
_("Configured Capacity:", percent(lqinfo.getCapacity() / 100)).
|
_("Configured Capacity:", percent(lqinfo.getCapacity() / 100)).
|
||||||
_("Configured Max Capacity:", percent(lqinfo.getMaxCapacity() / 100)).
|
_("Configured Max Capacity:", percent(lqinfo.getMaxCapacity() / 100)).
|
||||||
_("Configured Minimum User Limit Percent:", Integer.toString(lqinfo.getUserLimit()) + "%").
|
_("Configured Minimum User Limit Percent:", Integer.toString(lqinfo.getUserLimit()) + "%").
|
||||||
_("Configured User Limit Factor:", String.format("%.1f", lqinfo.getUserLimitFactor())).
|
_("Configured User Limit Factor:", StringUtils.format(
|
||||||
|
"%.1f", lqinfo.getUserLimitFactor())).
|
||||||
_("Accessible Node Labels:", StringUtils.join(",", lqinfo.getNodeLabels())).
|
_("Accessible Node Labels:", StringUtils.join(",", lqinfo.getNodeLabels())).
|
||||||
_("Ordering Policy: ", lqinfo.getOrderingPolicyInfo()).
|
_("Ordering Policy: ", lqinfo.getOrderingPolicyInfo()).
|
||||||
_("Preemption:", lqinfo.getPreemptionDisabled() ? "disabled" : "enabled");
|
_("Preemption:", lqinfo.getPreemptionDisabled() ? "disabled" : "enabled");
|
||||||
|
@ -432,14 +433,14 @@ class CapacitySchedulerPage extends RmView {
|
||||||
}
|
}
|
||||||
|
|
||||||
static String percent(float f) {
|
static String percent(float f) {
|
||||||
return String.format("%.1f%%", f * 100);
|
return StringUtils.formatPercent(f, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static String width(float f) {
|
static String width(float f) {
|
||||||
return String.format("width:%.1f%%", f * 100);
|
return StringUtils.format("width:%.1f%%", f * 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
static String left(float f) {
|
static String left(float f) {
|
||||||
return String.format("left:%.1f%%", f * 100);
|
return StringUtils.format("left:%.1f%%", f * 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ package org.apache.hadoop.yarn.server.resourcemanager.webapp;
|
||||||
|
|
||||||
import static org.apache.hadoop.yarn.util.StringHelper.join;
|
import static org.apache.hadoop.yarn.util.StringHelper.join;
|
||||||
|
|
||||||
|
import org.apache.hadoop.util.StringUtils;
|
||||||
import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
|
import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
|
||||||
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler;
|
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler;
|
||||||
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.FifoSchedulerInfo;
|
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.FifoSchedulerInfo;
|
||||||
|
@ -149,14 +150,14 @@ class DefaultSchedulerPage extends RmView {
|
||||||
}
|
}
|
||||||
|
|
||||||
static String percent(float f) {
|
static String percent(float f) {
|
||||||
return String.format("%.1f%%", f * 100);
|
return StringUtils.formatPercent(f, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static String width(float f) {
|
static String width(float f) {
|
||||||
return String.format("width:%.1f%%", f * 100);
|
return StringUtils.format("width:%.1f%%", f * 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
static String left(float f) {
|
static String left(float f) {
|
||||||
return String.format("left:%.1f%%", f * 100);
|
return StringUtils.format("left:%.1f%%", f * 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ import java.util.concurrent.ConcurrentMap;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringEscapeUtils;
|
import org.apache.commons.lang.StringEscapeUtils;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.util.StringUtils;
|
||||||
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
|
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
|
||||||
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
||||||
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
|
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
|
||||||
|
@ -110,7 +111,7 @@ public class FairSchedulerAppsBlock extends HtmlBlock {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
AppInfo appInfo = new AppInfo(rm, app, true, WebAppUtils.getHttpSchemePrefix(conf));
|
AppInfo appInfo = new AppInfo(rm, app, true, WebAppUtils.getHttpSchemePrefix(conf));
|
||||||
String percent = String.format("%.1f", appInfo.getProgress());
|
String percent = StringUtils.format("%.1f", appInfo.getProgress());
|
||||||
ApplicationAttemptId attemptId = app.getCurrentAppAttempt().getAppAttemptId();
|
ApplicationAttemptId attemptId = app.getCurrentAppAttempt().getAppAttemptId();
|
||||||
int fairShare = fsinfo.getAppFairShare(attemptId);
|
int fairShare = fsinfo.getAppFairShare(attemptId);
|
||||||
if (fairShare == FairSchedulerInfo.INVALID_FAIR_SHARE) {
|
if (fairShare == FairSchedulerInfo.INVALID_FAIR_SHARE) {
|
||||||
|
|
|
@ -22,6 +22,7 @@ import static org.apache.hadoop.yarn.util.StringHelper.join;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.apache.hadoop.util.StringUtils;
|
||||||
import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
|
import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
|
||||||
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler;
|
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler;
|
||||||
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.FairSchedulerInfo;
|
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.FairSchedulerInfo;
|
||||||
|
@ -241,14 +242,14 @@ public class FairSchedulerPage extends RmView {
|
||||||
}
|
}
|
||||||
|
|
||||||
static String percent(float f) {
|
static String percent(float f) {
|
||||||
return String.format("%.1f%%", f * 100);
|
return StringUtils.formatPercent(f, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static String width(float f) {
|
static String width(float f) {
|
||||||
return String.format("width:%.1f%%", f * 100);
|
return StringUtils.format("width:%.1f%%", f * 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
static String left(float f) {
|
static String left(float f) {
|
||||||
return String.format("left:%.1f%%", f * 100);
|
return StringUtils.format("left:%.1f%%", f * 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ import static org.apache.hadoop.yarn.webapp.view.JQueryUI.C_PROGRESSBAR_VALUE;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringEscapeUtils;
|
import org.apache.commons.lang.StringEscapeUtils;
|
||||||
|
import org.apache.hadoop.util.StringUtils;
|
||||||
import org.apache.hadoop.yarn.api.ApplicationBaseProtocol;
|
import org.apache.hadoop.yarn.api.ApplicationBaseProtocol;
|
||||||
import org.apache.hadoop.yarn.api.records.ApplicationReport;
|
import org.apache.hadoop.yarn.api.records.ApplicationReport;
|
||||||
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
|
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
|
||||||
|
@ -82,7 +83,7 @@ public class RMAppsBlock extends AppsBlock {
|
||||||
if (nodes != null) {
|
if (nodes != null) {
|
||||||
blacklistedNodesCount = String.valueOf(nodes.size());
|
blacklistedNodesCount = String.valueOf(nodes.size());
|
||||||
}
|
}
|
||||||
String percent = String.format("%.1f", app.getProgress());
|
String percent = StringUtils.format("%.1f", app.getProgress());
|
||||||
appsTableData
|
appsTableData
|
||||||
.append("[\"<a href='")
|
.append("[\"<a href='")
|
||||||
.append(url("app", app.getAppId()))
|
.append(url("app", app.getAppId()))
|
||||||
|
|
Loading…
Reference in New Issue