如果我配置了几个$ {mapred.local.dir}目录来存储Map Task的即时结果,这些目录会挂载不同的磁盘。
我的问题是:
1. LocalDirAllocator.java
是否用于管理$ {mapred.local.dir}目录?
2. getLocalPathForWrite()
的方法LocalDirAllocator.java
用于选择$ {mapred.local.dir}目录?
答案 0 :(得分:1)
1. Whether LocalDirAllocator.java is used to manage ${mapred.local.dir} directories?
是的, tasktracker 使用LocalDirAllocator
管理本地目录/磁盘以存储中间数据。(在解释中给出了分配空间的方式)
2.The method getLocalPathForWrite() of LocalDirAllocator.java is used to select a ${mapred.local.dir} directory?
LocalDirAllocator
中有3个重载方法对应getLocalPathForWrite()
。它们在磁盘集上循环(通过配置的dirs)并返回第一个有足够空间的完整路径。
说明来自java doc:LocalDirAllocator.java
用于磁盘分配的循环方案的实现 创建文件。它的工作方式是它跟踪什么磁盘 最后分配给文件写入。对于当前的请求,下一个 如果磁盘上的可用空间将分配磁盘集 磁盘足以容纳正在存在的文件 考虑创造。如果不能满足空间要求, 将尝试下一个磁盘,依此类推,直到找到磁盘为止 足够的能力。一旦识别出具有足够空间的磁盘, 检查完成以确保磁盘是可写的。还有 提供的API不会占用空间要求 考虑但只是检查所考虑的磁盘是否 可写(这应该用于文件大小不是的情况 已知apriori)。提供API以读取已创建的路径 早。该API通过扫描输入的所有磁盘来工作 路径名。此实现还提供了功能 每个JVM有多个分配器(每个独特功能一个) 或上下文,如mapred,dfs-client等)。它确保有 每个JVM每个上下文只有一个分配器实例。
注意:强>
上面提到的上下文实际上是Configuration类中定义的配置项,如" mapred.local.dir" (为此 我们想控制目录分配)。上下文字符串是 正是那些配置项。
- 醇>
此实现未考虑磁盘在文件存在时变为只读或空间不足的情况 写入(磁盘在多个进程之间共享,所以 后一种情况很可能)。
- 在课堂实施中," Disk"被称为" Dir",它实际指向磁盘上已配置的目录 所有文件写/读分配的父级。
我不认为我们可以直接覆盖其行为,除非我们覆盖其家属的行为!