Streaming 集群中的ApacheFlink流式处理不会将作业与工作者分割

Streaming 集群中的ApacheFlink流式处理不会将作业与工作者分割,streaming,cluster-computing,apache-kafka,apache-flink,Streaming,Cluster Computing,Apache Kafka,Apache Flink,我的目标是使用Kafka作为源,Flink作为流处理引擎,建立一个高通量集群。以下是我所做的 我在主服务器和辅助服务器上设置了一个2节点集群,配置如下 flink-conf.yaml大师 jobmanager.rpc.address: <MASTER_IP_ADDR> #localhost jobmanager.rpc.port: 6123 jobmanager.heap.mb: 256 taskmanager.heap.mb: 512 taskmanager.numberO

我的目标是使用Kafka作为源,Flink作为流处理引擎,建立一个高通量集群。以下是我所做的

我在主服务器和辅助服务器上设置了一个2节点集群,配置如下

flink-conf.yaml大师

jobmanager.rpc.address: <MASTER_IP_ADDR> #localhost

jobmanager.rpc.port: 6123

jobmanager.heap.mb: 256

taskmanager.heap.mb: 512

taskmanager.numberOfTaskSlots: 50

parallelism.default: 100
jobmanager.rpc.address: <MASTER_IP_ADDR> #localhost

jobmanager.rpc.port: 6123

jobmanager.heap.mb: 512 #256

taskmanager.heap.mb: 1024 #512

taskmanager.numberOfTaskSlots: 50

parallelism.default: 100
两个节点上的flink设置位于同名文件夹中。我通过运行

bin/start-cluster-streaming.sh
这将启动工作节点上的任务管理器

我的输入源是卡夫卡。下面是片段

最终流执行环境环境=
StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource流=
env.addSource(
新KafkaSource(Kafkarl、kafkaTopic、新SimpleStringSchema());
stream.addSink(stringsink函数);
环境执行(“卡夫卡流”);
这是我的水槽功能

public类MySink实现了函数{
私有静态最终长serialVersionUID=1L;
公共void调用(字符串arg0)引发异常{
processMessage(arg0);
System.out.println(“已处理消息”);
}
}
以下是我的pom.xml中的Flink依赖项


org.apache.flink

此外,仪表板的外观如下所示: 问题:

  • 为什么工作节点没有获得任务
  • 我是否缺少一些配置

  • 在Flink中读取Kafka源时,源任务的最大并行度受给定Kafka主题的分区数限制。卡夫卡分区是Flink中源任务可以使用的最小单元。如果分区多于源任务,则某些任务将使用多个分区

    因此,为了向所有100个任务提供输入,您应该确保Kafka主题至少有100个分区


    如果您无法更改主题的分区数,那么也可以使用
    setParallelism
    方法使用较低的并行度从Kafka开始读取。或者,您可以使用
    重新平衡
    方法,该方法将在前面操作的所有可用任务中洗牌您的数据。

    感谢您发布了这样一个好的问题!如何在主机上获取这些调试消息?在主机(JobManager)上执行用户代码实际上是不可能的。您使用的是Flink 0.9.0还是0.10-SNAPSHOT?您的
    stringSinkFunction
    看起来怎么样?(只是打印到标准输出吗?@rmetzer,不客气。我已经更新了问题。任何帮助都将不胜感激。@SudarshanShubakar,从截图上看,您已经注册了2个TMs,每个插槽50个。这也与您的配置相对应。此外,看起来您的工作执行得很好。在100个插槽中的每个插槽中都部署了任务
    自定义源->流接收器(x/100)
    。因此,我想知道什么不适合你。您的主题是否有少于100个分区?因为Flink在Kafka分区和源任务之间创建了一个映射,所以会有一些任务不接收任何输入。ok@TillRohrmann这可能就是问题所在。我相信在卡夫卡问题上只有不到100个党派。更改后让我报告。好的@TillRohrmann comment解决了问题。你能把你的评论转换成答案吗?接受这个答案,因为它解决了我的问题。不过,我想进一步了解您在回答的最后一部分中提到的内容。当你说“最初使用setParallelism方法使用较低的并行度阅读卡夫卡”时,你的确切意思是什么?一旦设置,我将如何重置它?此外,我还必须尝试重新平衡,只是将其添加到代码中似乎对我解决此问题不起作用。您可以在运算符的基础上设置并行性(例如map、filter、reduce函数)。然后将以给定的并行度执行这些运算符。
    setParallelism
    方法覆盖默认并行性或在
    ExecutionEnvironment
    中指定的并行性。
    bin/start-cluster-streaming.sh
    
    bin/flink run flink-test-jar-with-dependencies.jar