示例#1
0
        protected internal virtual void RenderData(HtmlBlock.Block html)
        {
            Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > tbody = html
                                                                                               .Table("#apps").Thead().Tr().Th(".id", "ID").Th(".user", "User").Th(".name", "Name"
                                                                                                                                                                   ).Th(".type", "Application Type").Th(".queue", "Queue").Th(".starttime", "StartTime"
                                                                                                                                                                                                                              ).Th(".finishtime", "FinishTime").Th(".state", "State").Th(".finalstatus", "FinalStatus"
                                                                                                                                                                                                                                                                                         ).Th(".progress", "Progress").Th(".ui", "Tracking UI").().().Tbody();
            StringBuilder appsTableData = new StringBuilder("[\n");

            foreach (ApplicationReport appReport in appReports)
            {
                // TODO: remove the following condition. It is still here because
                // the history side implementation of ApplicationBaseProtocol
                // hasn't filtering capability (YARN-1819).
                if (!reqAppStates.IsEmpty() && !reqAppStates.Contains(appReport.GetYarnApplicationState
                                                                          ()))
                {
                    continue;
                }
                AppInfo app     = new AppInfo(appReport);
                string  percent = string.Format("%.1f", app.GetProgress());
                appsTableData.Append("[\"<a href='").Append(Url("app", app.GetAppId())).Append("'>"
                                                                                               ).Append(app.GetAppId()).Append("</a>\",\"").Append(StringEscapeUtils.EscapeJavaScript
                                                                                                                                                       (StringEscapeUtils.EscapeHtml(app.GetUser()))).Append("\",\"").Append(StringEscapeUtils
                                                                                                                                                                                                                             .EscapeJavaScript(StringEscapeUtils.EscapeHtml(app.GetName()))).Append("\",\"").
                Append(StringEscapeUtils.EscapeJavaScript(StringEscapeUtils.EscapeHtml(app.GetType
                                                                                           ()))).Append("\",\"").Append(StringEscapeUtils.EscapeJavaScript(StringEscapeUtils
                                                                                                                                                           .EscapeHtml(app.GetQueue()))).Append("\",\"").Append(app.GetStartedTime()).Append
                    ("\",\"").Append(app.GetFinishedTime()).Append("\",\"").Append(app.GetAppState()
                                                                                   == null ? Unavailable : app.GetAppState()).Append("\",\"").Append(app.GetFinalAppStatus
                                                                                                                                                         ()).Append("\",\"").Append("<br title='").Append(percent).Append("'> <div class='"
                                                                                                                                                                                                                          ).Append(JQueryUI.CProgressbar).Append("' title='").Append(StringHelper.Join(percent
                                                                                                                                                                                                                                                                                                       , '%')).Append("'> ").Append("<div class='").Append(JQueryUI.CProgressbarValue).
                Append("' style='").Append(StringHelper.Join("width:", percent, '%')).Append("'> </div> </div>"
                                                                                             ).Append("\",\"<a ");
                // Progress bar
                string trackingURL = app.GetTrackingUrl() == null || app.GetTrackingUrl().Equals(
                    Unavailable) ? null : app.GetTrackingUrl();
                string trackingUI = app.GetTrackingUrl() == null || app.GetTrackingUrl().Equals(Unavailable
                                                                                                ) ? "Unassigned" : app.GetAppState() == YarnApplicationState.Finished || app.GetAppState
                                        () == YarnApplicationState.Failed || app.GetAppState() == YarnApplicationState.Killed
                                         ? "History" : "ApplicationMaster";
                appsTableData.Append(trackingURL == null ? "#" : "href='" + trackingURL).Append("'>"
                                                                                                ).Append(trackingUI).Append("</a>\"],\n");
            }
            if (appsTableData[appsTableData.Length - 2] == ',')
            {
                appsTableData.Delete(appsTableData.Length - 2, appsTableData.Length - 1);
            }
            appsTableData.Append("]");
            html.Script().$type("text/javascript").("var appsTableData=" + appsTableData).();
            tbody.().();
        }
示例#2
0
            protected override void Render(HtmlBlock.Block html)
            {
                Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > tbody = html
                                                                                                   .Table("#userinfo").Thead().$class("ui-widget-header").Tr().Th().$class("ui-state-default"
                                                                                                                                                                           ).("User Name").().Th().$class("ui-state-default").("Max Resource").().Th().$class
                                                                                                       ("ui-state-default").("Used Resource").().Th().$class("ui-state-default").("Max AM Resource"
                                                                                                                                                                                  ).().Th().$class("ui-state-default").("Used AM Resource").().Th().$class("ui-state-default"
                                                                                                                                                                                                                                                           ).("Schedulable Apps").().Th().$class("ui-state-default").("Non-Schedulable Apps"
                                                                                                                                                                                                                                                                                                                      ).().().().Tbody();
                AList <UserInfo> users = lqinfo.GetUsers().GetUsersList();

                foreach (UserInfo userInfo in users)
                {
                    tbody.Tr().Td(userInfo.GetUsername()).Td(userInfo.GetUserResourceLimit().ToString
                                                                 ()).Td(userInfo.GetResourcesUsed().ToString()).Td(lqinfo.GetUserAMResourceLimit(
                                                                                                                       ).ToString()).Td(userInfo.GetAMResourcesUsed().ToString()).Td(Sharpen.Extensions.ToString
                                                                                                                                                                                         (userInfo.GetNumActiveApplications())).Td(Sharpen.Extensions.ToString(userInfo.GetNumPendingApplications
                                                                                                                                                                                                                                                                   ())).();
                }
                html.Div().$class("usersinfo").H5("Active Users Info").();
                tbody.().();
            }
