简体   繁体   English

在计算总和抛出异常时进行Flink流

[英]Flink Streaming while calculating sum throwing exception

I am using Flink Streaming example where racks are available & I want to calculate sum of temperature group by rack IDs..following is my code : 我使用的是机架可用的Flink Streaming示例,我想按机架ID计算温度组的总和。以下是我的代码:

static Properties properties=new Properties();
    public static Properties getProperties()
    {
        properties.setProperty("bootstrap.servers", "54.210.139.57:9092");
        properties.setProperty("zookeeper.connect", "54.210.139.57:2181");
        //properties.setProperty("deserializer.class", "kafka.serializer.StringEncoder");
        //properties.setProperty("group.id", "akshay");
        properties.setProperty("auto.offset.reset", "earliest");
        return properties;
    }

 @SuppressWarnings("rawtypes")
public static void main(String[] args) throws Exception 
{
    StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
    Properties props=Program.getProperties();
    //env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

    /*DataStream<String> dstream=env.addSource(new FlinkKafkaConsumer09<String>("TemperatureEvent",new SimpleStringSchema(), props));
    dstream.filter(dstream -> dstream.)*/
    DataStream<TemperatureEvent> dstream=env.addSource(new FlinkKafkaConsumer09<TemperatureEvent>("TemperatureEvent", new TemperatureEventSchema(), props));

    DataStream<TemperatureEvent> ds1=dstream.keyBy("rackId").sum(1);

    ds1.print();
    env.execute("Temperature Consumer");
}

When I try to execute this code, it is throwing following exception : The program finished with the following exception: 当我尝试执行此代码时,它将引发以下异常:该程序完成了以下异常:

org.apache.flink.client.program.ProgramInvocationException: The main method caused an error.
        at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:520)
        at org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:403)
        at org.apache.flink.client.program.Client.runBlocking(Client.java:248)
        at org.apache.flink.client.CliFrontend.executeProgramBlocking(CliFrontend.java:866)
        at org.apache.flink.client.CliFrontend.run(CliFrontend.java:333)
        at org.apache.flink.client.CliFrontend.parseParameters(CliFrontend.java:1192)
        at org.apache.flink.client.CliFrontend.main(CliFrontend.java:1243)
Caused by: java.lang.IndexOutOfBoundsException: Not 0th field selected for a simple type (non-tuple, non-array).
        at org.apache.flink.streaming.util.FieldAccessor.create(FieldAccessor.java:78)
        at org.apache.flink.streaming.api.functions.aggregation.SumAggregator.<init>(SumAggregator.java:39)
        at org.apache.flink.streaming.api.datastream.KeyedStream.sum(KeyedStream.java:292)
        at com.yash.main.Program.main(Program.java:38)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:505)

I am using sum(1),because my 0th param is rackId & 1st param is temperature as defined in pojo TemperatureEvent as follows : 我正在使用sum(1),因为我的第0个参数是rackId,第一个参数是温度,如pojo TemperatureEvent中所定义,如下所示:

public class TemperatureEvent
{
  private int rackId;
  private double temperature;
  private long timeStamp;

  public TemperatureEvent() 
  {
    // TODO Auto-generated constructor stub
  }

public TemperatureEvent(int rackId, double temperature, long timeStamp) {
    super();
    this.rackId = rackId;
    this.temperature = temperature;
    this.timeStamp = timeStamp;
}

public int getRackId() {
    return rackId;
}

public void setRackId(int rackId) {
    this.rackId = rackId;
}

public double getTemperature() {
    return temperature;
}

public void setTemperature(double temperature) {
    this.temperature = temperature;
}

public long getTimeStamp() {
    return timeStamp;
}

public void setTimeStamp(long timeStamp) {
    this.timeStamp = timeStamp;
}

@Override
public String toString() {
    //return String.format("TemperatureEvent [rackId=%s, temperature=%s, timeStamp=%s]",rackId, temperature, timeStamp);
            String str=getRackId()+","+temperature+","+getTimeStamp();
            return str;

}

What is the solution to this problem ?? 这个问题有什么解决方案? How can I calculate the sum of temperatures group by rackID ?? 如何通过rackID计算温度总和?

You can only use index-based parameters on these method if your type is a Tuple type. 如果您的类型是元组类型,则只能在这些方法上使用基于索引的参数。 In your case it should work with .sum("temperature") . 在您的情况下,它应与.sum("temperature")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM