分享

dfs.data.dir的选择策略

gwgyk 2014-11-21 11:51:42 发表于 疑问解答 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 8 25560
在hadoop中,dfs.data.dir可以配置成多个,分别用于挂载不同的硬盘。那么这些dfs.data.dir的具体选择策略是什么?
就是写一个数据块的时候,具体把这个块写到哪个dfs.data.dir中,这个选择策略是怎么样的啊?
这段代码在哪儿可以看到呢?

另外,正在写的数据块是放在dfs.data.dir/tmp下呢,还是dfs.data.dir/blocksBeingWritten下?
然后等数据块都写完了,再移动到dfs.data.dir/current下吗?

已有(8)人评论

跳转到指定楼层
jixianqiuxue 发表于 2014-11-21 12:03:13
楼主可以理解上有偏差,没有选择的,应该是这些目录都会把数据备份一份。有几个目录就备份几份

英文如下:
  1. Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist are ignored.
复制代码



回复

使用道具 举报

gwgyk 发表于 2014-11-21 12:04:27
jixianqiuxue 发表于 2014-11-21 12:03
楼主可以理解上有偏差,没有选择的,应该是这些目录都会把数据备份一份。有几个目录就备份几份

英文如下 ...

这个是在哪儿看到的啊?
回复

使用道具 举报

jixianqiuxue 发表于 2014-11-21 12:07:02
gwgyk 发表于 2014-11-21 12:04
这个是在哪儿看到的啊?


楼主,可以到官网上找找,或则自己试验下

Hadoop参数说明:dfs.name.dir 与 dfs.data.dir

回复

使用道具 举报

gwgyk 发表于 2014-11-21 12:14:25
jixianqiuxue 发表于 2014-11-21 12:07
楼主,可以到官网上找找,或则自己试验下

Hadoop参数说明:dfs.name.dir 与 dfs.data.dir

你好,因为是这样,我们组的boss需要做hadoop优化,所以让我看源码了解相关的东西,所以我想问问,你说的这种方式在代码里哪儿可以看到啊?这样我也好交差了,谢谢了哈
回复

使用道具 举报

jixianqiuxue 发表于 2014-11-21 12:27:24
本帖最后由 jixianqiuxue 于 2014-11-21 12:30 编辑
gwgyk 发表于 2014-11-21 12:14
你好,因为是这样,我们组的boss需要做hadoop优化,所以让我看源码了解相关的东西,所以我想问问,你说的 ...
//一个Storage包含一系列StorageDirectory,它们共享一个in_use.lock  
  public class StorageDirectory {  
    File              root;         //对应dfs.data.dir或dfs.name.dir目录  
    FileLock          lock; //对应dfs.data.dir或dfs.name.dir目录下in_use.lock  
    StorageDirType dirType; // storage dir type  
      
      
    //读取dfs.data.dir/current/VERSION或dfs.name.dir/current/VERSION  
    //read里调用getFields,读取dfs.data.dir/current/VERSION或dfs.name.dir/current/VERSION到this  

    public void read() throws IOException {  
      read(getVersionFile());  
    }  
      
    //write里调用setFields,把this的属性写到dfs.data.dir/current/VERSION或dfs.name.dir/current/VERSION  
    public void write() throws IOException {  
      corruptPreUpgradeStorage(root);  
      write(getVersionFile());  
    }  
  
    //读取Storage下任何一个StorageDirectory  
    public File get*Dir() {  
      return new File(root,  ...);  
    }  
  
  
    //During startup Hadoop servers (name-node and data-nodes) read their local   
* storage information from them.  
    //根据启动参数判断系统处于哪个状态  
    public StorageState analyzeStorage(StartupOption startOpt) throws IOException {  
        //见图状态分析  
    }  
  
    //Complete or recover storage state from previously failed transition.  
    public void doRecover(StorageState curState) throws IOException {  
        //见图恢复操作  
    }  
  
    //lock this storage   
    public void lock() throws IOException {  
      this.lock = tryLock();  
    }  
  
    //unlock this storage  
    public void unlock() throws IOException {  
      this.lock.release();  
      lock.channel().close();  
      lock = null;  
    }  
  }  





public abstract class Storage extends StorageInfo {  
   
