gpt4 book ai didi

java - Hadoop:在映射函数中有线程

转载 作者:可可西里 更新时间:2023-11-01 14:25:49 28 4
gpt4 key购买 nike

我可以在 map 函数中使用线程吗?我的任务是让线程真正帮助我。我需要同时为每个输入行向 HashMap 中添加值。我的输入行变成了一个字符串数组,对于这个数组的每个值,我都需要将它添加到 HashMap 中。我后来在清理函数中使用了这个 hashmap。

我正在使用 for 循环执行此操作,这似乎是我项目的瓶颈。所以我想到了使用并发 HashMap 并将字符串数组拆分为几个较小的数组。所以每个线程都负责在 HashMap 中添加相应的“较小”数组。问题是我已经在本地 Java 应用程序中实现了它并且它可以工作。当我在 hadoop 中使用它时,结果不是预期的。我正在为每个线程使用 Thread.join() 以便对于每一行输入我确保线程在下一行之前完成。好吧,我就是这么想的。 hadoop 是否以特殊方式处理线程?

   edits for duffymo

这是谷歌引文 http://research.google.com/pubs/pub36296.html .

算法 2 是我正在谈论的部分。如您所见,每个属性都有一个 for 循环,对于每个属性,我需要更新内存结构。他们只需要在他们的方法中预测一个值(单标签学习),而在我的方法中我可能有很多值要预测(多标签学习)。所以谷歌所说的 y 值,对他们来说是一个 3 值数组。对我来说,它可能高达数千。聚合两个 3 维 vector 比聚合两个 10000 维 vector 快得多。

如果我在我的算法中只放置一个标签,我完全没有问题。我提到的 45 秒减少到不到 5 秒。所以是的,它只对一个标签有效。

我提到的 45 秒仅用于 for 循环。我没有计算解析和所有其他事情。 for 循环肯定是瓶颈,因为这是我唯一需要计时的事情,它大约需要 45 秒,而整个任务大约需要 1 分钟(包括任务初始化等等)。我想尝试将该 for 循环制动为 2 或 3 个更小的 for 循环并同时处理它们。尝试意味着它可能有效,也可能无效。有时像我提到的那样疯狂的东西可能是必需的。好吧,这就是一位受人尊敬的程序员在我之前关于 hadoop 的话题中告诉我的。

我之前没有提供这么多细节,因为我认为我只是想了解一下 hadoop 和 map 函数内的线程。没想到会有人这么问我:P.

最佳答案

Hadoop 本身就是为并行而构建的。但它是以非常粗粒度的方式进行的。 Hadoop并行性在数据集大的时候很好,可以分成很多个子集分别独立处理(这里我指的只是Map阶段,为了简单起见),比如在文本中搜索一个模式。
现在,让我们考虑以下情况:我们有大量数据,我们想在该文本中搜索 1000 种不同的模式。现在我们有两种选择来使用我们的多核 CPU。
1. 在单个线程中使用单独的映射器处理每个文件,每个节点有多个映射器
2、每个节点定义一个mapper,所有核处理一个文件。
第二种方式可能对缓存更友好,因此效率更高。
归根结底——对于细粒度、多核友好的并行性被处理的性质证明是合理的情况——在映射器中使用多线程可以使我们受益。

关于java - Hadoop:在映射函数中有线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9599092/

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