示例#3
0
        protected override void GenerateApplicationTable(HtmlBlock.Block html, UserGroupInformation
                                                         callerUGI, ICollection <ApplicationAttemptReport> attempts)
        {
            // Application Attempt Table
            Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > tbody = html
                                                                                               .Table("#attempts").Thead().Tr().Th(".id", "Attempt ID").Th(".started", "Started"
                                                                                                                                                           ).Th(".node", "Node").Th(".logs", "Logs").Th(".blacklistednodes", "Blacklisted Nodes"
                                                                                                                                                                                                        ).().().Tbody();
            RMApp rmApp = this.rm.GetRMContext().GetRMApps()[this.appID];

            if (rmApp == null)
            {
                return;
            }
            StringBuilder attemptsTableData = new StringBuilder("[\n");

            foreach (ApplicationAttemptReport appAttemptReport in attempts)
            {
                RMAppAttempt rmAppAttempt = rmApp.GetRMAppAttempt(appAttemptReport.GetApplicationAttemptId
                                                                      ());
                if (rmAppAttempt == null)
                {
                    continue;
                }
                AppAttemptInfo attemptInfo = new AppAttemptInfo(this.rm, rmAppAttempt, rmApp.GetUser
                                                                    (), WebAppUtils.GetHttpSchemePrefix(conf));
                string blacklistedNodesCount = "N/A";
                ICollection <string> nodes   = RMAppAttemptBlock.GetBlacklistedNodes(rm, rmAppAttempt
                                                                                     .GetAppAttemptId());
                if (nodes != null)
                {
                    blacklistedNodesCount = nodes.Count.ToString();
                }
                string nodeLink = attemptInfo.GetNodeHttpAddress();
                if (nodeLink != null)
                {
                    nodeLink = WebAppUtils.GetHttpSchemePrefix(conf) + nodeLink;
                }
                string logsLink = attemptInfo.GetLogsLink();
                attemptsTableData.Append("[\"<a href='").Append(Url("appattempt", rmAppAttempt.GetAppAttemptId
                                                                        ().ToString())).Append("'>").Append(rmAppAttempt.GetAppAttemptId().ToString()).Append
                    ("</a>\",\"").Append(attemptInfo.GetStartTime()).Append("\",\"<a ").Append(nodeLink
                                                                                               == null ? "#" : "href='" + nodeLink).Append("'>").Append(nodeLink == null ? "N/A"
                                         : StringEscapeUtils.EscapeJavaScript(StringEscapeUtils.EscapeHtml(nodeLink))).Append
                    ("</a>\",\"<a ").Append(logsLink == null ? "#" : "href='" + logsLink).Append("'>"
                                                                                                 ).Append(logsLink == null ? "N/A" : "Logs").Append("</a>\",").Append("\"").Append
                    (blacklistedNodesCount).Append("\"],\n");
            }
            if (attemptsTableData[attemptsTableData.Length - 2] == ',')
            {
                attemptsTableData.Delete(attemptsTableData.Length - 2, attemptsTableData.Length -
                                         1);
            }
            attemptsTableData.Append("]");
            html.Script().$type("text/javascript").("var attemptsTableData=" + attemptsTableData
                                                    ).();
            tbody.().();
        }
示例#4
0
            protected override void Render(HtmlBlock.Block html)
            {
                if (!IsValidRequest())
                {
                    html.H2($(Title));
                    return;
                }
                Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > tbody = html
                                                                                                   .Table("#attempts").Thead().Tr().Th(".id", "Attempt").Th(".progress", "Progress"
                                                                                                                                                            ).Th(".state", "State").Th(".status", "Status").Th(".node", "Node").Th(".logs",
                                                                                                                                                                                                                                   "Logs").Th(".tsh", "Started").Th(".tsh", "Finished").Th(".tsh", "Elapsed").Th(".note"
                                                                                                                                                                                                                                                                                                                 , "Note").().().Tbody();
                // Write all the data into a JavaScript array of arrays for JQuery
                // DataTables to display
                StringBuilder attemptsTableData = new StringBuilder("[\n");

                foreach (TaskAttempt attempt in GetTaskAttempts())
                {
                    TaskAttemptInfo ta           = new TaskAttemptInfo(attempt, true);
                    string          progress     = StringHelper.Percent(ta.GetProgress() / 100);
                    string          nodeHttpAddr = ta.GetNode();
                    string          diag         = ta.GetNote() == null ? string.Empty : ta.GetNote();
                    attemptsTableData.Append("[\"").Append(ta.GetId()).Append("\",\"").Append(progress
                                                                                              ).Append("\",\"").Append(ta.GetState().ToString()).Append("\",\"").Append(StringEscapeUtils
                                                                                                                                                                        .EscapeJavaScript(StringEscapeUtils.EscapeHtml(ta.GetStatus()))).Append("\",\"")
                    .Append(nodeHttpAddr == null ? "N/A" : "<a class='nodelink' href='" + MRWebAppUtil
                            .GetYARNWebappScheme() + nodeHttpAddr + "'>" + nodeHttpAddr + "</a>").Append("\",\""
                                                                                                         ).Append(ta.GetAssignedContainerId() == null ? "N/A" : "<a class='logslink' href='"
                                                                                                                  + Url(MRWebAppUtil.GetYARNWebappScheme(), nodeHttpAddr, "node", "containerlogs"
                                                                                                                        , ta.GetAssignedContainerIdStr(), app.GetJob().GetUserName()) + "'>logs</a>").Append
                        ("\",\"").Append(ta.GetStartTime()).Append("\",\"").Append(ta.GetFinishTime()).Append
                        ("\",\"").Append(ta.GetElapsedTime()).Append("\",\"").Append(StringEscapeUtils.EscapeJavaScript
                                                                                         (StringEscapeUtils.EscapeHtml(diag))).Append("\"],\n");
                }
                //Remove the last comma and close off the array of arrays
                if (attemptsTableData[attemptsTableData.Length - 2] == ',')
                {
                    attemptsTableData.Delete(attemptsTableData.Length - 2, attemptsTableData.Length -
                                             1);
                }
                attemptsTableData.Append("]");
                html.Script().$type("text/javascript").("var attemptsTableData=" + attemptsTableData
                                                        ).();
                tbody.().();
            }
