如果我配置了几个${mapred.local.dir}目录来存储Map任务的即时结果,这些目录会挂载不同的磁盘。我的问题是:1。是否 LocalDirAllocator.java
用于管理${mapred.local.dir}目录?
2.方法 getLocalPathForWrite()
的 LocalDirAllocator.java
用于选择${mapred.local.dir}目录?
如果我配置了几个${mapred.local.dir}目录来存储Map任务的即时结果,这些目录会挂载不同的磁盘。我的问题是:1。是否 LocalDirAllocator.java
用于管理${mapred.local.dir}目录?
2.方法 getLocalPathForWrite()
的 LocalDirAllocator.java
用于选择${mapred.local.dir}目录?
1条答案
按热度按时间46qrfjad1#
是的,tasktracker使用
LocalDirAllocator
管理本地目录/磁盘,以便存储中间数据。(说明中给出了分配空间的方法)中有3个重载方法
LocalDirAllocator
对应getLocalPathForWrite()
。它们在磁盘集上进行循环(通过配置的dir),并返回第一个具有足够空间的完整路径。java文档中的解释:
LocalDirAllocator.java
为创建文件而分配磁盘的循环方案的一种实现。它的工作方式是跟踪上次为文件写入分配的磁盘。对于当前请求,如果磁盘上的可用空间足以容纳正在考虑创建的文件,则将分配磁盘集中的下一个磁盘。如果无法满足空间要求,则将尝试下一个磁盘,以此类推,直到找到具有足够容量的磁盘。一旦识别出具有足够空间的磁盘,就会进行检查以确保该磁盘是可写的。此外,还提供了一个api,它不考虑空间需求,只检查所考虑的磁盘是否可写(这应该用于文件大小未知的情况)。提供了一个api来读取先前创建的路径。该api的工作原理是扫描所有磁盘以查找输入路径名。这个实现还提供了每个jvm有多个分配器的功能(每个分配器对应一个惟一的功能或上下文,如mapred、dfs客户端等)。它确保每个jvm的每个上下文中只有一个分配器示例。注:
上面提到的上下文实际上是在配置类中定义的配置项,比如“mapred.local.dir”(我们想要控制dir分配)。上下文字符串正是那些配置项。
此实现不考虑文件写入时磁盘变为只读或空间不足的情况(磁盘在多个进程之间共享,因此后一种情况很可能发生)。
在类实现中,“disk”被称为“dir”,它实际上指向磁盘上配置的目录,该目录将是所有文件写/读分配的父目录。
我不认为我们可以直接推翻它的行为,除非我们推翻它的家属的行为!