对于我的地图缩小作业,我正在读取输入文件中的行以获取外部文件路径。所以我用作输入的文件看起来像:
/user/local/myfiles/temp1.png
/user/local/myfiles/temp2.jpg
/user/local/myfiles/temp3.txt
/user/local/myfiles/temp4.txt
....
我想对这些文件执行一些操作。我需要从我在map函数中读取的字符串路径中获取文件对象。我的问题是:我在哪里放这些文件的实际副本,以便我可以抓住它们?我把它们放在hadoop dfs上吗?当我把它们放在本地系统上时,我得到一个文件未找到错误但是当我把它们放在hadoop文件系统上时我得到了同样的错误(因此输入文件中的每一行都是“/ user / hadoop / input /” temp1.txt“)。我可以获取文件名,但我需要能够从输入文件中列出的路径获取图像对象或文本文件对象。有没有什么方法可以通过字符串路径从我的map函数访问dfs(或本地系统)上的文件?
答案 0 :(得分:1)
您需要将它们添加到HDFS,以便可以从所有Mappers访问它们。以下适用于我(在0.20):
FileSystem fs = FileSystem.get(context.getConfiguration());
FSDataInputStream in = null;
BufferedReader br = null;
String line = null;
String file = context.getConfiguration().get(Constants.INFILE);
in = fs.open(new Path(file));
br = new BufferedReader(new InputStreamReader(in));
while((line=br.readLine())!=null)
我在驱动程序中添加了Constants.INFILE,以便不将文件名硬编码到代码中。