示例#5
0
        /*
         * (non-Javadoc)
         * @see org.apache.hadoop.yarn.webapp.view.HtmlBlock#render(org.apache.hadoop.yarn.webapp.view.HtmlBlock.Block)
         */
        protected override void Render(HtmlBlock.Block html)
        {
            if (app.GetJob() == null)
            {
                html.H2($(Title));
                return;
            }
            TaskType type   = null;
            string   symbol = $(AMParams.TaskType);

            if (!symbol.IsEmpty())
            {
                type = MRApps.TaskType(symbol);
            }
            Hamlet.THEAD <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > thead;
            if (type != null)
            {
                thead = html.Table("#" + app.GetJob().GetID() + type).$class("dt-tasks").Thead();
            }
            else
            {
                thead = html.Table("#tasks").Thead();
            }
            //Create the spanning row
            int attemptColSpan = type == TaskType.Reduce ? 8 : 3;

            thead.Tr().Th().$colspan(5).$class("ui-state-default").("Task").().Th().$colspan(
                attemptColSpan).$class("ui-state-default").("Successful Attempt").().();
            Hamlet.TR <Hamlet.THEAD <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> >
                       > theadRow = thead.Tr().Th("Name").Th("State").Th("Start Time").Th("Finish Time"
                                                                                          ).Th("Elapsed Time").Th("Start Time");
            //Attempt
            if (type == TaskType.Reduce)
            {
                theadRow.Th("Shuffle Finish Time");
                //Attempt
                theadRow.Th("Merge Finish Time");
            }
            //Attempt
            theadRow.Th("Finish Time");
            //Attempt
            if (type == TaskType.Reduce)
            {
                theadRow.Th("Elapsed Time Shuffle");
                //Attempt
                theadRow.Th("Elapsed Time Merge");
                //Attempt
                theadRow.Th("Elapsed Time Reduce");
            }
            //Attempt
            theadRow.Th("Elapsed Time");
            //Attempt
            Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > tbody = theadRow
                                                                                               .().().Tbody();
            // Write all the data into a JavaScript array of arrays for JQuery
            // DataTables to display
            StringBuilder tasksTableData = new StringBuilder("[\n");

            foreach (Task task in app.GetJob().GetTasks().Values)
            {
                if (type != null && task.GetType() != type)
                {
                    continue;
                }
                TaskInfo    info               = new TaskInfo(task);
                string      tid                = info.GetId();
                long        startTime          = info.GetStartTime();
                long        finishTime         = info.GetFinishTime();
                long        elapsed            = info.GetElapsedTime();
                long        attemptStartTime   = -1;
                long        shuffleFinishTime  = -1;
                long        sortFinishTime     = -1;
                long        attemptFinishTime  = -1;
                long        elapsedShuffleTime = -1;
                long        elapsedSortTime    = -1;
                long        elapsedReduceTime  = -1;
                long        attemptElapsed     = -1;
                TaskAttempt successful         = info.GetSuccessful();
                if (successful != null)
                {
                    TaskAttemptInfo ta;
                    if (type == TaskType.Reduce)
                    {
                        ReduceTaskAttemptInfo rta = new ReduceTaskAttemptInfo(successful, type);
                        shuffleFinishTime  = rta.GetShuffleFinishTime();
                        sortFinishTime     = rta.GetMergeFinishTime();
                        elapsedShuffleTime = rta.GetElapsedShuffleTime();
                        elapsedSortTime    = rta.GetElapsedMergeTime();
                        elapsedReduceTime  = rta.GetElapsedReduceTime();
                        ta = rta;
                    }
                    else
                    {
                        ta = new TaskAttemptInfo(successful, type, false);
                    }
                    attemptStartTime  = ta.GetStartTime();
                    attemptFinishTime = ta.GetFinishTime();
                    attemptElapsed    = ta.GetElapsedTime();
                }
                tasksTableData.Append("[\"").Append("<a href='" + Url("task", tid)).Append("'>").
                Append(tid).Append("</a>\",\"").Append(info.GetState()).Append("\",\"").Append(startTime
                                                                                               ).Append("\",\"").Append(finishTime).Append("\",\"").Append(elapsed).Append("\",\""
                                                                                                                                                                           ).Append(attemptStartTime).Append("\",\"");
                if (type == TaskType.Reduce)
                {
                    tasksTableData.Append(shuffleFinishTime).Append("\",\"").Append(sortFinishTime).Append
                        ("\",\"");
                }
                tasksTableData.Append(attemptFinishTime).Append("\",\"");
                if (type == TaskType.Reduce)
                {
                    tasksTableData.Append(elapsedShuffleTime).Append("\",\"").Append(elapsedSortTime)
                    .Append("\",\"").Append(elapsedReduceTime).Append("\",\"");
                }
                tasksTableData.Append(attemptElapsed).Append("\"],\n");
            }
            //Remove the last comma and close off the array of arrays
            if (tasksTableData[tasksTableData.Length - 2] == ',')
            {
                tasksTableData.Delete(tasksTableData.Length - 2, tasksTableData.Length - 1);
            }
            tasksTableData.Append("]");
            html.Script().$type("text/javascript").("var tasksTableData=" + tasksTableData).(
                );
            Hamlet.TR <Hamlet.TFOOT <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> >
                       > footRow = tbody.().Tfoot().Tr();
            footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("task").
            $value("ID").().().Th().Input("search_init").$type(HamletSpec.InputType.text).$name
                ("state").$value("State").().().Th().Input("search_init").$type(HamletSpec.InputType
                                                                                .text).$name("start_time").$value("Start Time").().().Th().Input("search_init").
            $type(HamletSpec.InputType.text).$name("finish_time").$value("Finish Time").().(
                ).Th().Input("search_init").$type(HamletSpec.InputType.text).$name("elapsed_time"
                                                                                   ).$value("Elapsed Time").().().Th().Input("search_init").$type(HamletSpec.InputType
                                                                                                                                                  .text).$name("attempt_start_time").$value("Start Time").().();
            if (type == TaskType.Reduce)
            {
                footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("shuffle_time"
                                                                                         ).$value("Shuffle Time").().();
                footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("merge_time"
                                                                                         ).$value("Merge Time").().();
            }
            footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("attempt_finish"
                                                                                     ).$value("Finish Time").().();
            if (type == TaskType.Reduce)
            {
                footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("elapsed_shuffle_time"
                                                                                         ).$value("Elapsed Shuffle Time").().();
                footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("elapsed_merge_time"
                                                                                         ).$value("Elapsed Merge Time").().();
                footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("elapsed_reduce_time"
                                                                                         ).$value("Elapsed Reduce Time").().();
            }
            footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("attempt_elapsed"
                                                                                     ).$value("Elapsed Time").().();
            footRow.().().();
        }
