当前位置: 首页 > 知识库问答 >
问题:

使用Hadoop计数器-多个作业

濮阳宜
2023-03-14

我正在使用Hadoop处理一个mapreduce项目。我目前有3个连续的工作。

我想使用Hadoop计数器,但问题是我想在第一个作业中进行实际计数,却在第3个作业的reducer中访问计数器值。

我怎样才能做到这一点呢?我应该在哪里定义枚举?我需要通过它扔第二个工作吗?这也将有助于看到一些代码示例这样做,因为我还没有找到任何东西。

注意:我使用的是Hadoop 2.7.2

编辑:我已经尝试了这里解释的方法,但没有成功。我的情况是不同的,因为我想从不同的工作访问柜台。(不是从映射器到还原器)。

我想做的:第一份工作:

public static void startFirstJob(String inputPath, String outputPath) throws IOException, ClassNotFoundException, InterruptedException {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "wordCount");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(WordCountMapper.class);
    job.setCombinerClass(WordCountReducer.class);
    job.setReducerClass(WordCountReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(LongWritable.class);
    job.setInputFormatClass(SequenceFileInputFormat.class);
    job.setOutputFormatClass(SequenceFileOutputFormat.class);
    FileInputFormat.addInputPath(job, new Path(inputPath));
    FileOutputFormat.setOutputPath(job, new Path(outputPath));
    job.waitForCompletion(true);
}

在其他类中定义了计数器枚举:

public class CountersClass {
    public static enum N_COUNTERS {
        SOMECOUNT
    }
}

正在尝试读取计数器:

Cluster cluster = new Cluster(context.getConfiguration());
Job job = cluster.getJob(JobID.forName("wordCount"));
Counters counters = job.getCounters();
CountersClass.N_COUNTERS mycounter = CountersClass.N_COUNTERS.valueOf("SOMECOUNT");
Counter c1 = counters.findCounter(mycounter);
long N_Count = c1.getValue();

共有2个答案

夹谷苗宣
2023-03-14

在第一个作业结束时获取计数器,并将它们的值写入一个文件,然后在后续作业中读取它。如果您想从reducer读取它,则将其写入HDFS;如果您想在应用程序代码中读取并初始化它,则将其写入本地文件。

计数器计数器=job.getcounters();计数器c1=counters.findcounter(COUNTER_NAME);system.out.println(c1.getDisplayName()+“:”+c1.getValue());

读写文件是基础教程的一部分。

南门向荣
2023-03-14

一种典型的解决方案是将作业的计数器值放入需要访问的后续作业的配置中:

因此请确保在计数作业映射器/还原器中正确地增加它:

context.getCounter(CountersClass.N_COUNTERS.SOMECOUNT).increment(1);

则在计数作业完成后:

job.waitForCompletion(true);

Counter someCount = job.getCounters().findCounter(CountersClass.N_COUNTERS.SOMECOUNT);

//put counter value into conf object of the job where you need to access it
//you can choose any name for the conf key really (i just used counter enum name here)
job2.getConfiguration().setLong(CountersClass.N_COUNTERS.SOMECOUNT.name(), someCount.getValue());

接下来是在另一个作业的映射器/还原器中访问它。只需重写setup(),例如:

private long someCount;

@Override
protected void setup(Context context) throws IOException,
    InterruptedException {
  super.setup(context);
  this.someCount  = context.getConfiguration().getLong(CountersClass.N_COUNTERS.SOMECOUNT.name(), 0));
}
 类似资料:
  • Hadoop:(ver-1.2.1),(1+8节点集群) 我的用例是,我试图获得执行特定pig脚本所花费的时间,以及从mapreduce的角度来看,这些时间是如何花费的。我需要多次运行pig脚本(比如说100),以获得平均时间。我启用了,这使我在每个udf函数上花费时间作为mapreduce计数器。我还对每个作业报告的其他延迟、内存度量(cpu时间、堆使用率)感兴趣。我可以从jobtracker

  • 在java中,我会使用: 多输入.add输入路径(conf, path, inputFormatClass, 映射器类) 以添加多个输入,并为每个输入使用不同的映射器。 现在我正在使用python在hadoop中编写一个流作业,可以做类似的工作吗?

  • 免责声明:我对Hadoop和Apache Ignite都不熟悉。抱歉冗长的背景信息。 设置:我已经安装并配置了Apache Ignite Hadoop加速器。全部启动。sh提供以下服务。我可以提交Hadoop作业。他们完成了,我可以看到预期的结果。start all使用传统的core站点、hdfs站点、mapred站点和Thread站点配置文件。 我还安装了Apache Ignite 2.6.0。

  • 但是我不能在一个计时器中处理不同的“计时器任务”。我试图将计时器任务对象添加到构造函数中,但是当我将新的计时器任务(RemindTask1)对象作为参数(内部类的实例)传递时,出现编译错误。 以下是它如何处理一项任务: 但是我完全被多个任务应该如何创建然后运行所困扰。 但是这不起作用,我不知道出了什么问题。当我将新的RemindTask2()作为参数传递时,我遇到了编译错误。

  • 需要一种方法来完成我的'高级'计算器。我一直在用循环头脑Storm,但我困惑自己。任何关于如何实现操作数到数字的想法,而不只是嵌套一堆if语句和硬编码通过所有这些。 公共类计算器{ } }

  • 现在我有一个4阶段的MapReduce作业,如下所示: