基本的に次のようなことをしたいという問題があります。
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
}
}
これらの状況を回避するか、単にオブジェクトをメモリ内でインスタンス化するのが最善であることはわかっていますが、メモリに保持するものが多すぎて、これを分割すると構造的にはるかに複雑になる可能性があるという問題があります。さらにステップを減らします。
この機能を探しているのは私だけではないようです。実際、これは少し前に実装された機能のようです: https://issues.apache.org/jira/browse/HADOOP-5266
MarkableIterator クラスはまさに私が探しているもののようです: http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapreduce/MarkableIterator.html
ただし、hadoop 2.0.3-alpha でのみ使用できるようです。1.0.3 (現在使用しているもの) または 0.20.205 のみをサポートする EMR でこれを実行しようとしています。いろいろ試してみましたが、1.0.3 で同様の機能を提供するものは見つかりませんでした。最も近いのは、StreamBackedIterator を使用することです。これは、オブジェクトをメモリに蓄積しますが、ArrayList よりもメモリ効率が高いようです。
Hadoop 1.0.3 でこれを行う方法を知っている人はいますか?