示例#6
0
            protected override void Render(HtmlBlock.Block html)
            {
                if (!IsValidRequest())
                {
                    html.H2($(Title));
                    return;
                }
                TaskType type   = null;
                string   symbol = $(AMParams.TaskType);

                if (!symbol.IsEmpty())
                {
                    type = MRApps.TaskType(symbol);
                }
                else
                {
                    type = app.GetTask().GetType();
                }
                Hamlet.TR <Hamlet.THEAD <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> >
                           > headRow = html.Table("#attempts").Thead().Tr();
                headRow.Th(".id", "Attempt").Th(".state", "State").Th(".status", "Status").Th(".node"
                                                                                              , "Node").Th(".logs", "Logs").Th(".tsh", "Start Time");
                if (type == TaskType.Reduce)
                {
                    headRow.Th("Shuffle Finish Time");
                    headRow.Th("Merge Finish Time");
                }
                headRow.Th("Finish Time");
                //Attempt
                if (type == TaskType.Reduce)
                {
                    headRow.Th("Elapsed Time Shuffle");
                    //Attempt
                    headRow.Th("Elapsed Time Merge");
                    //Attempt
                    headRow.Th("Elapsed Time Reduce");
                }
                //Attempt
                headRow.Th("Elapsed Time").Th(".note", "Note");
                Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > tbody = headRow
                                                                                                   .().().Tbody();
                // Write all the data into a JavaScript array of arrays for JQuery
                // DataTables to display
                StringBuilder attemptsTableData = new StringBuilder("[\n");

                foreach (TaskAttempt attempt in GetTaskAttempts())
                {
                    TaskAttemptInfo ta                 = new TaskAttemptInfo(attempt, false);
                    string          taid               = ta.GetId();
                    string          nodeHttpAddr       = ta.GetNode();
                    string          containerIdString  = ta.GetAssignedContainerIdStr();
                    string          nodeIdString       = attempt.GetAssignedContainerMgrAddress();
                    string          nodeRackName       = ta.GetRack();
                    long            attemptStartTime   = ta.GetStartTime();
                    long            shuffleFinishTime  = -1;
                    long            sortFinishTime     = -1;
                    long            attemptFinishTime  = ta.GetFinishTime();
                    long            elapsedShuffleTime = -1;
                    long            elapsedSortTime    = -1;
                    long            elapsedReduceTime  = -1;
                    if (type == TaskType.Reduce)
                    {
                        shuffleFinishTime  = attempt.GetShuffleFinishTime();
                        sortFinishTime     = attempt.GetSortFinishTime();
                        elapsedShuffleTime = Times.Elapsed(attemptStartTime, shuffleFinishTime, false);
                        elapsedSortTime    = Times.Elapsed(shuffleFinishTime, sortFinishTime, false);
                        elapsedReduceTime  = Times.Elapsed(sortFinishTime, attemptFinishTime, false);
                    }
                    long attemptElapsed = Times.Elapsed(attemptStartTime, attemptFinishTime, false);
                    int  sortId         = attempt.GetID().GetId() + (attempt.GetID().GetTaskId().GetId() * 10000
                                                                     );
                    attemptsTableData.Append("[\"").Append(sortId + " ").Append(taid).Append("\",\"")
                    .Append(ta.GetState()).Append("\",\"").Append(StringEscapeUtils.EscapeJavaScript
                                                                      (StringEscapeUtils.EscapeHtml(ta.GetStatus()))).Append("\",\"").Append("<a class='nodelink' href='"
                                                                                                                                             + MRWebAppUtil.GetYARNWebappScheme() + nodeHttpAddr + "'>").Append(nodeRackName
                                                                                                                                                                                                                + "/" + nodeHttpAddr + "</a>\",\"").Append("<a class='logslink' href='").Append
                        (Url("logs", nodeIdString, containerIdString, taid, app.GetJob().GetUserName()))
                    .Append("'>logs</a>\",\"").Append(attemptStartTime).Append("\",\"");
                    if (type == TaskType.Reduce)
                    {
                        attemptsTableData.Append(shuffleFinishTime).Append("\",\"").Append(sortFinishTime
                                                                                           ).Append("\",\"");
                    }
                    attemptsTableData.Append(attemptFinishTime).Append("\",\"");
                    if (type == TaskType.Reduce)
                    {
                        attemptsTableData.Append(elapsedShuffleTime).Append("\",\"").Append(elapsedSortTime
                                                                                            ).Append("\",\"").Append(elapsedReduceTime).Append("\",\"");
                    }
                    attemptsTableData.Append(attemptElapsed).Append("\",\"").Append(StringEscapeUtils
                                                                                    .EscapeJavaScript(StringEscapeUtils.EscapeHtml(ta.GetNote()))).Append("\"],\n");
                }
                //Remove the last comma and close off the array of arrays
                if (attemptsTableData[attemptsTableData.Length - 2] == ',')
                {
                    attemptsTableData.Delete(attemptsTableData.Length - 2, attemptsTableData.Length -
                                             1);
                }
                attemptsTableData.Append("]");
                html.Script().$type("text/javascript").("var attemptsTableData=" + attemptsTableData
                                                        ).();
                Hamlet.TR <Hamlet.TFOOT <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> >
                           > footRow = tbody.().Tfoot().Tr();
                footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("attempt_name"
                                                                                         ).$value("Attempt").().().Th().Input("search_init").$type(HamletSpec.InputType.text
                                                                                                                                                   ).$name("attempt_state").$value("State").().().Th().Input("search_init").$type(HamletSpec.InputType
                                                                                                                                                                                                                                  .text).$name("attempt_status").$value("Status").().().Th().Input("search_init").
                $type(HamletSpec.InputType.text).$name("attempt_node").$value("Node").().().Th()
                .Input("search_init").$type(HamletSpec.InputType.text).$name("attempt_node").$value
                    ("Logs").().().Th().Input("search_init").$type(HamletSpec.InputType.text).$name(
                    "attempt_start_time").$value("Start Time").().();
                if (type == TaskType.Reduce)
                {
                    footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("shuffle_time"
                                                                                             ).$value("Shuffle Time").().();
                    footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("merge_time"
                                                                                             ).$value("Merge Time").().();
                }
                footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("attempt_finish"
                                                                                         ).$value("Finish Time").().();
                if (type == TaskType.Reduce)
                {
                    footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("elapsed_shuffle_time"
                                                                                             ).$value("Elapsed Shuffle Time").().();
                    footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("elapsed_merge_time"
                                                                                             ).$value("Elapsed Merge Time").().();
                    footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("elapsed_reduce_time"
                                                                                             ).$value("Elapsed Reduce Time").().();
                }
                footRow.Th().Input("search_init").$type(HamletSpec.InputType.text).$name("attempt_elapsed"
                                                                                         ).$value("Elapsed Time").().().Th().Input("search_init").$type(HamletSpec.InputType
                                                                                                                                                        .text).$name("note").$value("Note").().();
                footRow.().().();
            }
