我正在尝试运行如下的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次。这是什么原因?
理想情况下,我只想读取每一行并进行进一步处理。任何输入/帮助都会很明显!
答案 0 :(得分:2)
如果您在LocalStreamEnvironment
(在IDE中调用StreamExecutionEnvironment.getExecutionEnvironment()
时获得)中运行该程序,则所有运算符的默认并行度等于CPU核心数。
因此,在您的示例中,每个运算符都并行化为四个子任务。在日志中,您会看到这四个子任务中的每一个的消息(3/4
表示这是总共四个任务中的第三个)。
您可以通过致电StreamExecutionEnvironment.setParallelism(int)
来控制子任务的数量,也可以在每个运营商上调用setParallelism(int)
。
鉴于您的计划,不应复制Kafka记录。每条记录只能打印一次。但是,由于记录是并行写入的,因此输出行的前缀为x>
,其中x
表示发出该行的并行子任务的id。