我最近开始在hadoop中工作,我刚刚学到了一些关于它的基本理论知识。我正在尝试解决一个任务,其中输入应该在文本文件中给出,例如input.txt(1 10 37 5 4 98 100等)
我需要在给定的输入中找到最大的整数(即整数类型)。我正在尝试传递arraylist中的输入,这样我就可以将第一个整数与其他所有整数进行比较(使用for循环)。
程序应该读取输入文件,比如一些随机数100 20 40 90 70,然后输出应该显示为100。我刚刚尝试用map和reduce函数中的wordcount示例修改代码。但由于我刚开始使用hadoop进行编码,所以我不知道自己错在哪里。
1) 有可能用这种方式找到解决方案吗?如果是,我无法在hadoop中创建arraylist,需要一些提示:-)
2) 我们可以只打印"key"而不打印键值对吗?如果是的话,请帮帮我。我试图在reduce函数中编码,因为没有打印它,但我遇到了一些错误。
请给我一些建议,让我可以继续前进。感谢
阅读Hadoop Java API并编写以下函数:
Map: Identity function
Reduce (or Combine): (K, List<V>) -> (K, max(List<V>))
关于您的评论,MapReduce中没有ArrayLists
,它们不适合内存。值列表作为迭代器传递,对象通常被重用以节省内存,因此您不能依赖它们的内容来保持不变。
映射器API:http://hadoop.apache.org/docs/r1.1.1/api/org/apache/hadoop/mapreduce/Mapper.html
对于映射器,您可以编写以下函数,或者只使用预先实现的IdentityMapper
。
public void map(K key, V val, Context context)
throws IOException {
context.collect(key, val);
}
API减速器:http://hadoop.apache.org/docs/r1.1.1/api/org/apache/hadoop/mapreduce/Reducer.html
您的reduce函数将是(假设V implements Comparable<V>
),为了简洁起见,我们将说值至少包含一项:
public void reduce(K key, Iterator<V> values, Context context)
throws IOException {
V max = values.next();
while( values.hasNext() ) {
V current = values.next();
if( current.compareTo(max) > 0 )
max = current;
}
context.collect(key, max);
}