示例#7
0
            protected override void Render(HtmlBlock.Block html)
            {
                Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > tbody = html
                                                                                                   .Table("#nodelabels").Thead().Tr().Th(".name", "Label Name").Th(".numOfActiveNMs"
                                                                                                                                                                   , "Num Of Active NMs").Th(".totalResource", "Total Resource").().().Tbody();
                RMNodeLabelsManager nlm = rm.GetRMContext().GetNodeLabelManager();

                foreach (NodeLabel info in nlm.PullRMNodeLabelsInfo())
                {
                    Hamlet.TR <Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> >
                               > row = tbody.Tr().Td(info.GetLabelName().IsEmpty() ? "<NO_LABEL>" : info.GetLabelName
                                                         ());
                    int nActiveNMs = info.GetNumActiveNMs();
                    if (nActiveNMs > 0)
                    {
                        row = row.Td().A(Url("nodes", "?" + YarnWebParams.NodeLabel + "=" + info.GetLabelName
                                                 ()), nActiveNMs.ToString()).();
                    }
                    else
                    {
                        row = row.Td(nActiveNMs.ToString());
                    }
                    row.Td(info.GetResource().ToString()).();
                }
                tbody.().();
            }
示例#8
0
        protected internal virtual void GenerateApplicationTable(HtmlBlock.Block html, UserGroupInformation
                                                                 callerUGI, ICollection <ApplicationAttemptReport> attempts)
        {
            // Application Attempt Table
            Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > tbody = html
                                                                                               .Table("#attempts").Thead().Tr().Th(".id", "Attempt ID").Th(".started", "Started"
                                                                                                                                                           ).Th(".node", "Node").Th(".logs", "Logs").().().Tbody();
            StringBuilder attemptsTableData = new StringBuilder("[\n");

            foreach (ApplicationAttemptReport appAttemptReport in attempts)
            {
                AppAttemptInfo  appAttempt = new AppAttemptInfo(appAttemptReport);
                ContainerReport containerReport;
                try
                {
                    GetContainerReportRequest request = GetContainerReportRequest.NewInstance(appAttemptReport
                                                                                              .GetAMContainerId());
                    if (callerUGI == null)
                    {
                        containerReport = appBaseProt.GetContainerReport(request).GetContainerReport();
                    }
                    else
                    {
                        containerReport = callerUGI.DoAs(new _PrivilegedExceptionAction_242(this, request
                                                                                            ));
                    }
                }
                catch (Exception e)
                {
                    string message = "Failed to read the AM container of the application attempt " +
                                     appAttemptReport.GetApplicationAttemptId() + ".";
                    Log.Error(message, e);
                    html.P().(message).();
                    return;
                }
                long   startTime = 0L;
                string logsLink  = null;
                string nodeLink  = null;
                if (containerReport != null)
                {
                    ContainerInfo container = new ContainerInfo(containerReport);
                    startTime = container.GetStartedTime();
                    logsLink  = containerReport.GetLogUrl();
                    nodeLink  = containerReport.GetNodeHttpAddress();
                }
                attemptsTableData.Append("[\"<a href='").Append(Url("appattempt", appAttempt.GetAppAttemptId
                                                                        ())).Append("'>").Append(appAttempt.GetAppAttemptId()).Append("</a>\",\"").Append
                    (startTime).Append("\",\"<a ").Append(nodeLink == null ? "#" : "href='" + nodeLink
                                                          ).Append("'>").Append(nodeLink == null ? "N/A" : StringEscapeUtils.EscapeJavaScript
                                                                                    (StringEscapeUtils.EscapeHtml(nodeLink))).Append("</a>\",\"<a ").Append(logsLink
                                                                                                                                                            == null ? "#" : "href='" + logsLink).Append("'>").Append(logsLink == null ? "N/A"
                                         : "Logs").Append("</a>\"],\n");
            }
            if (attemptsTableData[attemptsTableData.Length - 2] == ',')
            {
                attemptsTableData.Delete(attemptsTableData.Length - 2, attemptsTableData.Length -
                                         1);
            }
            attemptsTableData.Append("]");
            html.Script().$type("text/javascript").("var attemptsTableData=" + attemptsTableData
                                                    ).();
            tbody.().();
        }
