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

网格计算

开发平台:

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.fs;
  19. import org.apache.hadoop.io.*;
  20. import java.io.*;
  21. /*
  22.  * A BlockLocation lists hosts, offset and length
  23.  * of block. 
  24.  * 
  25.  */
  26. public class BlockLocation implements Writable {
  27.   static {               // register a ctor
  28.     WritableFactories.setFactory
  29.       (BlockLocation.class,
  30.        new WritableFactory() {
  31.          public Writable newInstance() { return new BlockLocation(); }
  32.        });
  33.   }
  34.   private String[] hosts; //hostnames of datanodes
  35.   private String[] names; //hostname:portNumber of datanodes
  36.   private String[] topologyPaths; // full path name in network topology
  37.   private long offset;  //offset of the of the block in the file
  38.   private long length;
  39.   /**
  40.    * Default Constructor
  41.    */
  42.   public BlockLocation() {
  43.     this(new String[0], new String[0],  0L, 0L);
  44.   }
  45.   /**
  46.    * Constructor with host, name, offset and length
  47.    */
  48.   public BlockLocation(String[] names, String[] hosts, long offset, 
  49.                        long length) {
  50.     if (names == null) {
  51.       this.names = new String[0];
  52.     } else {
  53.       this.names = names;
  54.     }
  55.     if (hosts == null) {
  56.       this.hosts = new String[0];
  57.     } else {
  58.       this.hosts = hosts;
  59.     }
  60.     this.offset = offset;
  61.     this.length = length;
  62.     this.topologyPaths = new String[0];
  63.   }
  64.   /**
  65.    * Constructor with host, name, network topology, offset and length
  66.    */
  67.   public BlockLocation(String[] names, String[] hosts, String[] topologyPaths,
  68.                        long offset, long length) {
  69.     this(names, hosts, offset, length);
  70.     if (topologyPaths == null) {
  71.       this.topologyPaths = new String[0];
  72.     } else {
  73.       this.topologyPaths = topologyPaths;
  74.     }
  75.   }
  76.   /**
  77.    * Get the list of hosts (hostname) hosting this block
  78.    */
  79.   public String[] getHosts() throws IOException {
  80.     if ((hosts == null) || (hosts.length == 0)) {
  81.       return new String[0];
  82.     } else {
  83.       return hosts;
  84.     }
  85.   }
  86.   /**
  87.    * Get the list of names (hostname:port) hosting this block
  88.    */
  89.   public String[] getNames() throws IOException {
  90.     if ((names == null) || (names.length == 0)) {
  91.       return new String[0];
  92.     } else {
  93.       return this.names;
  94.     }
  95.   }
  96.   /**
  97.    * Get the list of network topology paths for each of the hosts.
  98.    * The last component of the path is the host.
  99.    */
  100.   public String[] getTopologyPaths() throws IOException {
  101.     if ((topologyPaths == null) || (topologyPaths.length == 0)) {
  102.       return new String[0];
  103.     } else {
  104.       return this.topologyPaths;
  105.     }
  106.   }
  107.   
  108.   /**
  109.    * Get the start offset of file associated with this block
  110.    */
  111.   public long getOffset() {
  112.     return offset;
  113.   }
  114.   
  115.   /**
  116.    * Get the length of the block
  117.    */
  118.   public long getLength() {
  119.     return length;
  120.   }
  121.   
  122.   /**
  123.    * Set the start offset of file associated with this block
  124.    */
  125.   public void setOffset(long offset) {
  126.     this.offset = offset;
  127.   }
  128.   /**
  129.    * Set the length of block
  130.    */
  131.   public void setLength(long length) {
  132.     this.length = length;
  133.   }
  134.   /**
  135.    * Set the hosts hosting this block
  136.    */
  137.   public void setHosts(String[] hosts) throws IOException {
  138.     if (hosts == null) {
  139.       this.hosts = new String[0];
  140.     } else {
  141.       this.hosts = hosts;
  142.     }
  143.   }
  144.   /**
  145.    * Set the names (host:port) hosting this block
  146.    */
  147.   public void setNames(String[] names) throws IOException {
  148.     if (names == null) {
  149.       this.names = new String[0];
  150.     } else {
  151.       this.names = names;
  152.     }
  153.   }
  154.   /**
  155.    * Set the network topology paths of the hosts
  156.    */
  157.   public void setTopologyPaths(String[] topologyPaths) throws IOException {
  158.     if (topologyPaths == null) {
  159.       this.topologyPaths = new String[0];
  160.     } else {
  161.       this.topologyPaths = topologyPaths;
  162.     }
  163.   }
  164.   /**
  165.    * Implement write of Writable
  166.    */
  167.   public void write(DataOutput out) throws IOException {
  168.     out.writeLong(offset);
  169.     out.writeLong(length);
  170.     out.writeInt(names.length);
  171.     for (int i=0; i < names.length; i++) {
  172.       Text name = new Text(names[i]);
  173.       name.write(out);
  174.     }
  175.     out.writeInt(hosts.length);
  176.     for (int i=0; i < hosts.length; i++) {
  177.       Text host = new Text(hosts[i]);
  178.       host.write(out);
  179.     }
  180.     out.writeInt(topologyPaths.length);
  181.     for (int i=0; i < topologyPaths.length; i++) {
  182.       Text host = new Text(topologyPaths[i]);
  183.       host.write(out);
  184.     }
  185.   }
  186.   
  187.   /**
  188.    * Implement readFields of Writable
  189.    */
  190.   public void readFields(DataInput in) throws IOException {
  191.     this.offset = in.readLong();
  192.     this.length = in.readLong();
  193.     int numNames = in.readInt();
  194.     this.names = new String[numNames];
  195.     for (int i = 0; i < numNames; i++) {
  196.       Text name = new Text();
  197.       name.readFields(in);
  198.       names[i] = name.toString();
  199.     }
  200.     int numHosts = in.readInt();
  201.     for (int i = 0; i < numHosts; i++) {
  202.       Text host = new Text();
  203.       host.readFields(in);
  204.       hosts[i] = host.toString();
  205.     }
  206.     int numTops = in.readInt();
  207.     Text path = new Text();
  208.     for (int i = 0; i < numTops; i++) {
  209.       path.readFields(in);
  210.       topologyPaths[i] = path.toString();
  211.     }
  212.   }
  213.   
  214.   public String toString() {
  215.     StringBuilder result = new StringBuilder();
  216.     result.append(offset);
  217.     result.append(',');
  218.     result.append(length);
  219.     for(String h: hosts) {
  220.       result.append(',');
  221.       result.append(h);
  222.     }
  223.     return result.toString();
  224.   }
  225. }