在映射之前在Hadoop映射器中查询DBMS中的数据

时间:2013-01-10 08:04:12

标签: hadoop mapreduce

我对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查询将对象名称转换为该类型。

我的问题

  1. 这可行吗? (以及如何做到这一点?)
  2. 有什么顾虑?我开始理解映射器将在多台机器上运行。那么假设在多台计算机上有apple个单词,如何减少apple的数据库查找次数?
  3. 或者,如果没有在映射器中进行翻译,是否有一个非常好的选择?或者也许有一种常见的方法可以做到这一点? (或者整个问题是一个非常愚蠢的问题吗?)
  4. 更新

    我正在Amazon Elastic MapReduce上使用Apache Hadoop实现它,并且转换表存储在Amazon RDS / MySQL中。如果您能提供一些示例代码或链接,我将非常感激。

2 个答案:

答案 0 :(得分:1)

为了总结要求,在表格中的数据和文件之间进行连接,并对连接的数据进行计数。基于数据的输入大小,可以有不同的方式(仅M或MR)连接。有关加入的更多详细信息,请参阅Data-Intensive Text Processing with MapReduce - 第3.5节。

答案 1 :(得分:1)

如果您担心最小化数据库查询,可以在两个MR作业中执行此操作:首先执行标准字数,然后使用该作业的输出进行转换以键入和重新求和。

或者,如果您的映射表足够小以适合内存,您可以先将其序列化,将其添加到DistributedCache,然后将其作为Mapper的安装方法的一部分加载到内存中。然后,没有必要担心翻译次数太多,因为它只是一个廉价的内存查找。