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

网格计算

开发平台:

Java

  1. <%@ page
  2.   contentType="text/html; charset=UTF-8"
  3.   import="javax.servlet.*"
  4.   import="javax.servlet.http.*"
  5.   import="java.io.*"
  6.   import="java.util.*"
  7.   import="java.net.*"
  8.   import="org.apache.hadoop.hdfs.*"
  9.   import="org.apache.hadoop.hdfs.server.namenode.*"
  10.   import="org.apache.hadoop.hdfs.server.datanode.*"
  11.   import="org.apache.hadoop.hdfs.protocol.*"
  12.   import="org.apache.hadoop.io.*"
  13.   import="org.apache.hadoop.conf.*"
  14.   import="org.apache.hadoop.net.DNS"
  15.   import="org.apache.hadoop.util.*"
  16.   import="java.text.DateFormat"
  17. %>
  18. <%!
  19.   static JspHelper jspHelper = new JspHelper();
  20.   public void generateFileDetails(JspWriter out, HttpServletRequest req) 
  21.     throws IOException {
  22.     int chunkSizeToView = 0;
  23.     long startOffset = 0;
  24.     int datanodePort;
  25.     String blockIdStr = null;
  26.     long currBlockId = 0;
  27.     blockIdStr = req.getParameter("blockId");
  28.     if (blockIdStr == null) {
  29.       out.print("Invalid input (blockId absent)");
  30.       return;
  31.     }
  32.     currBlockId = Long.parseLong(blockIdStr);
  33.     String datanodePortStr = req.getParameter("datanodePort");
  34.     if (datanodePortStr == null) {
  35.       out.print("Invalid input (datanodePort absent)");
  36.       return;
  37.     }
  38.     datanodePort = Integer.parseInt(datanodePortStr);
  39.     String namenodeInfoPortStr = req.getParameter("namenodeInfoPort");
  40.     int namenodeInfoPort = -1;
  41.     if (namenodeInfoPortStr != null)
  42.       namenodeInfoPort = Integer.parseInt(namenodeInfoPortStr);
  43.     String chunkSizeToViewStr = req.getParameter("chunkSizeToView");
  44.     if (chunkSizeToViewStr != null && Integer.parseInt(chunkSizeToViewStr) > 0)
  45.       chunkSizeToView = Integer.parseInt(chunkSizeToViewStr);
  46.     else chunkSizeToView = jspHelper.defaultChunkSizeToView;
  47.     String startOffsetStr = req.getParameter("startOffset");
  48.     if (startOffsetStr == null || Long.parseLong(startOffsetStr) < 0)
  49.       startOffset = 0;
  50.     else startOffset = Long.parseLong(startOffsetStr);
  51.     
  52.     String filename = req.getParameter("filename");
  53.     if (filename == null || filename.length() == 0) {
  54.       out.print("Invalid input");
  55.       return;
  56.     }
  57.     String blockSizeStr = req.getParameter("blockSize"); 
  58.     long blockSize = 0;
  59.     if (blockSizeStr == null || blockSizeStr.length() == 0) {
  60.       out.print("Invalid input");
  61.       return;
  62.     } 
  63.     blockSize = Long.parseLong(blockSizeStr);
  64.     DFSClient dfs = new DFSClient(jspHelper.nameNodeAddr, jspHelper.conf);
  65.     List<LocatedBlock> blocks = 
  66.       dfs.namenode.getBlockLocations(filename, 0, Long.MAX_VALUE).getLocatedBlocks();
  67.     //Add the various links for looking at the file contents
  68.     //URL for downloading the full file
  69.     String downloadUrl = "http://" + req.getServerName() + ":" +
  70.                          + req.getServerPort() + "/streamFile?" + "filename=" +
  71.                          URLEncoder.encode(filename, "UTF-8");
  72.     out.print("<a name="viewOptions"></a>");
  73.     out.print("<a href="" + downloadUrl + "">Download this file</a><br>");
  74.     
  75.     DatanodeInfo chosenNode;
  76.     //URL for TAIL 
  77.     LocatedBlock lastBlk = blocks.get(blocks.size() - 1);
  78.     long blockId = lastBlk.getBlock().getBlockId();
  79.     try {
  80.       chosenNode = jspHelper.bestNode(lastBlk);
  81.     } catch (IOException e) {
  82.       out.print(e.toString());
  83.       dfs.close();
  84.       return;
  85.     }
  86.     String fqdn = 
  87.            InetAddress.getByName(chosenNode.getHost()).getCanonicalHostName();
  88.     String tailUrl = "http://" + fqdn + ":" +
  89.                      chosenNode.getInfoPort() + 
  90.                  "/tail.jsp?filename=" + URLEncoder.encode(filename, "UTF-8") +
  91.                  "&namenodeInfoPort=" + namenodeInfoPort +
  92.                  "&chunkSizeToView=" + chunkSizeToView +
  93.                  "&referrer=" + 
  94.           URLEncoder.encode(req.getRequestURL() + "?" + req.getQueryString(),
  95.                             "UTF-8");
  96.     out.print("<a href="" + tailUrl + "">Tail this file</a><br>");
  97.     out.print("<form action="/browseBlock.jsp" method=GET>");
  98.     out.print("<b>Chunk size to view (in bytes, up to file's DFS block size): </b>");
  99.     out.print("<input type="hidden" name="blockId" value="" + currBlockId +
  100.               "">");
  101.     out.print("<input type="hidden" name="blockSize" value="" + 
  102.               blockSize + "">");
  103.     out.print("<input type="hidden" name="startOffset" value="" + 
  104.               startOffset + "">");
  105.     out.print("<input type="hidden" name="filename" value="" + filename +
  106.               "">");
  107.     out.print("<input type="hidden" name="datanodePort" value="" + 
  108.               datanodePort+ "">");
  109.     out.print("<input type="hidden" name="namenodeInfoPort" value="" +
  110.               namenodeInfoPort + "">");
  111.     out.print("<input type="text" name="chunkSizeToView" value=" +
  112.               chunkSizeToView + " size=10 maxlength=10>");
  113.     out.print("&nbsp;&nbsp;<input type="submit" name="submit" value="Refresh">");
  114.     out.print("</form>");
  115.     out.print("<hr>"); 
  116.     out.print("<a name="blockDetails"></a>");
  117.     out.print("<B>Total number of blocks: "+blocks.size()+"</B><br>");
  118.     //generate a table and dump the info
  119.     out.println("n<table>");
  120.     for (LocatedBlock cur : blocks) {
  121.       out.print("<tr>");
  122.       blockId = cur.getBlock().getBlockId();
  123.       blockSize = cur.getBlock().getNumBytes();
  124.       String blk = "blk_" + Long.toString(blockId);
  125.       out.print("<td>"+Long.toString(blockId)+":</td>");
  126.       DatanodeInfo[] locs = cur.getLocations();
  127.       for(int j=0; j<locs.length; j++) {
  128.         String datanodeAddr = locs[j].getName();
  129.         datanodePort = Integer.parseInt(datanodeAddr.substring(
  130.                                         datanodeAddr.indexOf(':') + 1, 
  131.                                     datanodeAddr.length())); 
  132.         fqdn = InetAddress.getByName(locs[j].getHost()).getCanonicalHostName();
  133.         String blockUrl = "http://"+ fqdn + ":" +
  134.                         locs[j].getInfoPort() +
  135.                         "/browseBlock.jsp?blockId=" + Long.toString(blockId) +
  136.                         "&blockSize=" + blockSize +
  137.                "&filename=" + URLEncoder.encode(filename, "UTF-8")+ 
  138.                         "&datanodePort=" + datanodePort + 
  139.                         "&genstamp=" + cur.getBlock().getGenerationStamp() + 
  140.                         "&namenodeInfoPort=" + namenodeInfoPort +
  141.                         "&chunkSizeToView=" + chunkSizeToView;
  142.         out.print("<td>&nbsp</td>" 
  143.           + "<td><a href="" + blockUrl + "">" + datanodeAddr + "</a></td>");
  144.       }
  145.       out.println("</tr>");
  146.     }
  147.     out.println("</table>");
  148.     out.print("<hr>");
  149.     String namenodeHost = jspHelper.nameNodeAddr.getHostName();
  150.     out.print("<br><a href="http://" + 
  151.               InetAddress.getByName(namenodeHost).getCanonicalHostName() + ":" +
  152.               namenodeInfoPort + "/dfshealth.jsp">Go back to DFS home</a>");
  153.     dfs.close();
  154.   }
  155.   public void generateFileChunks(JspWriter out, HttpServletRequest req) 
  156.     throws IOException {
  157.     long startOffset = 0;
  158.     int datanodePort = 0; 
  159.     int chunkSizeToView = 0;
  160.     String namenodeInfoPortStr = req.getParameter("namenodeInfoPort");
  161.     int namenodeInfoPort = -1;
  162.     if (namenodeInfoPortStr != null)
  163.       namenodeInfoPort = Integer.parseInt(namenodeInfoPortStr);
  164.     String filename = req.getParameter("filename");
  165.     if (filename == null) {
  166.       out.print("Invalid input (filename absent)");
  167.       return;
  168.     }
  169.     
  170.     String blockIdStr = null;
  171.     long blockId = 0;
  172.     blockIdStr = req.getParameter("blockId");
  173.     if (blockIdStr == null) {
  174.       out.print("Invalid input (blockId absent)");
  175.       return;
  176.     }
  177.     blockId = Long.parseLong(blockIdStr);
  178.     String blockGenStamp = null;
  179.     long genStamp = 0;
  180.     blockGenStamp = req.getParameter("genstamp");
  181.     if (blockGenStamp == null) {
  182.       out.print("Invalid input (genstamp absent)");
  183.       return;
  184.     }
  185.     genStamp = Long.parseLong(blockGenStamp);
  186.     String blockSizeStr;
  187.     long blockSize = 0;
  188.     blockSizeStr = req.getParameter("blockSize"); 
  189.     if (blockSizeStr == null) {
  190.       out.print("Invalid input (blockSize absent)");
  191.       return;
  192.     }
  193.     blockSize = Long.parseLong(blockSizeStr);
  194.     
  195.     String chunkSizeToViewStr = req.getParameter("chunkSizeToView");
  196.     if (chunkSizeToViewStr != null && Integer.parseInt(chunkSizeToViewStr) > 0)
  197.       chunkSizeToView = Integer.parseInt(chunkSizeToViewStr);
  198.     else chunkSizeToView = jspHelper.defaultChunkSizeToView;
  199.     String startOffsetStr = req.getParameter("startOffset");
  200.     if (startOffsetStr == null || Long.parseLong(startOffsetStr) < 0)
  201.       startOffset = 0;
  202.     else startOffset = Long.parseLong(startOffsetStr);
  203.     String datanodePortStr = req.getParameter("datanodePort");
  204.     if (datanodePortStr == null) {
  205.       out.print("Invalid input (datanodePort absent)");
  206.       return;
  207.     }
  208.     datanodePort = Integer.parseInt(datanodePortStr);
  209.     out.print("<h3>File: ");
  210.     JspHelper.printPathWithLinks(filename, out, namenodeInfoPort);
  211.     out.print("</h3><hr>");
  212.     String parent = new File(filename).getParent();
  213.     JspHelper.printGotoForm(out, namenodeInfoPort, parent);
  214.     out.print("<hr>");
  215.     out.print("<a href="http://" + req.getServerName() + ":" + 
  216.               req.getServerPort() + 
  217.               "/browseDirectory.jsp?dir=" + 
  218.               URLEncoder.encode(parent, "UTF-8") +
  219.               "&namenodeInfoPort=" + namenodeInfoPort + 
  220.               ""><i>Go back to dir listing</i></a><br>");
  221.     out.print("<a href="#viewOptions">Advanced view/download options</a><br>");
  222.     out.print("<hr>");
  223.     //Determine the prev & next blocks
  224.     DFSClient dfs = new DFSClient(jspHelper.nameNodeAddr, jspHelper.conf);
  225.     long nextStartOffset = 0;
  226.     long nextBlockSize = 0;
  227.     String nextBlockIdStr = null;
  228.     String nextGenStamp = null;
  229.     String nextHost = req.getServerName();
  230.     int nextPort = req.getServerPort();
  231.     int nextDatanodePort = datanodePort;
  232.     //determine data for the next link
  233.     if (startOffset + chunkSizeToView >= blockSize) {
  234.       //we have to go to the next block from this point onwards
  235.       List<LocatedBlock> blocks = 
  236.         dfs.namenode.getBlockLocations(filename, 0, Long.MAX_VALUE).getLocatedBlocks();
  237.       for (int i = 0; i < blocks.size(); i++) {
  238.         if (blocks.get(i).getBlock().getBlockId() == blockId) {
  239.           if (i != blocks.size() - 1) {
  240.             LocatedBlock nextBlock = blocks.get(i+1);
  241.             nextBlockIdStr = Long.toString(nextBlock.getBlock().getBlockId());
  242.             nextGenStamp = Long.toString(nextBlock.getBlock().getGenerationStamp());
  243.             nextStartOffset = 0;
  244.             nextBlockSize = nextBlock.getBlock().getNumBytes();
  245.             DatanodeInfo d = jspHelper.bestNode(nextBlock);
  246.             String datanodeAddr = d.getName();
  247.             nextDatanodePort = Integer.parseInt(
  248.                                       datanodeAddr.substring(
  249.                                            datanodeAddr.indexOf(':') + 1, 
  250.                                       datanodeAddr.length())); 
  251.             nextHost = InetAddress.getByName(d.getHost()).getCanonicalHostName();
  252.             nextPort = d.getInfoPort(); 
  253.           }
  254.         }
  255.       }
  256.     } 
  257.     else {
  258.       //we are in the same block
  259.       nextBlockIdStr = blockIdStr;
  260.       nextStartOffset = startOffset + chunkSizeToView;
  261.       nextBlockSize = blockSize;
  262.       nextGenStamp = blockGenStamp;
  263.     }
  264.     String nextUrl = null;
  265.     if (nextBlockIdStr != null) {
  266.       nextUrl = "http://" + nextHost + ":" + 
  267.                 nextPort + 
  268.                 "/browseBlock.jsp?blockId=" + nextBlockIdStr +
  269.                 "&blockSize=" + nextBlockSize + "&startOffset=" + 
  270.                 nextStartOffset + 
  271.                 "&genstamp=" + nextGenStamp +
  272.                 "&filename=" + URLEncoder.encode(filename, "UTF-8") +
  273.                 "&chunkSizeToView=" + chunkSizeToView + 
  274.                 "&datanodePort=" + nextDatanodePort +
  275.                 "&namenodeInfoPort=" + namenodeInfoPort;
  276.       out.print("<a href="" + nextUrl + "">View Next chunk</a>&nbsp;&nbsp;");        
  277.     }
  278.     //determine data for the prev link
  279.     String prevBlockIdStr = null;
  280.     String prevGenStamp = null;
  281.     long prevStartOffset = 0;
  282.     long prevBlockSize = 0;
  283.     String prevHost = req.getServerName();
  284.     int prevPort = req.getServerPort();
  285.     int prevDatanodePort = datanodePort;
  286.     if (startOffset == 0) {
  287.       List<LocatedBlock> blocks = 
  288.         dfs.namenode.getBlockLocations(filename, 0, Long.MAX_VALUE).getLocatedBlocks();
  289.       for (int i = 0; i < blocks.size(); i++) {
  290.         if (blocks.get(i).getBlock().getBlockId() == blockId) {
  291.           if (i != 0) {
  292.             LocatedBlock prevBlock = blocks.get(i-1);
  293.             prevBlockIdStr = Long.toString(prevBlock.getBlock().getBlockId());
  294.             prevGenStamp = Long.toString(prevBlock.getBlock().getGenerationStamp());
  295.             prevStartOffset = prevBlock.getBlock().getNumBytes() - chunkSizeToView;
  296.             if (prevStartOffset < 0)
  297.               prevStartOffset = 0;
  298.             prevBlockSize = prevBlock.getBlock().getNumBytes();
  299.             DatanodeInfo d = jspHelper.bestNode(prevBlock);
  300.             String datanodeAddr = d.getName();
  301.             prevDatanodePort = Integer.parseInt(
  302.                                       datanodeAddr.substring(
  303.                                           datanodeAddr.indexOf(':') + 1, 
  304.                                       datanodeAddr.length())); 
  305.             prevHost = InetAddress.getByName(d.getHost()).getCanonicalHostName();
  306.             prevPort = d.getInfoPort();
  307.           }
  308.         }
  309.       }
  310.     }
  311.     else {
  312.       //we are in the same block
  313.       prevBlockIdStr = blockIdStr;
  314.       prevStartOffset = startOffset - chunkSizeToView;
  315.       if (prevStartOffset < 0) prevStartOffset = 0;
  316.       prevBlockSize = blockSize;
  317.       prevGenStamp = blockGenStamp;
  318.     }
  319.     String prevUrl = null;
  320.     if (prevBlockIdStr != null) {
  321.       prevUrl = "http://" + prevHost + ":" + 
  322.                 prevPort + 
  323.                 "/browseBlock.jsp?blockId=" + prevBlockIdStr + 
  324.                 "&blockSize=" + prevBlockSize + "&startOffset=" + 
  325.                 prevStartOffset + 
  326.                 "&filename=" + URLEncoder.encode(filename, "UTF-8") + 
  327.                 "&chunkSizeToView=" + chunkSizeToView +
  328.                 "&genstamp=" + prevGenStamp +
  329.                 "&datanodePort=" + prevDatanodePort +
  330.                 "&namenodeInfoPort=" + namenodeInfoPort;
  331.       out.print("<a href="" + prevUrl + "">View Prev chunk</a>&nbsp;&nbsp;");
  332.     }
  333.     out.print("<hr>");
  334.     out.print("<textarea cols="100" rows="25" wrap="virtual" style="width:100%" READONLY>");
  335.     try {
  336.     jspHelper.streamBlockInAscii(
  337.             new InetSocketAddress(req.getServerName(), datanodePort), blockId, 
  338.             genStamp, blockSize, startOffset, chunkSizeToView, out);
  339.     } catch (Exception e){
  340.         out.print(e);
  341.     }
  342.     out.print("</textarea>");
  343.     dfs.close();
  344.   }
  345. %>
  346. <html>
  347. <head>
  348. <%JspHelper.createTitle(out, request, request.getParameter("filename")); %>
  349. </head>
  350. <body onload="document.goto.dir.focus()">
  351. <% 
  352.    generateFileChunks(out,request);
  353. %>
  354. <hr>
  355. <% 
  356.    generateFileDetails(out,request);
  357. %>
  358. <h2>Local logs</h2>
  359. <a href="/logs/">Log</a> directory
  360. <%
  361. out.println(ServletUtil.htmlFooter());
  362. %>