有没有办法通过IBM Streams中的运算符(而不是通过Streams控制台)捕获元组/秒

时间:2017-08-23 17:37:38

标签: infosphere-spl ibm-infosphere ibm-streams

我希望通过运算符捕获元组/秒的数量并将其记录在文件中。我无法使用'节流操作员'自己设置元组率。另外,要再次添加,我不是在谈论通过控制台捕获信息,而是通过SPL应用程序。

1 个答案:

答案 0 :(得分:2)

没有直接的“给我这个运营商的吞吐量”指标可用。您可以实现一个原始运算符,该运算符随时间访问nTuplesProcessed度量标准并从中计算吞吐量。 (list of available metrics。)但是,我实际上发现使用以下复合运算符要容易得多:

public composite PeriodicThroughputSink(input In) {
param expression<float64> $period;
      expression<rstring> $file;
graph
    stream<boolean b> Period = Beacon() {
        param period: $period;
    }

    stream<float64 throughput> Throughput = Custom(In; Period) {
        logic state: {
            mutable uint64 _count = 0;
            float64 _period = $period;
        }

        onTuple In: {
            ++_count;
        }

        onTuple Period: {
            if (_count > 0ul) {
                submit({throughput=((float64)_count / _period)}, Throughput);
                _count = 0ul;
            }
        }

        config threadedPort: queue(Period, Sys.Wait); // ensures that the throughput calculation and file
                                                      // writing is on a different thread from the rest 
                                                      // of the application
    }

    () as Sink = FileSink(Throughput) {
        param file: $file;
              format: txt;
              flush: 1u;
    }
}

然后,您可以将复合运算符用作“吞吐量抽头”,它会从您要记录其吞吐量的任何运算符中使用该流。例如,您可以这样使用它:

stream<Data> Result = OperatorYouCareAbout(In) {}

() as ResultThroughput = PeriodicThroughputSink(Result) {
    param period: 5.0;
          file: "ResultThroughput.txt";
} 

当然,您仍然可以在应用程序的其他位置使用Result流。请记住,此方法可能会对应用程序的性能产生一些影响:我们正在挖掘数据路径。但是,影响不应该很大,特别是如果你确保PeriodicThroughputSink中的运算符与你正在点击的运算符融合在同一个PE中。此外,周期越短,它就越有可能影响应用程序性能。

同样,我们可以通过访问nTuplesProcessed指标在C ++或Java原语运算符中做类似的事情,但我发现上述方法更容易。您还可以从应用程序外部获取系统指标;比如,您可以拥有一个定期使用streamtool capturestate或REST API的脚本,然后解析输出,找到您关心的运算符的nTuplesProcessed指标,并使用它来计算吞吐量。但我发现这个复合算子中的技术更容易。