示例#9
0
        protected override void Render(HtmlBlock.Block html)
        {
            if (app.GetJob() == null)
            {
                html.H2($(Title));
                return;
            }
            TaskType type   = null;
            string   symbol = $(AMParams.TaskType);

            if (!symbol.IsEmpty())
            {
                type = MRApps.TaskType(symbol);
            }
            Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > tbody = html
                                                                                               .Table("#tasks").Thead().Tr().Th("Task").Th("Progress").Th("Status").Th("State")
                                                                                               .Th("Start Time").Th("Finish Time").Th("Elapsed Time").().().Tbody();
            StringBuilder tasksTableData = new StringBuilder("[\n");

            foreach (Task task in app.GetJob().GetTasks().Values)
            {
                if (type != null && task.GetType() != type)
                {
                    continue;
                }
                string taskStateStr = $(AMParams.TaskState);
                if (taskStateStr == null || taskStateStr.Trim().Equals(string.Empty))
                {
                    taskStateStr = "ALL";
                }
                if (!Sharpen.Runtime.EqualsIgnoreCase(taskStateStr, "ALL"))
                {
                    try
                    {
                        // get stateUI enum
                        MRApps.TaskStateUI stateUI = MRApps.TaskState(taskStateStr);
                        if (!stateUI.CorrespondsTo(task.GetState()))
                        {
                            continue;
                        }
                    }
                    catch (ArgumentException)
                    {
                        continue;
                    }
                }
                // not supported state, ignore
                TaskInfo info = new TaskInfo(task);
                string   tid  = info.GetId();
                string   pct  = StringHelper.Percent(info.GetProgress() / 100);
                tasksTableData.Append("[\"<a href='").Append(Url("task", tid)).Append("'>").Append
                    (tid).Append("</a>\",\"").Append("<br title='").Append(pct).Append("'> <div class='"
                                                                                       ).Append(JQueryUI.CProgressbar).Append("' title='").Append(StringHelper.Join(pct
                                                                                                                                                                    , '%')).Append("'> ").Append("<div class='").Append(JQueryUI.CProgressbarValue).
                Append("' style='").Append(StringHelper.Join("width:", pct, '%')).Append("'> </div> </div>\",\""
                                                                                         ).Append(StringEscapeUtils.EscapeJavaScript(StringEscapeUtils.EscapeHtml(info.GetStatus
                                                                                                                                                                      ()))).Append("\",\"").Append(info.GetState()).Append("\",\"").Append(info.GetStartTime
                                                                                                                                                                                                                                               ()).Append("\",\"").Append(info.GetFinishTime()).Append("\",\"").Append(info.GetElapsedTime
                                                                                                                                                                                                                                                                                                                           ()).Append("\"],\n");
            }
            //Progress bar
            //Remove the last comma and close off the array of arrays
            if (tasksTableData[tasksTableData.Length - 2] == ',')
            {
                tasksTableData.Delete(tasksTableData.Length - 2, tasksTableData.Length - 1);
            }
            tasksTableData.Append("]");
            html.Script().$type("text/javascript").("var tasksTableData=" + tasksTableData).(
                );
            tbody.().();
        }
示例#10
0
        protected override void Render(HtmlBlock.Block html)
        {
            string attemptid = $(YarnWebParams.ApplicationAttemptId);

            if (attemptid.IsEmpty())
            {
                Puts("Bad request: requires application attempt ID");
                return;
            }
            try
            {
                appAttemptId = ConverterUtils.ToApplicationAttemptId(attemptid);
            }
            catch (ArgumentException)
            {
                Puts("Invalid application attempt ID: " + attemptid);
                return;
            }
            UserGroupInformation     callerUGI = GetCallerUGI();
            ApplicationAttemptReport appAttemptReport;

            try
            {
                GetApplicationAttemptReportRequest request = GetApplicationAttemptReportRequest.NewInstance
                                                                 (appAttemptId);
                if (callerUGI == null)
                {
                    appAttemptReport = appBaseProt.GetApplicationAttemptReport(request).GetApplicationAttemptReport
                                           ();
                }
                else
                {
                    appAttemptReport = callerUGI.DoAs(new _PrivilegedExceptionAction_85(this, request
                                                                                        ));
                }
            }
            catch (Exception e)
            {
                string message = "Failed to read the application attempt " + appAttemptId + ".";
                Log.Error(message, e);
                html.P().(message).();
                return;
            }
            if (appAttemptReport == null)
            {
                Puts("Application Attempt not found: " + attemptid);
                return;
            }
            bool exceptionWhenGetContainerReports    = false;
            ICollection <ContainerReport> containers = null;

            try
            {
                GetContainersRequest request = GetContainersRequest.NewInstance(appAttemptId);
                if (callerUGI == null)
                {
                    containers = appBaseProt.GetContainers(request).GetContainerList();
                }
                else
                {
                    containers = callerUGI.DoAs(new _PrivilegedExceptionAction_115(this, request));
                }
            }
            catch (RuntimeException)
            {
                // have this block to suppress the findbugs warning
                exceptionWhenGetContainerReports = true;
            }
            catch (Exception)
            {
                exceptionWhenGetContainerReports = true;
            }
            AppAttemptInfo appAttempt = new AppAttemptInfo(appAttemptReport);

            SetTitle(StringHelper.Join("Application Attempt ", attemptid));
            string node = "N/A";

            if (appAttempt.GetHost() != null && appAttempt.GetRpcPort() >= 0 && appAttempt.GetRpcPort
                    () < 65536)
            {
                node = appAttempt.GetHost() + ":" + appAttempt.GetRpcPort();
            }
            GenerateOverview(appAttemptReport, containers, appAttempt, node);
            if (exceptionWhenGetContainerReports)
            {
                html.P().("Sorry, Failed to get containers for application attempt" + attemptid +
                          ".").();
                return;
            }
            CreateAttemptHeadRoomTable(html);
            html.(typeof(InfoBlock));
            CreateTablesForAttemptMetrics(html);
            // Container Table
            Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > tbody = html
                                                                                               .Table("#containers").Thead().Tr().Th(".id", "Container ID").Th(".node", "Node")
                                                                                               .Th(".exitstatus", "Container Exit Status").Th(".logs", "Logs").().().Tbody();
            StringBuilder containersTableData = new StringBuilder("[\n");

            foreach (ContainerReport containerReport in containers)
            {
                ContainerInfo container = new ContainerInfo(containerReport);
                containersTableData.Append("[\"<a href='").Append(Url("container", container.GetContainerId
                                                                          ())).Append("'>").Append(container.GetContainerId()).Append("</a>\",\"<a ").Append
                    (container.GetNodeHttpAddress() == null ? "#" : "href='" + container.GetNodeHttpAddress
                        ()).Append("'>").Append(container.GetNodeHttpAddress() == null ? "N/A" : StringEscapeUtils
                                                .EscapeJavaScript(StringEscapeUtils.EscapeHtml(container.GetNodeHttpAddress())))
                .Append("</a>\",\"").Append(container.GetContainerExitStatus()).Append("\",\"<a href='"
                                                                                       ).Append(container.GetLogUrl() == null ? "#" : container.GetLogUrl()).Append("'>"
                                                                                                                                                                    ).Append(container.GetLogUrl() == null ? "N/A" : "Logs").Append("</a>\"],\n");
            }
            if (containersTableData[containersTableData.Length - 2] == ',')
            {
                containersTableData.Delete(containersTableData.Length - 2, containersTableData.Length
                                           - 1);
            }
            containersTableData.Append("]");
            html.Script().$type("text/javascript").("var containersTableData=" + containersTableData
                                                    ).();
            tbody.().();
        }
