缓存普通文件到并旦模task运行节点的classpath中
环形缓存区,map阶段后会往本地溢写文件,他们之绝缓间会有一个环形缓存区,可以提高效率
*** 作步骤:1.将数据的分发到每个节点上:
DistributedCache.addCacheFile(new
URI("hdfs://cloud01:9000/user/hadoop/mrinput/ST.txt"),
conf)
注意,此 *** 作一定要在创建Job,将conf传递给Job之前进行,否则数据文件的路径不会被Mapper中取到。
2.在每者链数个Mapper中获取文件URI,再进行相关 *** 作:
URI[]
uris=DistributedCache.getCacheFiles(context.getConfiguration())
比如读取该文件:
FileSystem
fs
=
FileSystem.get(URI.create("hdfs://cloud01:9000"),
context.getConfiguration())
FSDataInputStream
in
=
null
in
=
fs.open(new
Path(uris[0].getPath()))
BufferedReader
br=new
BufferedReader(new
InputStreamReader(in))
hadoop中的DistributedCache
2
WordCount.javaHadoop的分布式缓存机制使得一个job的所有map或reduce可以访问同一份文件。在任务提首首交后,hadoop将由-files和-archive选项指定的文件复制到HDFS上(JobTracker的文件系统)。在任务运行前,TaskTracker从JobTracker文件系统复制文件到本地磁盘作为缓存,这样任务就可以访问这些文件。对于job来说,它并不关心文件是从哪儿唤逗来的。在使用DistributedCache时,对于本地化文件的访问,通常使用Symbolic
Link来访问,这样更方便。通过
URI
hdfs://namenode/test/input/file1#myfile
指定的文件在当前工作目录中被符号链接为myfile。这样job里面可直接通过myfile来访问文件,而不用关心该文件在本地的具体路径。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)