java—如果没有Hadoop1.0.3中的缓存,我如何迭代HadoopReduceValuesIterable多次?

mjqavswn  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(282)

我有一个问题,我基本上想做这样的事情:

public void reduce(Text key, Iterable<Text> iterValues, Context context){

           for (Text val : iterValues){
               //do something
           }

           iterValues.reset()
           for (Text val : iterValues){
               //do something else
           }
}

我知道最好避免这些情况,或者简单地在内存中示例化对象,但是我遇到了一个问题,我可能有太多的东西要保存在内存中,而将这些东西分解成更多的reduce步骤在结构上会变得更加复杂。
我并不是唯一一个在寻找这个功能的人,事实上,这似乎是一个不久前实现的功能:https://issues.apache.org/jira/browse/hadoop-5266
markableiterator类似乎正是我想要的:http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapreduce/markableiterator.html
不过,它似乎只在hadoop2.0.3-alpha中可用。我希望在emr中运行它,它只支持1.0.3(我目前使用的)或0.20.205。我一直在尝试各种各样的东西,但在1.0.3中还没有找到类似的功能。最近的一种方法是使用streambackeditor,它仍然在内存中累积对象,但似乎比arraylist更有内存效率。
有人知道在hadoop1.0.3中实现这一点的方法吗?

e0bqpujr

e0bqpujr1#

这是一个有点黑客,但你可以让你的Map器发射每一个值两次,但一些标志设置在一个而不是其他。然后根据该标志对值进行排序,然后根据所需的自然顺序进行排序。然后,您必须执行一些自定义逻辑,以便在命中第二组值后停止第一个循环。
除此之外,不,我不认为有一种简单的方法不把它们自己存储在内存中。主要的问题是迭代器实际上并没有返回新对象,它返回相同的对象,但是在调用 next() . 在幕后,hadoop甚至可能不会缓存整个值集,因此重置迭代器将需要重新扫描一个文件(我猜他们在新版本中正在这样做)。

相关问题