我最近开始在hadoop工作,我刚刚学到了一些基本的理论知识。我正在尝试解决一个任务,其中输入应在文本文件中给出,例如input.txt(1 10 37 5 4 98 100等)
我需要找到给定输入中的最大整数(即整数类型)。我试图传递arraylist中的输入,以便我可以将第一个整数与所有整数的其余部分进行比较(使用for-loop)。
程序应该读取输入文件说一些随机数100 20 40 90 70,然后输出应该显示为100.我刚刚尝试用mapc中的wordcount示例修改代码并减少函数。但是因为我是新手开始编码hadoop我无法弄清楚我错在哪里。
1)是否有可能以这种方式找到解决方案?如果是的话,我无法在hadoop中创建一个arraylist并需要一些提示:-)
2)我们可以只打印'键'而不是键值对吗?如果是这样,请帮助我。我试着在reduce函数中编写代码而不打印它,但是我遇到了一些错误。
请指导我一些可以向前推进的提示。谢谢
答案 0 :(得分:1)
阅读Hadoop Java API并编写以下函数:
Map: Identity function
Reduce (or Combine): (K, List<V>) -> (K, max(List<V>))
关于你的评论,MapReduce中没有ArrayLists
,那些不适合内存。值列表作为迭代器传递,对象通常被重用以节省内存 - 因此您不能依赖它们的内容保持相同。
Mapper 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);
}
Reducer 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);
}