映射函数中可以有线程吗?我有一个任务,线程真的可以帮助我。我需要同时为每个输入行添加值到哈希图中。我的输入行变成了一个字符串数组,对于这个数组的每个值,我都需要将其添加到哈希映射中。稍后我会在cleanup函数中使用这个hashmap。
我用for循环来做这件事,这似乎是我项目的瓶颈。因此,我想到了使用并发哈希映射,并将字符串数组拆分为几个较小的数组。因此,每个线程都将负责在hashmap中添加相应的"较小"数组。问题是,我已经在本地java应用程序中实现了它,并且它可以工作。当我在hadoop中使用它时,结果不是预期的。我对每个线程都使用Thread.join(),这样对于每一行输入,我都会确保线程在下一行之前完成。我以为我就是这么做的。hadoop用一种特殊的方式处理线程吗?
edits for duffymo
这是谷歌的引文http://research.google.com/pubs/pub36296.html。
算法2是我正在讨论的部分。正如您所看到的,每个属性都有一个for循环,对于每个属性,我需要更新内存中的结构。他们只需要在他们的方法中预测一个值(单标签学习),而在我的方法中,我可能有很多值要预测(多标签学习)。所以谷歌所说的y值,对他们来说是一个3值的数组。对我来说,可能高达数千。聚合两个三维向量比聚合两个10000维向量快得多。
如果我在算法中只放一个标签,我就没有任何问题。我提到的45秒减少到不到5秒。所以,是的,它只对一个标签有效。
我提到的45秒仅用于for循环。我没有计算解析和所有其他事情。for循环肯定是瓶颈,因为这是我唯一计时的事情,大约需要45秒,而整个任务大约需要1分钟(包括任务初始化等)。我想尝试将for循环制动为2或3个较小的for循环,并同时处理它们。尝试意味着它可能起作用,也可能不起作用。有时,像我提到的那种疯狂的东西可能是必要的。这就是一位备受尊敬的程序员在我之前关于hadoop的帖子中告诉我的。
我之前没有提供这么多细节,因为我认为我只想了解map函数中的hadoop和线程。没想到会有人问我这么多:P。
Hadoop本身就是为实现并行而构建的。但它是以非常粗糙的方式进行的。当数据集很大时,Hadoop的并行性很好,可以分为许多子集,这些子集分别独立处理(为了简单起见,我这里只指Map阶段),例如,在文本中搜索一个模式
现在,让我们考虑以下情况:我们有很多数据,我们想在本文中搜索1000个不同模式的数据。现在我们有两种选择来利用我们的多核CPU
1.在单个线程中使用单独的映射器处理每个文件,每个节点有多个映射器
2.为每个节点定义一个映射器,并由所有核心处理一个文件
第二种方式可能对缓存更友好,并且更高效
最重要的是,对于细粒度、多核友好的并行性是由处理的性质来证明的情况,在映射器中使用多线程可以使我们受益。
如果我正确理解Hadoop和map/reduce,那么就不需要线程了。
是什么让你认为解析一行输入是你项目中的瓶颈?在你看来,这只是一个问题,还是你有数据证明?
更新:感谢您的引用。这显然是我和其他人必须消化的东西,所以短期内我不会有任何草率的建议。但我非常感谢你的表扬和耐心。