Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hadoop:在map函数中有线程_Java_Multithreading_Hadoop_Mapreduce - Fatal编程技术网

Java Hadoop:在map函数中有线程

Java Hadoop:在map函数中有线程,java,multithreading,hadoop,mapreduce,Java,Multithreading,Hadoop,Mapreduce,我可以在map函数中使用线程吗?我有一个任务,我们有线程可以真正帮助我。我需要为每个输入行同时向hashmap添加值。我的输入行变成了一个字符串数组,对于这个数组的每个值,我都需要将它添加到哈希映射中。稍后我将在cleanup函数中使用这个hashmap 我使用for循环来完成这项工作,这似乎是我的项目的瓶颈。因此,我考虑使用一个并发哈希映射,并将字符串数组拆分为几个较小的数组。因此,每个线程都将负责在hashmap中添加相应的“较小”数组。问题是,我已经在本地java应用程序中实现了它,并且它

我可以在map函数中使用线程吗?我有一个任务,我们有线程可以真正帮助我。我需要为每个输入行同时向hashmap添加值。我的输入行变成了一个字符串数组,对于这个数组的每个值,我都需要将它添加到哈希映射中。稍后我将在cleanup函数中使用这个hashmap

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

   edits for duffymo
这是谷歌的引文

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

如果我在我的算法中只放一个标签,我一点问题都没有。我提到的45秒减少到5秒以下。因此,是的,它只适用于一个标签

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


我之前没有提供这些详细信息,因为我认为我只想对map函数中的hadoop和线程发表意见。没想到会有人问我这么多问题:P.

如果我正确理解Hadoop和map/reduce,你就不需要线程了

是什么让您认为解析一行输入是项目中的瓶颈?你只是觉得这是个问题,还是你有数据证明


更新:谢谢你的引用。这显然是我和其他人必须消化的东西,所以短期内我不会有任何急躁的建议。但我非常感谢您的引用和耐心。

Hadoop本身就是为了实现并行而构建的。但它是以非常粗粒度的方式进行的。当数据集很大时,Hadoop并行性很好,它可以被划分为许多单独和独立处理的子集(为了简单起见,这里我仅指Map阶段),例如,搜索文本中的一个模式
现在,让我们考虑下面的情况:我们有很多数据,我们想在本文中搜索1000种不同的模式。现在我们有两种选择来利用我们的多核CPU
1.在单个线程中使用单独的映射器处理每个文件,并且每个节点具有多个映射器
2.定义一个映射器节点并按所有核心处理一个文件
第二种方法可能对缓存更友好,因此效率更高

总之,对于细粒度、多核友好的并行性因处理的性质而得到证明的情况,在mapper中使用多线程可以使我们受益

我想你不明白“并发”并不意味着“很多事情可以同时发生”。如果是这样,那是什么意思?我是根据谷歌的一篇论文实现的,所以map/reduce是正确的。对于每一行,一个hashmap可能有多达数千个插入。是的,我有一些数据可以证明。对于大约1800行输入和2500个属性,映射任务大约需要45秒。这就是为什么我想尝试其他方法,比如并发插入。尝试新事物是研究工作的方式,并不一定意味着有人做错了什么。那么你能帮我提供一些地图功能内的线索提示吗?请提供谷歌论文的引文。对不起,我认为你的结论不正确。我敢打赌问题在于解析,而不是插入地图。如果我现在就在地图上插入这么多的项目,我敢打赌不会花45秒。也许你应该分析一下你的代码,看看时间花在哪里。看看我的编辑,达菲莫。很抱歉没有提供这么多细节,但我认为没有必要。我的问题不需要它们,但你一直在问我很多问题:P.谢谢你的兴趣。duffymo是对的,最好让Hadoop为你并行化工作,而不是自己多线程。有一个多线程映射器,可以给你一些想法,使它“正确”。没有问题,达菲莫。问题意味着兴趣。你可以简单地避免问我:P。再次谢谢你。我来看看那个托马斯。我知道我不应该把这些东西混在一起,但既然这个项目对我来说非常重要,我愿意做任何事情。单标签实现具有足够的可伸缩性。由我需要它是可伸缩的,即使我有更多的标签。我觉得线程也不能为我提供解决方案,