gpt4 book ai didi

file - Hadoop 在 Java 中映射整个文件

转载 作者:可可西里 更新时间:2023-11-01 16:23:48 26 4
gpt4 key购买 nike

我正在尝试在具有多个输入文件的 Java 中使用 Hadoop。目前我有两个文件,一个要处理的大文件和一个用作索引的小文件。

我的问题是,在将大文件分发给每个映射器时,我需要保持整个索引文件未拆分Hadoop API 是否提供了任何方法来制作这样的东西?

如果没有正确表达自己,这里有一张图片的链接,代表我正在努力实现的目标:picture

更新:

按照 Santiago 提供的说明,我现在可以从 Amazon 的 S3 将文件(或至少 URI)插入到分布式缓存中,如下所示:

job.addCacheFile(new Path("s3://myBucket/input/index.txt").toUri());

但是,当映射器尝试读取它时,会发生“找不到文件”异常,这对我来说似乎很奇怪。我检查了 S3 位置,一切似乎都很好。我已经使用其他 S3 位置来介绍输入和输出文件。

错误(注意 s3: 后的单斜杠)

FileNotFoundException: s3:/myBucket/input/index.txt(没有那个文件或目录)

下面是我用来从分布式缓存中读取文件的代码:

URI[] cacheFile = output.getCacheFiles();
BufferedReader br = new BufferedReader(new FileReader(cacheFile[0].toString()));
while ((line = br.readLine()) != null) {
//Do stuff
}

我正在使用 Amazon 的 EMRS3Hadoop 2.4.0 版。

最佳答案

如上所述,将您的索引文件添加到分布式缓存,然后在您的映射器中访问它。在幕后。 Hadoop 框架将确保在执行任何任务之前将索引文件发送到所有任务跟踪器,并可供您处理。在这种情况下,数据仅传输一次,并且可用于与您的工作相关的所有任务。

但是,不要在映射器代码中将索引文件添加到分布式缓存,而是让驱动程序代码实现 ToolRunner 接口(interface)并覆盖运行方法。这提供了在提交作业时通过命令提示符将索引文件传递到分布式缓存的灵 active

如果您使用的是 ToolRunner,则可以在运行作业时直接从命令行将文件添加到分布式缓存。无需先将文件复制到 HDFS。使用-files选项添加文件

hadoop jar yourjarname.jar YourDriverClassName -files cachefile1, cachefile2, cachefile3, ...

您可以访问您的 Mapper 或 Reducer 代码中的文件,如下所示:

File f1 = new File("cachefile1");
File f2 = new File("cachefile2");
File f3 = new File("cachefile3");

关于file - Hadoop 在 Java 中映射整个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24325101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com