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

网格计算

开发平台:

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.net.URI;
  21. import java.net.URISyntaxException;
  22. import javax.servlet.http.HttpServletRequest;
  23. import javax.servlet.http.HttpServletResponse;
  24. import org.apache.hadoop.fs.FileStatus;
  25. import org.apache.hadoop.hdfs.protocol.ClientProtocol;
  26. import org.apache.hadoop.hdfs.protocol.DatanodeID;
  27. import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
  28. import org.apache.hadoop.hdfs.protocol.LocatedBlocks;
  29. import org.apache.hadoop.security.UnixUserGroupInformation;
  30. /** Redirect queries about the hosted filesystem to an appropriate datanode.
  31.  * @see org.apache.hadoop.hdfs.HftpFileSystem
  32.  */
  33. public class FileDataServlet extends DfsServlet {
  34.   /** Create a redirection URI */
  35.   protected URI createUri(FileStatus i, UnixUserGroupInformation ugi,
  36.       ClientProtocol nnproxy, HttpServletRequest request)
  37.       throws IOException, URISyntaxException {
  38.     String scheme = request.getScheme();
  39.     final DatanodeID host = pickSrcDatanode(i, nnproxy);
  40.     final String hostname;
  41.     if (host instanceof DatanodeInfo) {
  42.       hostname = ((DatanodeInfo)host).getHostName();
  43.     } else {
  44.       hostname = host.getHost();
  45.     }
  46.     return new URI(scheme, null, hostname,
  47.         "https".equals(scheme)
  48.           ? (Integer)getServletContext().getAttribute("datanode.https.port")
  49.           : host.getInfoPort(),
  50.         "/streamFile", "filename=" + i.getPath() + "&ugi=" + ugi, null);
  51.   }
  52.   private static JspHelper jspHelper = null;
  53.   /** Select a datanode to service this request.
  54.    * Currently, this looks at no more than the first five blocks of a file,
  55.    * selecting a datanode randomly from the most represented.
  56.    */
  57.   private static DatanodeID pickSrcDatanode(FileStatus i,
  58.       ClientProtocol nnproxy) throws IOException {
  59.     // a race condition can happen by initializing a static member this way.
  60.     // A proper fix should make JspHelper a singleton. Since it doesn't affect 
  61.     // correctness, we leave it as is for now.
  62.     if (jspHelper == null)
  63.       jspHelper = new JspHelper();
  64.     final LocatedBlocks blks = nnproxy.getBlockLocations(
  65.         i.getPath().toUri().getPath(), 0, 1);
  66.     if (i.getLen() == 0 || blks.getLocatedBlocks().size() <= 0) {
  67.       // pick a random datanode
  68.       return jspHelper.randomNode();
  69.     }
  70.     return jspHelper.bestNode(blks.get(0));
  71.   }
  72.   /**
  73.    * Service a GET request as described below.
  74.    * Request:
  75.    * {@code
  76.    * GET http://<nn>:<port>/data[/<path>] HTTP/1.1
  77.    * }
  78.    */
  79.   public void doGet(HttpServletRequest request, HttpServletResponse response)
  80.     throws IOException {
  81.     final UnixUserGroupInformation ugi = getUGI(request);
  82.     final ClientProtocol nnproxy = createNameNodeProxy(ugi);
  83.     try {
  84.       final String path = request.getPathInfo() != null
  85.         ? request.getPathInfo() : "/";
  86.       FileStatus info = nnproxy.getFileInfo(path);
  87.       if ((info != null) && !info.isDir()) {
  88.         response.sendRedirect(createUri(info, ugi, nnproxy,
  89.               request).toURL().toString());
  90.       } else if (info == null){
  91.         response.sendError(400, "cat: File not found " + path);
  92.       } else {
  93.         response.sendError(400, "cat: " + path + ": is a directory");
  94.       }
  95.     } catch (URISyntaxException e) {
  96.       response.getWriter().println(e.toString());
  97.     } catch (IOException e) {
  98.       response.sendError(400, e.getMessage());
  99.     }
  100.   }
  101. }