hadoop - 在文本文件上执行多个操作,但将其作为单个HADOOP作业执行的正确方法是什么

标签 hadoop mapreduce hadoop2 mapper reducers

我想对单个文本文件执行一些操作。

例如:
任务1:计算所有单词

任务2:计算以特定字符结尾的单词

任务3:计算多次出现的单词。

实现此目标的最佳方法是什么?

我需要编写多个映射器和多个reducer吗?多个映射器和单个Reducer?或者如果我们可以使用单个映射器和化简器来实现

如果有人可以提供一个编程示例,那就太好了。

最佳答案

使用计数器来计算您要寻找的东西。 MapReduce完成后,只需获取驱动程序类中的计数器。

例如可以在映射器中计算以“z”或“Z”开头的单词数

public class WordCountMapper extends Mapper <Object, Text, Text, IntWritable> {

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    @Override
    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(value.toString());
        while (itr.hasMoreTokens()) {
            String hasKey = itr.nextToken();
            word.set(hasKey);
            context.getCounter("my_counters", "TOTAL_WORDS").increment(1);
            if(hasKey.toUpperCase().startsWith("Z")){
            context.getCounter("my_counters", "Z_WORDS").increment(1);
            }
            context.write(word, one);
        }
    }
}

不同单词words appearing less than 4 times的数量可以在化简计数器中计数。
public class WordCountReducer extends Reducer <Text, IntWritable, Text, IntWritable> {

    @Override
    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int wordCount= 0;
        context.getCounter("my_counters", "DISTINCT_WORDS").increment(1);
        for (IntWritable val : values){
            wordCount += val.get();
        }
        if(wordCount < 4{
           context.getCounter("my_counters", "WORDS_LESS_THAN_4").increment(1);
        }
    }
}

在Driver类中,获取计数器。以下代码位于您提交作业的行之后
CounterGroup group = job.getCounters().getGroup("my_counters");

for (Counter counter : group) {
   System.out.println(counter.getName() + "=" + counter.getValue());
}

关于hadoop - 在文本文件上执行多个操作,但将其作为单个HADOOP作业执行的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49307550/

相关文章:

hadoop - RuntimeException:无法在类null中加载垫片

python - 通过 Airflow UI 终止在远程位置运行的 Airflow 任务

hadoop - HDP 2.3 沙箱 mapreduce 日志

hadoop - hdfs没有此类文件或目录

ubuntu - 无法使用 CDH4 : Datanode denied communication with namenode 启动 hdfs 服务

hadoop - 将cdh5.3.0中的JSON和Avro模式文件转换为Avro格式

java - 如何在Hadoop Mapreduce中比较来自同一文件的数据?

apache-spark - spark2 + yarn - 准备 AM 容器时出现空指针异常

hadoop - 当 Yarn 中的资源管理器 (RM) 出现故障时会发生什么?

hadoop - 启动start-all.sh(HADOOP)时出错