如果我配置了几个${mapred.local.dir}目录来存储Map Task的即时结果,这些目录会挂载不同的磁盘。我的问题是:1. LocalDirAllocator.java
是否用于管理 ${mapred.local.dir} 目录?
2.LocalDirAllocator.java
的 getLocalPathForWrite()
方法用于选择 ${mapred.local.dir} 目录?
1. Whether LocalDirAllocator.java is used to manage ${mapred.local.dir} directories?
是的,任务跟踪器使用LocalDirAllocator
来管理本地目录/磁盘,以便存储中间数据。(它分配空间的依据在解释中给出)
2.The method getLocalPathForWrite() of LocalDirAllocator.java is used to select a ${mapred.local.dir} directory?
LocalDirAllocator
中有 3 个重载方法对应于 getLocalPathForWrite()
。它们对磁盘集进行轮询(通过配置的目录),并返回具有足够空间的第一个完整路径。
来自java文档的解释:LocalDirAllocator.java
用于 的磁盘分配的轮循机制方案的实现 创建文件。它的工作方式是跟踪哪个磁盘 上次分配给文件写入。对于当前请求,下一个 如果磁盘集上的可用空间 磁盘足以容纳正在容纳的文件 考虑创建。如果无法满足空间要求, 将按顺序尝试下一个磁盘,依此类推,直到找到具有 足够的容量。一旦确定了具有足够空间的磁盘, 执行检查以确保磁盘可写。此外,还有 提供的 API 不会考虑空间要求 考虑,但只检查正在考虑的磁盘是否 可写(这应该用于文件大小不是的情况 已知先验)。提供了一个 API 来读取创建的路径 早些时候。该 API 通过扫描所有磁盘以查找输入来工作 路径。此实现还提供以下功能 每个 JVM 有多个分配器(每个唯一功能一个分配器 或上下文,如mapred,DFS-client等)。它确保有 每个 JVM 的每个情景只有一个分配器实例。
注意:
上面提到的上下文实际上是在配置类中定义的配置项,如"mapred.local.dir"(对于它 我们想要控制目录分配)。上下文字符串是 正是那些配置项。
此实现不考虑磁盘在文件存在时变为只读或空间不足的情况 写入(磁盘在多个进程之间共享,因此 后一种情况是可能的)。
- 在类实现中,"Disk"被称为"Dir",它实际上指向磁盘上配置的目录,该目录将是 所有文件写入/读取分配的父项。
我认为我们不能直接覆盖它的行为,除非我们覆盖它家属的行为!