我从本地文件系统给mapper一个输入。它从eclipse成功运行,但没有从集群运行,因为它无法找到本地输入路径说:输入路径不存在。请任何人帮忙我如何给映射器提供本地文件路径,以便它可以在集群中运行,我可以在hdfs中获得输出
答案 0 :(得分:5)
这是一个非常古老的问题。最近面临同样的问题。 我不知道正确这个解决方案是如何为我工作的。如果有任何缺点,请注意。这就是我做的。
Reading a solution from the mail-archives,我意识到如果我将fs.default.name
从hdfs://localhost:8020/
修改为file:///
,它就可以访问本地文件系统。但是,我并不想要这个所有的mapreduce工作。所以我在本地系统文件夹中制作了core-site.xml
的副本(与我将MR jar提交到hadoop jar
的那个文件夹相同)。
在Driver
的{{1}}课程中,我添加了
MR
Configuration conf = new Configuration();
conf.addResource(new Path("/my/local/system/path/to/core-site.xml"));
conf.addResource(new Path("/usr/lib/hadoop-0.20-mapreduce/conf/hdfs-site.xml"));
从本地系统获取输入并将输出写入MR
答案 1 :(得分:3)
在群集中运行需要将数据加载到分布式存储(HDFS)中。首先使用hadoop fs -copyFromLocal
将数据复制到HDFS,然后尝试再次中断作业,为其提供HDFS中的数据路径
答案 2 :(得分:2)
这个问题很有意思。在运行作业之前,可以在S3上获取数据并访问此数据,而无需将明确的副本复制到HDFS。在wordcount示例中,可以按如下方式指定:
hadoop jar 示例 .jar wordcount s3n://bucket/input s3n://bucket/output
这是因为映射器直接从S3读取记录。
如果可以使用S3完成此操作,为什么不会使用此语法而不是s3n
file:///input file:///output
但是根据经验,这似乎以一种有趣的方式失败了 - 我看到Hadoop为输入目录中确实存在的文件提供了一个找不到文件的文件。也就是说,它似乎能够列出我本地磁盘上put目录中的文件,但是当需要打开它们来读取记录时,找不到(或无法访问)该文件。
答案 3 :(得分:0)
数据必须在HDFS上,以便任何MapReduce作业处理它。因此,即使您拥有本地文件系统或网络路径或基于Web的存储(例如Azure Blob存储或Amazon Block stoage)等源,您仍需要先在HDFS上复制数据,然后再运行作业。 最重要的是你需要首先将数据推送到HDFS,并且有几种方法取决于数据源,你可以执行从源到HDFS的数据传输,例如从本地文件系统,你将使用以下命令:
$ hadoop -f CopyFromLocal SourceFileOrStoragePath _HDFS__Or_directPathatHDFS _
答案 4 :(得分:0)
尝试像这样设置输入路径
FileInputFormat.addInputPath(conf,new Path(file:///本地文件系统上的目录));
如果您提供文件扩展名,则可以访问localsystem
中的文件答案 5 :(得分:0)
我尝试了以下代码并获得了解决方案...... 请试一试,让我知道..
你需要获取本地文件系统的FileSystem对象,然后使用makequalified方法返回路径。因为我们需要传递本地文件系统的路径(没有其他方法将它传递给inputformat),我使用了make qualified, in deed仅返回本地文件系统路径..
代码如下所示..
Configuration conf = new Configuration();
FileSystem fs = FileSystem.getLocal(conf);
Path inputPath = fs.makeQualified(new Path("/usr/local/srini/")); // local path
FileInputFormat.setInputPaths(job, inputPath);
我希望这可以满足您的要求,虽然它发布得很晚..它对我来说很好..它不需要任何配置更改我相信..
答案 6 :(得分:0)
U可能希望通过将配置设置为
来尝试此操作Configuration conf=new Configuration();
conf.set("job.mapreduce.tracker","local");
conf.set("fs.default.name","file:///");
在此之后你可以使用本地路径设置fileinputformat并且你可以去