示例#11
0
        protected override void Render(HtmlBlock.Block html)
        {
            Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > tbody = html
                                                                                               .Table("#apps").Thead().Tr().Th(".id", "ID").Th(".user", "User").Th(".name", "Name"
                                                                                                                                                                   ).Th(".type", "Application Type").Th(".queue", "Queue").Th(".fairshare", "Fair Share"
                                                                                                                                                                                                                              ).Th(".starttime", "StartTime").Th(".finishtime", "FinishTime").Th(".state", "State"
                                                                                                                                                                                                                                                                                                 ).Th(".finalstatus", "FinalStatus").Th(".progress", "Progress").Th(".ui", "Tracking UI"
                                                                                                                                                                                                                                                                                                                                                                    ).().().Tbody();
            ICollection <YarnApplicationState> reqAppStates = null;
            string reqStateString = $(YarnWebParams.AppState);

            if (reqStateString != null && !reqStateString.IsEmpty())
            {
                string[] appStateStrings = reqStateString.Split(",");
                reqAppStates = new HashSet <YarnApplicationState>(appStateStrings.Length);
                foreach (string stateString in appStateStrings)
                {
                    reqAppStates.AddItem(YarnApplicationState.ValueOf(stateString));
                }
            }
            StringBuilder appsTableData = new StringBuilder("[\n");

            foreach (RMApp app in apps.Values)
            {
                if (reqAppStates != null && !reqAppStates.Contains(app.CreateApplicationState()))
                {
                    continue;
                }
                AppInfo appInfo = new AppInfo(rm, app, true, WebAppUtils.GetHttpSchemePrefix(conf
                                                                                             ));
                string percent = string.Format("%.1f", appInfo.GetProgress());
                ApplicationAttemptId attemptId = app.GetCurrentAppAttempt().GetAppAttemptId();
                int fairShare = fsinfo.GetAppFairShare(attemptId);
                if (fairShare == FairSchedulerInfo.InvalidFairShare)
                {
                    // FairScheduler#applications don't have the entry. Skip it.
                    continue;
                }
                appsTableData.Append("[\"<a href='").Append(Url("app", appInfo.GetAppId())).Append
                    ("'>").Append(appInfo.GetAppId()).Append("</a>\",\"").Append(StringEscapeUtils.EscapeJavaScript
                                                                                     (StringEscapeUtils.EscapeHtml(appInfo.GetUser()))).Append("\",\"").Append(StringEscapeUtils
                                                                                                                                                               .EscapeJavaScript(StringEscapeUtils.EscapeHtml(appInfo.GetName()))).Append("\",\""
                                                                                                                                                                                                                                          ).Append(StringEscapeUtils.EscapeJavaScript(StringEscapeUtils.EscapeHtml(appInfo
                                                                                                                                                                                                                                                                                                                   .GetApplicationType()))).Append("\",\"").Append(StringEscapeUtils.EscapeJavaScript
                                                                                                                                                                                                                                                                                                                                                                       (StringEscapeUtils.EscapeHtml(appInfo.GetQueue()))).Append("\",\"").Append(fairShare
                                                                                                                                                                                                                                                                                                                                                                                                                                                  ).Append("\",\"").Append(appInfo.GetStartTime()).Append("\",\"").Append(appInfo.
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          GetFinishTime()).Append("\",\"").Append(appInfo.GetState()).Append("\",\"").Append
                    (appInfo.GetFinalStatus()).Append("\",\"").Append("<br title='").Append(percent)
                .Append("'> <div class='").Append(JQueryUI.CProgressbar).Append("' title='").Append
                    (StringHelper.Join(percent, '%')).Append("'> ").Append("<div class='").Append(JQueryUI
                                                                                                  .CProgressbarValue).Append("' style='").Append(StringHelper.Join("width:", percent
                                                                                                                                                                   , '%')).Append("'> </div> </div>").Append("\",\"<a href='");
                // Progress bar
                string trackingURL = !appInfo.IsTrackingUrlReady() ? "#" : appInfo.GetTrackingUrlPretty
                                         ();
                appsTableData.Append(trackingURL).Append("'>").Append(appInfo.GetTrackingUI()).Append
                    ("</a>\"],\n");
            }
            if (appsTableData[appsTableData.Length - 2] == ',')
            {
                appsTableData.Delete(appsTableData.Length - 2, appsTableData.Length - 1);
            }
            appsTableData.Append("]");
            html.Script().$type("text/javascript").("var appsTableData=" + appsTableData).();
            tbody.().();
        }
