>我从本地文件系统向映射器提供了输入。它从 eclipse 成功运行,但不从集群运行,因为它找不到本地输入路径说:输入路径不存在。请任何人帮助我如何为映射器提供本地文件路径,以便它可以在集群中运行,并且可以在hdfs中获取输出
非常古老的问题。最近面临同样的问题。我不知道这个解决方案对我有多正确。如果有任何缺点,请注意。这就是我所做的。
从邮件档案中阅读解决方案,我意识到如果我将fs.default.name
从hdfs://localhost:8020/
修改为file:///
它可以访问本地文件系统。但是,我不希望我所有的mapreduce工作都这样做。所以我在本地系统文件夹中制作了core-site.xml
的副本(与我将 MR jar 提交给 hadoop jar
的文件夹相同)。
在我Driver
课上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
从本地系统获取输入并将输出写入hdfs:
在集群中运行需要将数据加载到分布式存储 (HDFS) 中。首先使用 hadoop fs -copyFromLocal
将数据复制到 HDFS,然后再次尝试运行您的作业,为其提供 HDFS 中数据的路径
这个问题很有趣。可以在 S3 上拥有数据,并在运行作业之前访问这些数据,而无需显式复制到 HDFS。在字数统计示例中,可以按如下方式指定:
Hadoop jar 示例.jar字数s3n://bucket/input s3n://bucket/output
在这种情况下,映射器直接从 S3 读取记录。
如果这可以用 S3 完成,为什么 hadoop 不类似地使用这种语法而不是 s3n
file:///input file:///output
?
但从经验上讲,这似乎以一种有趣的方式失败了——我看到 Hadoop 为确实在输入目录中的文件提供了找不到文件异常。也就是说,它似乎能够列出我本地磁盘上放置目录中的文件,但是当需要打开它们以读取记录时,找不到(或访问)该文件。
数据必须在HDFS上,任何MapReduce作业都可以处理它。因此,即使你有一个源,如本地文件系统、网络路径或基于 Web 的存储(如 Azure Blob 存储或 Amazon Block 存储),你也需要先在 HDFS 上复制数据,然后运行作业。最重要的是,您需要首先将数据推送到 HDFS,并且有几种方法取决于数据源,您将执行从源到 HDFS 的数据传输,例如从本地文件系统您将使用以下命令:
$hadoop -f CopyFromLocal SourceFileOrStoragePath _HDFS__Or_directPathatHDFS_
尝试像这样设置输入路径
FileInputFormat.addInputPath(conf, new Path(file:///the directory on your local filesystem));
如果您提供文件扩展名,它可以从本地系统访问文件
我已经尝试了以下代码并得到了解决方案...请尝试一下,让我知道..
您需要获取本地文件系统的文件系统对象,然后使用 makequalified 方法返回 path。由于我们需要传递本地文件系统的路径(没有其他方法可以将其传递给inputformat),我使用了make qualified,它实际上只返回本地文件系统路径。
代码如下所示。
Configuration conf = new Configuration();
FileSystem fs = FileSystem.getLocal(conf);
Path inputPath = fs.makeQualified(new Path("/usr/local/srini/")); // local path
FileInputFormat.setInputPaths(job, inputPath);
我希望这能满足您的要求,尽管它发布得很晚。它对我来说效果很好..我相信它不需要任何配置更改。
U 可能想通过将配置设置为
Configuration conf=new Configuration();
conf.set("job.mapreduce.tracker","local");
conf.set("fs.default.name","file:///");
在此之后,您可以使用本地路径设置文件输入格式,一切顺利