Kafka集群在虚拟机上,能正常通信能互相ping本地consumer消费者程序正常消费,flink程序不能消费不能打印数据,也没有错误提示
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.connector.kafka.source.KafkaSource;
import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer;
import org.apache.flink.streaming.api.CheckpointingMode;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class Cityweather {
public static void main(String[] args) throws Exception {
// 创建流执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 设置checkpoint
env.enableCheckpointing(1000, CheckpointingMode.AT_LEAST_ONCE);
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(3000);
// 创建 KafkaSource
KafkaSource<String> kafkaSource = KafkaSource.<String>builder()
.setBootstrapServers("hadoop100:9092")
.setTopics("POC_test")
.setGroupId("my-groupsdads")
.setStartingOffsets(OffsetsInitializer.earliest())
.setValueOnlyDeserializer(new SimpleStringSchema())
.build();
// 从 Kafka 读取数据并创建 DataStream
DataStreamSource<String> weathertest = env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), "weather_test");
// System.out.println(weatherTest);
weathertest.map(value -> {
System.out.println(value);
Thread.sleep(10000);
return value;
});
// 打印数据流
// weathertest.print();
// 执行任务
env.execute("CityWeather");
}
}
从您提供的代码片段来看,有几个问题可能导致您的Flink程序无法正常消费和打印数据:
env.fromSource()
方法,以便将其连接到数据流。修改您的代码如下:// 从 Kafka 读取数据并创建 DataStream
DataStreamSource<String> weathertest = env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), "weather_test");
map()
操作没有连接到下游操作或输出。在Flink中,转换操作(例如map()
)是惰性执行的,只有当您将其连接到下游操作(例如print()
)时,它才会被执行。您可以在map()
操作后添加.print()
方法,以打印数据流中的结果,或者将map()
操作的结果连接到其他下游操作。修改您的代码如下:weathertest.map(value -> {
System.out.println(value);
Thread.sleep(10000);
return value;
}).print(); // 将结果打印出来
execute()
方法来触发任务执行。在您的代码末尾,添加env.execute("CityWeather");
以启动任务执行。修改您的代码如下:// 执行任务
env.execute("CityWeather");
请确保在代码中添加了上述修改,然后重新运行您的程序,看看是否能够正常消费和打印数据。