我使用一个包含 16 个节点的 hadoop(1.2.0 版)集群,一个具有公共 IP(主)和 15 个通过专用网络(从)连接。
是否可以使用远程服务器(除了这 16 个节点)来存储映射器的输出?问题是节点在映射阶段的磁盘空间不足,我无法再压缩映射输出。
我知道mapred.local.dir
inmapred-site.xml
用于设置存储 tmp 文件的目录的逗号分隔列表。理想情况下,我希望在远程服务器上有一个本地目录(默认目录)和一个目录。当本地磁盘填满时,我想使用远程磁盘。
我对此不太确定,但根据链接(http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml)它说那:
本地目录是 MapReduce 存储中间数据文件的目录。可能是不同设备上以逗号分隔的目录列表,以便传播磁盘 i/o。不存在的目录将被忽略。
还有一些其他的属性,你应该检查一下。这些可能会有所帮助:
mapreduce.tasktracker.local.dir.minspacestart:如果 mapreduce.cluster.local.dir 中的空间低于此,则不要要求更多任务。以字节为单位的值
mapreduce.tasktracker.local.dir.minspacekill:如果 mapreduce.cluster.local.dir 中的空间低于此,则在所有当前任务完成并清理之前不要询问更多任务。另外,为了保存我们正在运行的其余任务,杀死其中一个,清理一些空间。从 reduce 任务开始,然后继续完成最少的任务。以字节为单位的值。
解决方案是使用iSCSI 技术。一位技术人员帮助我们实现了这一目标,所以很遗憾,我无法提供更多细节。
/mnt/disk
我们将远程磁盘挂载到每个从节点的本地路径 ( ),并在tmp
那里创建一个文件,rwx
为所有用户提供权限。
然后,我们更改了$HADOOP_HOME/conf/mapred-site.xml
文件并添加了属性:
<property>
<name>mapred.local.dir</name>
<value>/mnt/disk/tmp</value>
</property>
最初,我们对该属性有两个逗号分隔的值,第一个是默认值,但它仍然没有按预期工作(我们仍然得到一些“设备上没有剩余空间”的错误)。所以我们只留下了一个值。