Apache Flink - 多个输出行

时间:2017-03-28 00:13:19

标签: apache-kafka apache-flink apache-kafka-connect bigdata

我正在尝试运行如下的flink工作来从Apache Kafka&读取数据。印刷:

Java程序

    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

    Properties properties = new Properties();
    properties.setProperty("bootstrap.servers", "test.net:9092");
    properties.setProperty("group.id", "flink_consumer");
    properties.setProperty("zookeeper.connect", "dev.com:2181,dev2.com:2181,dev.com:2181/dev2");
    properties.setProperty("topic", "topic_name");

    DataStream<String> messageStream = env.addSource(new FlinkKafkaConsumer082<>("topic_name", new SimpleStringSchema(), properties));

            messageStream.rebalance().map(new MapFunction<String, String>() {
                private static final long serialVersionUID = -6867736771747690202L;

                public String map(String value) throws Exception {
                    return "Kafka and Flink says: " + value;
                }
            }).print();

            env.execute();

Scala代码

  var properties = new Properties();
  properties.setProperty("bootstrap.servers", "msg01.staging.bigdata.sv2.247-inc.net:9092");
  properties.setProperty("group.id", "flink_consumer");
  properties.setProperty("zookeeper.connect", "host33.dev.swamp.sv2.tellme.com:2181,host37.dev.swamp.sv2.tellme.com:2181,host38.dev.swamp.sv2.tellme.com:2181/staging_sv2");
  properties.setProperty("topic", "sv2.staging.rtdp.idm.events.omnichannel");
  var env = StreamExecutionEnvironment.getExecutionEnvironment();
  var stream:DataStream[(String)] = env
.addSource(new FlinkKafkaConsumer082[String]("sv2.staging.rtdp.idm.events.omnichannel", new SimpleStringSchema(), properties));
  stream.print();
  env.execute();

每当我在eclipse中的应用程序中运行它时,我会在下面看到:

03/27/2017 20:06:19工作执行切换到状态RUNNING。

03/27/2017 20:06:19来源:自定义来源 - &gt;接收器:未命名(1/4)切换到SCHEDULED 03/27/2017 20:06:19来源:Custom Source - &gt;接收器:未命名(1/4)切换到DEPLOYING 03/27/2017 20:06:19来源:Custom Source - &gt;接收器:未命名(2/4)切换到SCHEDULED 03/27/2017 20:06:19来源:Custom Source - &gt;接收器:未命名(2/4)切换到DEPLOYING 03/27/2017 20:06:19来源:Custom Source - &gt;接收器:未命名(3/4)切换到SCHEDULED 03/27/2017 20:06:19来源:Custom Source - &gt;接收器:未命名(3/4)切换到DEPLOYING 03/27/2017 20:06:19来源:Custom Source - &gt;接收器:未命名(4/4)切换到SCHEDULED 03/27/2017 20:06:19来源:Custom Source - &gt; Sink:未命名(4/4)切换到DEPLOYING 03/27/2017 20:06:19来源:Custom Source - &gt;接收器:未命名(4/4)切换到RUNNING 03/27/2017 20:06:19来源:Custom Source - &gt;接收器:未命名(2/4)切换到RUNNING 03/27/2017 20:06:19来源:Custom Source - &gt;接收器:未命名(1/4)切换到RUNNING 03/27/2017 20:06:19来源:Custom Source - &gt;接收器:未命名(3/4)切换到RUNNING

我的问题是:

1)为什么我在所有情况下都会看到4个接收器实例(已调度,已部署和正在运行)。

2)对于在Apache Kafka中收到的每一行,我看到这里多次打印多次4次。这是什么原因?

理想情况下,我只想读取每一行并进行进一步处理。任何输入/帮助都会很明显!

1 个答案:

答案 0 :(得分:2)

如果您在LocalStreamEnvironment(在IDE中调用StreamExecutionEnvironment.getExecutionEnvironment()时获得)中运行该程序,则所有运算符的默认并行度等于CPU核心数。

因此,在您的示例中,每个运算符都并行化为四个子任务。在日志中,您会看到这四个子任务中的每一个的消息(3/4表示这是总共四个任务中的第三个)。

您可以通过致电StreamExecutionEnvironment.setParallelism(int)来控制子任务的数量,也可以在每个运营商上调用setParallelism(int)

鉴于您的计划,不应复制Kafka记录。每条记录只能打印一次。但是,由于记录是并行写入的,因此输出行的前缀为x>,其中x表示发出该行的并行子任务的id。