示例#12
0
            protected override void Render(HtmlBlock.Block html)
            {
                html.(typeof(MetricsOverviewTable));
                ResourceScheduler sched       = rm.GetResourceScheduler();
                string            type        = $(YarnWebParams.NodeState);
                string            labelFilter = $(YarnWebParams.NodeLabel, CommonNodeLabelsManager.Any).Trim
                                                    ();

                Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > tbody = html
                                                                                                   .Table("#nodes").Thead().Tr().Th(".nodelabels", "Node Labels").Th(".rack", "Rack"
                                                                                                                                                                     ).Th(".state", "Node State").Th(".nodeaddress", "Node Address").Th(".nodehttpaddress"
                                                                                                                                                                                                                                        , "Node HTTP Address").Th(".lastHealthUpdate", "Last health-update").Th(".healthReport"
                                                                                                                                                                                                                                                                                                                , "Health-report").Th(".containers", "Containers").Th(".mem", "Mem Used").Th(".mem"
                                                                                                                                                                                                                                                                                                                                                                                             , "Mem Avail").Th(".vcores", "VCores Used").Th(".vcores", "VCores Avail").Th(".nodeManagerVersion"
                                                                                                                                                                                                                                                                                                                                                                                                                                                                          , "Version").().().Tbody();
                NodeState stateFilter = null;

                if (type != null && !type.IsEmpty())
                {
                    stateFilter = NodeState.ValueOf(StringUtils.ToUpperCase(type));
                }
                ICollection <RMNode> rmNodes = this.rm.GetRMContext().GetRMNodes().Values;
                bool isInactive = false;

                if (stateFilter != null)
                {
                    switch (stateFilter)
                    {
                    case NodeState.Decommissioned:
                    case NodeState.Lost:
                    case NodeState.Rebooted:
                    {
                        rmNodes    = this.rm.GetRMContext().GetInactiveRMNodes().Values;
                        isInactive = true;
                        break;
                    }

                    default:
                    {
                        Log.Debug("Unexpected state filter for inactive RM node");
                        break;
                    }
                    }
                }
                foreach (RMNode ni in rmNodes)
                {
                    if (stateFilter != null)
                    {
                        NodeState state = ni.GetState();
                        if (!stateFilter.Equals(state))
                        {
                            continue;
                        }
                    }
                    else
                    {
                        // No filter. User is asking for all nodes. Make sure you skip the
                        // unhealthy nodes.
                        if (ni.GetState() == NodeState.Unhealthy)
                        {
                            continue;
                        }
                    }
                    // Besides state, we need to filter label as well.
                    if (!labelFilter.Equals(RMNodeLabelsManager.Any))
                    {
                        if (labelFilter.IsEmpty())
                        {
                            // Empty label filter means only shows nodes without label
                            if (!ni.GetNodeLabels().IsEmpty())
                            {
                                continue;
                            }
                        }
                        else
                        {
                            if (!ni.GetNodeLabels().Contains(labelFilter))
                            {
                                // Only nodes have given label can show on web page.
                                continue;
                            }
                        }
                    }
                    NodeInfo info            = new NodeInfo(ni, sched);
                    int      usedMemory      = (int)info.GetUsedMemory();
                    int      availableMemory = (int)info.GetAvailableMemory();
                    Hamlet.TR <Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> >
                               > row = tbody.Tr().Td(StringUtils.Join(",", info.GetNodeLabels())).Td(info.GetRack
                                                                                                         ()).Td(info.GetState()).Td(info.GetNodeId());
                    if (isInactive)
                    {
                        row.Td().("N/A").();
                    }
                    else
                    {
                        string httpAddress = info.GetNodeHTTPAddress();
                        row.Td().A("//" + httpAddress, httpAddress).();
                    }
                    row.Td().Br().$title(info.GetLastHealthUpdate().ToString()).().(Times.Format(info
                                                                                                 .GetLastHealthUpdate())).().Td(info.GetHealthReport()).Td(info.GetNumContainers(
                                                                                                                                                               ).ToString()).Td().Br().$title(usedMemory.ToString()).().(StringUtils.ByteDesc(usedMemory
                                                                                                                                                                                                                                              * BytesInMb)).().Td().Br().$title(availableMemory.ToString()).().(StringUtils.ByteDesc
                                                                                                                                                                                                                                                                                                                    (availableMemory * BytesInMb)).().Td(info.GetUsedVirtualCores().ToString()).Td(info
                                                                                                                                                                                                                                                                                                                                                                                                   .GetAvailableVirtualCores().ToString()).Td(ni.GetNodeManagerVersion()).();
                }
                tbody.().();
            }
示例#13
0
        /*
         * (non-Javadoc)
         * @see org.apache.hadoop.yarn.webapp.view.HtmlBlock#render(org.apache.hadoop.yarn.webapp.view.HtmlBlock.Block)
         */
        protected override void Render(HtmlBlock.Block html)
        {
            string jid = $(AMParams.JobId);

            if (jid.IsEmpty())
            {
                html.P().("Sorry, can't do anything without a JobID.").();
                return;
            }
            JobId jobID = MRApps.ToJobID(jid);

            Org.Apache.Hadoop.Mapreduce.V2.App.Job.Job job = appContext.GetJob(jobID);
            if (job == null)
            {
                html.P().("Sorry, ", jid, " not found.").();
                return;
            }
            Path confPath = job.GetConfFile();

            try
            {
                ConfInfo info = new ConfInfo(job);
                html.Div().H3(confPath.ToString()).();
                Hamlet.TBODY <Hamlet.TABLE <Org.Apache.Hadoop.Yarn.Webapp.Hamlet.Hamlet> > tbody = html
                                                                                                   .Table("#conf").Thead().Tr().Th(JQueryUI.Th, "key").Th(JQueryUI.Th, "value").Th(
                    JQueryUI.Th, "source chain").().().Tbody();
                // Tasks table
                foreach (ConfEntryInfo entry in info.GetProperties())
                {
                    StringBuilder buffer  = new StringBuilder();
                    string[]      sources = entry.GetSource();
                    //Skip the last entry, because it is always the same HDFS file, and
                    // output them in reverse order so most recent is output first
                    bool first = true;
                    for (int i = (sources.Length - 2); i >= 0; i--)
                    {
                        if (!first)
                        {
                            // \u2B05 is an arrow <--
                            buffer.Append(" \u2B05 ");
                        }
                        first = false;
                        buffer.Append(sources[i]);
                    }
                    tbody.Tr().Td(entry.GetName()).Td(entry.GetValue()).Td(buffer.ToString()).();
                }
                tbody.().Tfoot().Tr().Th().Input("search_init").$type(HamletSpec.InputType.text).
                $name("key").$value("key").().().Th().Input("search_init").$type(HamletSpec.InputType
                                                                                 .text).$name("value").$value("value").().().Th().Input("search_init").$type(HamletSpec.InputType
                                                                                                                                                             .text).$name("source chain").$value("source chain").().().().().();
            }
            catch (IOException e)
            {
                Log.Error("Error while reading " + confPath, e);
                html.P().("Sorry got an error while reading conf file. ", confPath);
            }
        }