我对Hadoop中的MapReduce有点新意。我正在尝试处理来自许多日志文件的条目。映射器进程与WordCount教程中的映射进程非常相似。
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
事情不是将单词作为reducer的关键字,而是想从RDBMS中的表中放入相关数据。例如,处理过的文本就像这样
apple orange duck apple giraffe horse lion, lion grape
还有一张桌子
name type
apple fruit
duck animal
giraffe animal
grape fruit
orange fruit
lion animal
所以,我不想计算这个词,而是想计算这个词。输出就像
fruit 4
animal 5
让我们在前面的代码中说,它将是这样的
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
String object = tokenizer.nextToken();
//========================================
String type = SomeClass.translate(object);
//========================================
word.set(type);
output.collect(word, one);
}
}
SomeClass.translate
将通过从RDBMS查询将对象名称转换为该类型。
我的问题
apple
个单词,如何减少apple
的数据库查找次数?更新
我正在Amazon Elastic MapReduce上使用Apache Hadoop实现它,并且转换表存储在Amazon RDS / MySQL中。如果您能提供一些示例代码或链接,我将非常感激。
答案 0 :(得分:1)
为了总结要求,在表格中的数据和文件之间进行连接,并对连接的数据进行计数。基于数据的输入大小,可以有不同的方式(仅M或MR)连接。有关加入的更多详细信息,请参阅Data-Intensive Text Processing with MapReduce - 第3.5节。
答案 1 :(得分:1)
如果您担心最小化数据库查询,可以在两个MR作业中执行此操作:首先执行标准字数,然后使用该作业的输出进行转换以键入和重新求和。
或者,如果您的映射表足够小以适合内存,您可以先将其序列化,将其添加到DistributedCache,然后将其作为Mapper的安装方法的一部分加载到内存中。然后,没有必要担心翻译次数太多,因为它只是一个廉价的内存查找。