给定一个hadoop集群,我有一个任务,我有一个大的文件集,需要所有工作人员在执行reduce阶段时访问这些文件。
使用distributedcache的功能似乎是个好主意。但是,它似乎不满足以下所需的行为:
懒文件获取:文件被懒洋洋地复制到worker(只有当试图读取时,它们才被缓存在本地)。
getlocalcachefiles很奇怪:另一个明显相关的问题是distributedcache接口。要访问本地文件,似乎需要调用distributedcache.getlocalcachefiles(conf)。有没有一种方法可以按名称请求某个文件(例如:distributedcache.getlocalfile(conf,filename))
distributedcache可以这样做吗?有没有其他图书馆能满足我的要求?
谢谢您!
1条答案
按热度按时间mlmc2os51#
分布式缓存不支持延迟加载,在每个任务节点上执行作业的第一个map/reduce任务之前,它们会被复制到每个任务节点(请注意,文件只复制到将执行map/reduce任务的节点)。如果您想要延迟加载,只需直接在hdfs中打开文件,尽管如果您有1000个并发任务试图从同一个文件中读取,那么这对于namenode/datanodes来说伸缩性不太好
可以使用符号链接为分布式缓存中的文件提供友好的名称,它们将出现在每个map/reduce任务的本地工作目录(symlinked)中。
例如,使用generic options parser options-files,可以将文件上载到hdfs,将其添加到distributedcache并指定友好名称,如下所示:
现在,只需在map/reducer中调用以下命令,就可以打开ref-map.txt文件:
如果您发现文件已经在hdfs中,那么只需像平常一样添加,然后调用
createSymlink(Configuration)
方法。在向分布式缓存中添加文件时,还可以使用片段URI来分配友好的NANE: