我从本地文件系统向映射器提供了一个输入。它从 eclipse 成功运行,但没有从集群运行,因为它无法找到本地输入路径说:输入路径不存在。请任何人帮助我如何为映射器提供本地文件路径,以便它可以在集群中运行,我可以在 hdfs 中获取输出
7 回答
这是一个非常古老的问题。最近面临同样的问题。我不知道这个解决方案对我来说有多正确。如果这样做有任何缺点,请注意。这就是我所做的。
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)中。首先使用将数据复制到 HDFS hadoop fs -copyFromLocal
,然后尝试再次运行您的作业,为其提供 HDFS 中数据的路径
这个问题很有趣。可以在 S3 上拥有数据并在运行作业之前访问这些数据而无需显式复制到 HDFS。在 wordcount 示例中,可以按如下方式指定:
hadoop jar示例.jar 字数s3n://bucket/input s3n://bucket/output
其中发生的是映射器直接从 S3 读取记录。
如果这可以用 S3 完成,为什么不使用类似的 hadoop,使用这种语法而不是 s3n
file:///input file:///output
?
但从经验上看,这似乎以一种有趣的方式失败了——我看到 Hadoop 为确实位于输入目录中的文件提供了一个文件未找到异常。也就是说,它似乎能够列出我本地磁盘上 put 目录中的文件,但是当需要打开它们来读取记录时,找不到(或无法访问)该文件。
I have tried the following code and got the solution... Please try it and let me know..
You need to get FileSystem object for local file system and then use makequalified method to return path.. As we need to pass path of local filesystem(no other way to pass this to inputformat), i ve used make qualified, which in deed returns only local file system path..
The code is shown below..
Configuration conf = new Configuration();
FileSystem fs = FileSystem.getLocal(conf);
Path inputPath = fs.makeQualified(new Path("/usr/local/srini/")); // local path
FileInputFormat.setInputPaths(job, inputPath);
I hope this works for your requirement, though it's posted very late.. It worked fine for me.. It does not need any configuration changes i believe..
数据必须位于 HDFS 上,任何 MapReduce 作业才能处理它。因此,即使您有诸如本地文件系统或网络路径或基于 Web 的存储(如 Azure Blob 存储或 Amazon Block stoage)之类的源,您也需要先将数据复制到 HDFS,然后再运行作业。最重要的是,您需要先将数据推送到 HDFS,并且有几种方法取决于数据源,您可以执行从源到 HDFS 的数据传输,例如从本地文件系统,您可以使用以下命令:
$hadoop -f CopyFromLocal SourceFileOrStoragePath _HDFS__Or_directPathatHDFS_
尝试像这样设置输入路径
FileInputFormat.addInputPath(conf, new Path(file:///本地文件系统上的目录));
如果您提供文件扩展名,它可以从本地系统访问文件
你可能想通过将配置设置为
Configuration conf=new Configuration();
conf.set("job.mapreduce.tracker","local");
conf.set("fs.default.name","file:///");
在此之后,您可以使用本地路径设置文件输入格式,然后您就可以开始了