  private   static final String STORAGE_FILE_LOCK     = "in_use.lock";  
  protected static final String STORAGE_FILE_VERSION  = "VERSION";  
  public static final String STORAGE_DIR_CURRENT   = "current";  
  private   static final String STORAGE_DIR_PREVIOUS  = "previous";  
  private   static final String STORAGE_TMP_REMOVED   = "removed.tmp";  
  private   static final String STORAGE_TMP_PREVIOUS  = "previous.tmp";  
  private   static final String STORAGE_TMP_FINALIZED = "finalized.tmp";  
  private   static final String STORAGE_TMP_LAST_CKPT = "lastcheckpoint.tmp";  
  private   static final String STORAGE_PREVIOUS_CKPT = "previous.checkpoint";  
   
  public enum StorageState {  
    NON_EXISTENT,  
    NOT_FORMATTED,  
    COMPLETE_UPGRADE,  
    RECOVER_UPGRADE,  
    COMPLETE_FINALIZE,  
    COMPLETE_ROLLBACK,  
    RECOVER_ROLLBACK,  
    COMPLETE_CHECKPOINT,  
    RECOVER_CHECKPOINT,  
    NORMAL;  
  }  
   
  //StorageDirectory下的文件类型  
  public interface StorageDirType {  
    public StorageDirType getStorageDirType();  
    public boolean isOfType(StorageDirType type);  
  }  
   
  //节点类型  
  private NodeType storageType;    // Type of the node using this storage   
  protected List<StorageDirectory> storageDirs = new ArrayList<StorageDirectory>();  
   
  //迭代Storage包含的所有StorageDirectory  
  public Iterator<StorageDirectory> dirIterator(StorageDirType dirType) {  
    return new DirIterator(dirType);  
  }  
   
  protected Storage(NodeType type) {  
    super();  
    this.storageType = type;  
  }  
   
  //StorageDirectory.read()调用此方法,读取dfs.data.dir/current/VERSION或dfs.name.dir/current/VERSION到this  
  //因为所有的StorageDirectory具有相同的VERSION,所以可以把任意一个StorageDirectory的VERSION写到this的这四个属性  
  //write同read  

  protected void getFields(Properties props,  StorageDirectory sd ) throws IOException {  
    String sv, st, sid, sct;  
    sv = props.getProperty("layoutVersion");  
    st = props.getProperty("storageType");  
    sid = props.getProperty("namespaceID");  
    sct = props.getProperty("cTime");  
    layoutVersion = rv;  
    storageType = rt;  
    namespaceID = rid;  
    cTime = rct;  
  }  
   
  //StorageDirectory.write()调用此方法,把this的属性写到dfs.data.dir/current/VERSION或dfs.name.dir/current/VERSION  
  protected void setFields(Properties props, StorageDirectory sd ) throws IOException {  
    props.setProperty("layoutVersion", String.valueOf(layoutVersion));  
    props.setProperty("storageType", storageType.toString());  
    props.setProperty("namespaceID", String.valueOf(namespaceID));  
    props.setProperty("cTime", String.valueOf(cTime));  
  }  
  
}  


回复

使用道具 举报

bioger_hit 发表于 2014-11-21 12:39:47
gwgyk 发表于 2014-11-21 12:14
你好,因为是这样,我们组的boss需要做hadoop优化,所以让我看源码了解相关的东西,所以我想问问,你说的 ...
这篇文章相信对你有帮助
Hadoop-Hdfs Storage源码

1.Storage物理文件夹和文件与类的对应关系是什么?
2.StorageInfo完成了什么功能?
3.哪个方法实现了把this的属性写到dfs.data.dir/current/VERSION或dfs.name.dir/current/VERSION?
回复

使用道具 举报

gwgyk 发表于 2014-11-21 12:46:54

好的,我再自己看下。另外还想请教下,DataXceiver.run()
    writeBlock()
        new BlockReceiver()
            FSDataset.writeToBlock()方法是写数据块吗?是它最终调用了StorgeDirectory.write方法吗?


回复

使用道具 举报

奔跑de小豬 发表于 2017-12-13 11:02:06
jixianqiuxue 发表于 2014-11-21 12:03
楼主可以理解上有偏差,没有选择的,应该是这些目录都会把数据备份一份。有几个目录就备份几份

英文如下 ...

从英文来看,并没有提到同一个数据,会同时备份到多个路径,能再详细说明一下吗,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条