JspHelper.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:14k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.hdfs.server.namenode;
  19. import java.io.IOException;
  20. import java.io.UnsupportedEncodingException;
  21. import java.net.InetSocketAddress;
  22. import java.net.Socket;
  23. import java.util.ArrayList;
  24. import java.util.Collections;
  25. import java.util.Comparator;
  26. import java.util.Random;
  27. import java.util.TreeSet;
  28. import javax.servlet.http.HttpServletRequest;
  29. import javax.servlet.jsp.JspWriter;
  30. import org.apache.hadoop.conf.Configuration;
  31. import org.apache.hadoop.hdfs.DFSClient;
  32. import org.apache.hadoop.hdfs.protocol.DatanodeID;
  33. import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
  34. import org.apache.hadoop.hdfs.protocol.LocatedBlock;
  35. import org.apache.hadoop.hdfs.protocol.FSConstants.UpgradeAction;
  36. import org.apache.hadoop.hdfs.server.common.HdfsConstants;
  37. import org.apache.hadoop.hdfs.server.common.UpgradeStatusReport;
  38. import org.apache.hadoop.hdfs.server.datanode.DataNode;
  39. import org.apache.hadoop.fs.Path;
  40. import org.apache.hadoop.util.StringUtils;
  41. import org.apache.hadoop.net.NetUtils;
  42. import org.apache.hadoop.security.*;
  43. public class JspHelper {
  44.   final static public String WEB_UGI_PROPERTY_NAME = "dfs.web.ugi";
  45.   static FSNamesystem fsn = null;
  46.   public static InetSocketAddress nameNodeAddr;
  47.   public static final Configuration conf = new Configuration();
  48.   public static final UnixUserGroupInformation webUGI
  49.   = UnixUserGroupInformation.createImmutable(
  50.       conf.getStrings(WEB_UGI_PROPERTY_NAME));
  51.   public static final int defaultChunkSizeToView = 
  52.     conf.getInt("dfs.default.chunk.view.size", 32 * 1024);
  53.   static Random rand = new Random();
  54.   public JspHelper() {
  55.     fsn = FSNamesystem.getFSNamesystem();
  56.     if (DataNode.getDataNode() != null) {
  57.       nameNodeAddr = DataNode.getDataNode().getNameNodeAddr();
  58.     }
  59.     else {
  60.       nameNodeAddr = fsn.getDFSNameNodeAddress(); 
  61.     }      
  62.     UnixUserGroupInformation.saveToConf(conf,
  63.         UnixUserGroupInformation.UGI_PROPERTY_NAME, webUGI);
  64.   }
  65.   public DatanodeID randomNode() throws IOException {
  66.     return fsn.getRandomDatanode();
  67.   }
  68.   public DatanodeInfo bestNode(LocatedBlock blk) throws IOException {
  69.     TreeSet<DatanodeInfo> deadNodes = new TreeSet<DatanodeInfo>();
  70.     DatanodeInfo chosenNode = null;
  71.     int failures = 0;
  72.     Socket s = null;
  73.     DatanodeInfo [] nodes = blk.getLocations();
  74.     if (nodes == null || nodes.length == 0) {
  75.       throw new IOException("No nodes contain this block");
  76.     }
  77.     while (s == null) {
  78.       if (chosenNode == null) {
  79.         do {
  80.           chosenNode = nodes[rand.nextInt(nodes.length)];
  81.         } while (deadNodes.contains(chosenNode));
  82.       }
  83.       int index = rand.nextInt(nodes.length);
  84.       chosenNode = nodes[index];
  85.       //just ping to check whether the node is alive
  86.       InetSocketAddress targetAddr = NetUtils.createSocketAddr(
  87.           chosenNode.getHost() + ":" + chosenNode.getInfoPort());
  88.         
  89.       try {
  90.         s = new Socket();
  91.         s.connect(targetAddr, HdfsConstants.READ_TIMEOUT);
  92.         s.setSoTimeout(HdfsConstants.READ_TIMEOUT);
  93.       } catch (IOException e) {
  94.         deadNodes.add(chosenNode);
  95.         s.close();
  96.         s = null;
  97.         failures++;
  98.       }
  99.       if (failures == nodes.length)
  100.         throw new IOException("Could not reach the block containing the data. Please try again");
  101.         
  102.     }
  103.     s.close();
  104.     return chosenNode;
  105.   }
  106.   public void streamBlockInAscii(InetSocketAddress addr, long blockId, 
  107.                                  long genStamp, long blockSize, 
  108.                                  long offsetIntoBlock, long chunkSizeToView, JspWriter out) 
  109.     throws IOException {
  110.     if (chunkSizeToView == 0) return;
  111.     Socket s = new Socket();
  112.     s.connect(addr, HdfsConstants.READ_TIMEOUT);
  113.     s.setSoTimeout(HdfsConstants.READ_TIMEOUT);
  114.       
  115.       long amtToRead = Math.min(chunkSizeToView, blockSize - offsetIntoBlock);     
  116.       
  117.       // Use the block name for file name. 
  118.       DFSClient.BlockReader blockReader = 
  119.         DFSClient.BlockReader.newBlockReader(s, addr.toString() + ":" + blockId,
  120.                                              blockId, genStamp ,offsetIntoBlock, 
  121.                                              amtToRead, 
  122.                                              conf.getInt("io.file.buffer.size",
  123.                                                          4096));
  124.         
  125.     byte[] buf = new byte[(int)amtToRead];
  126.     int readOffset = 0;
  127.     int retries = 2;
  128.     while ( amtToRead > 0 ) {
  129.       int numRead;
  130.       try {
  131.         numRead = blockReader.readAll(buf, readOffset, (int)amtToRead);
  132.       }
  133.       catch (IOException e) {
  134.         retries--;
  135.         if (retries == 0)
  136.           throw new IOException("Could not read data from datanode");
  137.         continue;
  138.       }
  139.       amtToRead -= numRead;
  140.       readOffset += numRead;
  141.     }
  142.     blockReader = null;
  143.     s.close();
  144.     out.print(new String(buf));
  145.   }
  146.   public void DFSNodesStatus(ArrayList<DatanodeDescriptor> live,
  147.                              ArrayList<DatanodeDescriptor> dead) {
  148.     if (fsn != null)
  149.       fsn.DFSNodesStatus(live, dead);
  150.   }
  151.   public void addTableHeader(JspWriter out) throws IOException {
  152.     out.print("<table border="1""+
  153.               " cellpadding="2" cellspacing="2">");
  154.     out.print("<tbody>");
  155.   }
  156.   public void addTableRow(JspWriter out, String[] columns) throws IOException {
  157.     out.print("<tr>");
  158.     for (int i = 0; i < columns.length; i++) {
  159.       out.print("<td style="vertical-align: top;"><B>"+columns[i]+"</B><br></td>");
  160.     }
  161.     out.print("</tr>");
  162.   }
  163.   public void addTableRow(JspWriter out, String[] columns, int row) throws IOException {
  164.     out.print("<tr>");
  165.       
  166.     for (int i = 0; i < columns.length; i++) {
  167.       if (row/2*2 == row) {//even
  168.         out.print("<td style="vertical-align: top;background-color:LightGrey;"><B>"+columns[i]+"</B><br></td>");
  169.       } else {
  170.         out.print("<td style="vertical-align: top;background-color:LightBlue;"><B>"+columns[i]+"</B><br></td>");
  171.           
  172.       }
  173.     }
  174.     out.print("</tr>");
  175.   }
  176.   public void addTableFooter(JspWriter out) throws IOException {
  177.     out.print("</tbody></table>");
  178.   }
  179.   public String getSafeModeText() {
  180.     if (!fsn.isInSafeMode())
  181.       return "";
  182.     return "Safe mode is ON. <em>" + fsn.getSafeModeTip() + "</em><br>";
  183.   }
  184.   public static String getWarningText(FSNamesystem fsn) {
  185.     // Ideally this should be displayed in RED
  186.     long missingBlocks = fsn.getMissingBlocksCount();
  187.     if (missingBlocks > 0) {
  188.       return "<br> WARNING :" + 
  189.              " There are about " + missingBlocks +
  190.              " missing blocks. Please check the log or run fsck. <br><br>";
  191.     }
  192.     return "";
  193.   }
  194.   
  195.   public String getInodeLimitText() {
  196.     long inodes = fsn.dir.totalInodes();
  197.     long blocks = fsn.getBlocksTotal();
  198.     long maxobjects = fsn.getMaxObjects();
  199.     long totalMemory = Runtime.getRuntime().totalMemory();   
  200.     long maxMemory = Runtime.getRuntime().maxMemory();   
  201.     long used = (totalMemory * 100)/maxMemory;
  202.  
  203.     String str = inodes + " files and directories, " +
  204.                  blocks + " blocks = " +
  205.                  (inodes + blocks) + " total";
  206.     if (maxobjects != 0) {
  207.       long pct = ((inodes + blocks) * 100)/maxobjects;
  208.       str += " / " + maxobjects + " (" + pct + "%)";
  209.     }
  210.     str += ".  Heap Size is " + StringUtils.byteDesc(totalMemory) + " / " + 
  211.            StringUtils.byteDesc(maxMemory) + 
  212.            " (" + used + "%) <br>";
  213.     return str;
  214.   }
  215.   public String getUpgradeStatusText() {
  216.     String statusText = "";
  217.     try {
  218.       UpgradeStatusReport status = 
  219.         fsn.distributedUpgradeProgress(UpgradeAction.GET_STATUS);
  220.       statusText = (status == null ? 
  221.           "There are no upgrades in progress." :
  222.             status.getStatusText(false));
  223.     } catch(IOException e) {
  224.       statusText = "Upgrade status unknown.";
  225.     }
  226.     return statusText;
  227.   }
  228.   public void sortNodeList(ArrayList<DatanodeDescriptor> nodes,
  229.                            String field, String order) {
  230.         
  231.     class NodeComapare implements Comparator<DatanodeDescriptor> {
  232.       static final int 
  233.         FIELD_NAME              = 1,
  234.         FIELD_LAST_CONTACT      = 2,
  235.         FIELD_BLOCKS            = 3,
  236.         FIELD_CAPACITY          = 4,
  237.         FIELD_USED              = 5,
  238.         FIELD_PERCENT_USED      = 6,
  239.         FIELD_NONDFS_USED       = 7,
  240.         FIELD_REMAINING         = 8,
  241.         FIELD_PERCENT_REMAINING = 9,
  242.         SORT_ORDER_ASC          = 1,
  243.         SORT_ORDER_DSC          = 2;
  244.       int sortField = FIELD_NAME;
  245.       int sortOrder = SORT_ORDER_ASC;
  246.             
  247.       public NodeComapare(String field, String order) {
  248.         if (field.equals("lastcontact")) {
  249.           sortField = FIELD_LAST_CONTACT;
  250.         } else if (field.equals("capacity")) {
  251.           sortField = FIELD_CAPACITY;
  252.         } else if (field.equals("used")) {
  253.           sortField = FIELD_USED;
  254.         } else if (field.equals("nondfsused")) {
  255.           sortField = FIELD_NONDFS_USED;
  256.         } else if (field.equals("remaining")) {
  257.           sortField = FIELD_REMAINING;
  258.         } else if (field.equals("pcused")) {
  259.           sortField = FIELD_PERCENT_USED;
  260.         } else if (field.equals("pcremaining")) {
  261.           sortField = FIELD_PERCENT_REMAINING;
  262.         } else if (field.equals("blocks")) {
  263.           sortField = FIELD_BLOCKS;
  264.         } else {
  265.           sortField = FIELD_NAME;
  266.         }
  267.                 
  268.         if (order.equals("DSC")) {
  269.           sortOrder = SORT_ORDER_DSC;
  270.         } else {
  271.           sortOrder = SORT_ORDER_ASC;
  272.         }
  273.       }
  274.       public int compare(DatanodeDescriptor d1,
  275.                          DatanodeDescriptor d2) {
  276.         int ret = 0;
  277.         switch (sortField) {
  278.         case FIELD_LAST_CONTACT:
  279.           ret = (int) (d2.getLastUpdate() - d1.getLastUpdate());
  280.           break;
  281.         case FIELD_CAPACITY:
  282.           long  dlong = d1.getCapacity() - d2.getCapacity();
  283.           ret = (dlong < 0) ? -1 : ((dlong > 0) ? 1 : 0);
  284.           break;
  285.         case FIELD_USED:
  286.           dlong = d1.getDfsUsed() - d2.getDfsUsed();
  287.           ret = (dlong < 0) ? -1 : ((dlong > 0) ? 1 : 0);
  288.           break;
  289.         case FIELD_NONDFS_USED:
  290.           dlong = d1.getNonDfsUsed() - d2.getNonDfsUsed();
  291.           ret = (dlong < 0) ? -1 : ((dlong > 0) ? 1 : 0);
  292.           break;
  293.         case FIELD_REMAINING:
  294.           dlong = d1.getRemaining() - d2.getRemaining();
  295.           ret = (dlong < 0) ? -1 : ((dlong > 0) ? 1 : 0);
  296.           break;
  297.         case FIELD_PERCENT_USED:
  298.           double ddbl =((d1.getDfsUsedPercent())-
  299.                         (d2.getDfsUsedPercent()));
  300.           ret = (ddbl < 0) ? -1 : ((ddbl > 0) ? 1 : 0);
  301.           break;
  302.         case FIELD_PERCENT_REMAINING:
  303.           ddbl =((d1.getRemainingPercent())-
  304.                  (d2.getRemainingPercent()));
  305.           ret = (ddbl < 0) ? -1 : ((ddbl > 0) ? 1 : 0);
  306.           break;
  307.         case FIELD_BLOCKS:
  308.           ret = d1.numBlocks() - d2.numBlocks();
  309.           break;
  310.         case FIELD_NAME: 
  311.           ret = d1.getHostName().compareTo(d2.getHostName());
  312.           break;
  313.         }
  314.         return (sortOrder == SORT_ORDER_DSC) ? -ret : ret;
  315.       }
  316.     }
  317.         
  318.     Collections.sort(nodes, new NodeComapare(field, order));
  319.   }
  320.   public static void printPathWithLinks(String dir, JspWriter out, int namenodeInfoPort ) throws IOException {
  321.     try {
  322.       String[] parts = dir.split(Path.SEPARATOR);
  323.       StringBuilder tempPath = new StringBuilder(dir.length());
  324.       out.print("<a href="browseDirectory.jsp" + "?dir="+ Path.SEPARATOR
  325.           + "&namenodeInfoPort=" + namenodeInfoPort
  326.           + "">" + Path.SEPARATOR + "</a>");
  327.       tempPath.append(Path.SEPARATOR);
  328.       for (int i = 0; i < parts.length-1; i++) {
  329.         if (!parts[i].equals("")) {
  330.           tempPath.append(parts[i]);
  331.           out.print("<a href="browseDirectory.jsp" + "?dir="
  332.               + tempPath.toString() + "&namenodeInfoPort=" + namenodeInfoPort);
  333.           out.print("">" + parts[i] + "</a>" + Path.SEPARATOR);
  334.           tempPath.append(Path.SEPARATOR);
  335.         }
  336.       }
  337.       if(parts.length > 0) {
  338.         out.print(parts[parts.length-1]);
  339.       }
  340.     }
  341.     catch (UnsupportedEncodingException ex) {
  342.       ex.printStackTrace();
  343.     }
  344.   }
  345.   public static void printGotoForm(JspWriter out, int namenodeInfoPort, String file) throws IOException {
  346.     out.print("<form action="browseDirectory.jsp" method="get" name="goto">");
  347.     out.print("Goto : ");
  348.     out.print("<input name="dir" type="text" width="50" id"dir" value=""+ file+"">");
  349.     out.print("<input name="go" type="submit" value="go">");
  350.     out.print("<input name="namenodeInfoPort" type="hidden" "
  351.         + "value="" + namenodeInfoPort  + "">");
  352.     out.print("</form>");
  353.   }
  354.   
  355.   public static void createTitle(JspWriter out, 
  356.       HttpServletRequest req, String  file) throws IOException{
  357.     if(file == null) file = "";
  358.     int start = Math.max(0,file.length() - 100);
  359.     if(start != 0)
  360.       file = "..." + file.substring(start, file.length());
  361.     out.print("<title>HDFS:" + file + "</title>");
  362.   }
  363. }