在代码中访问Flink的系统指标到终端,而不是像JMX那样使用任何指标报告

时间:2017-10-22 22:14:24

标签: apache-flink flink-streaming flink-cep

我使用JMX作为度量标准报告器来获取Flink指标,但有没有办法将其作为终端输出?

我想为每个运算符绘制numRecordsInPerSecond以进行性能分析,我该怎么做?

我已经看到了累加器的一些例子,但它没有给我正确的见解我如何进行Flink的性能分析。我会在这里举个例子

enter image description here

这是我的Flink计划的执行计划,我有多个问题,但我想问基本的一个

  1. 如何衡量每个运营商的延迟,然后将其添加到计算复杂事件的总延迟时间。

  2. 如何衡量输出吞吐量?目前,我已经在select函数中编写了一些代码,这些函数计算了所见的复杂事件数和Flink引擎启动时间。这是最好的方法吗?

  3. 但基本问题仍然存在,即如何通过代码在终端输出中显示Flink metrics中提到的系统指标的输出,因为我想绘制图表以获得性能,而JMX的问题是它在某种意义上向我显示了需求指标,当我点击JMX控制台中的特定指标时,我看到了这些值,这不适合分析系统。

    P.S - 我发现在StackOverflow上有一个question用于计算吞吐量和延迟,答案是这样的

      private static class MyMapper extends RichMapFunction<String, Object> {
    
            private transient Meter meter;
    
            @Override
            public void open(Configuration parameters) throws Exception {
                super.open(parameters);
                this.meter = getRuntimeContext()
                        .getMetricGroup()
                        .meter("myMeter", new DropwizardMeterWrapper(new com.codahale.metrics.Meter()));
            }
    
            @Override
            public Object map(String value) throws Exception {    
                this.meter.markEvent();
                return value;
            }
        }
    

    我已经在我的代码中添加了上面的类但没有看到任何输出,我也想知道这段代码将如何显示吞吐量或延迟,因为我们没有提到我们想要找到延迟的运算符?例如,我想在执行计划的中间而不是在计划结束时找到运营商的吞吐量,上面的代码是否会为我做这个?

1 个答案:

答案 0 :(得分:0)

您已经拥有Flink仪表板上列出的每个组件的所有延迟和每秒输入/输出数量,无需实现额外的自定义计数器或度量标准来计算每秒的记录输入/输出每个组成部分。

如果您想要实现自己的计数器/ Meter,那么您需要使用此代码,并且必须将其映射到您要定位的任何组件。