YARN-2123. Progress bars in Web UI always at 100% due to non-US locale.

Contributed by Akira AJISAKA
This commit is contained in:
Xuan 2015-05-05 10:40:16 -07:00
parent 9b01f81eb8
commit b7dd3a4f04
12 changed files with 32 additions and 27 deletions

View File

@ -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();

View File

@ -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

View File

@ -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) {

View File

@ -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

View File

@ -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);
}
} }

View File

@ -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()))

View File

@ -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();

View File

@ -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);
} }
} }

View File

@ -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);
} }
} }

View File

@ -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) {

View File

@ -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);
} }
} }

View File

@ -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()))