flink写入kafka默认只写到一个partition

如题使用flink FlinkKafkaProducer0* 时,有一个最常用,也是官方例子的构造方法 有三个参数如下

/**
* @param topicId
*        ID of the Kafka topic.
* @param serializationSchema
*        User defined key-less serialization schema.
* @param producerConfig
*        Properties with the producer configuration.
*/
public FlinkKafkaProducer010(String topicId, SerializationSchema<T> serializationSchema, Properties producerConfig) {
   this(topicId, new KeyedSerializationSchemaWrapper<>(serializationSchema), producerConfig, new FlinkFixedPartitioner<T>());
}

运行一段时间后发现所有的数据都写到一个kafka的partition了,这样就不能发挥kafka的并行能力。于是去阅读官方文档发现

官方文档中描述大概意思是

“默认情况下,如果没有为Flink Kafka生成器指定自定义分区器,那么该生成器将使用一个FlinkFixedPartitioner将每个Flink Kafka生成器的并行子任务映射到单个Kafka分区(即,接收子任务接收到的所有记录最终将位于相同的Kafka分区中)。如果没有指定自定义分区程序,则使用FlinkFixedPartitioner。“

如果kafka的partition和和flink 算子的并行度刚好数量一致则没问题,不然就会出现上诉问题。

于是找到找到一个重载方法设置FlinkFixedPartitioner。

new FlinkKafkaProducer010<>(topic, new SimpleStringSchema(), config, (FlinkKafkaPartitioner)null);
public FlinkKafkaProducer010(
      String topicId,
      SerializationSchema<T> serializationSchema,
      Properties producerConfig,
      @Nullable FlinkKafkaPartitioner<T> customPartitioner) {

   this(topicId, new KeyedSerializationSchemaWrapper<>(serializationSchema), producerConfig, customPartitioner);
}

有兴趣的同学可以跟到源码里面去看看flink 是怎么样分配数据去哪个partition的

FlinkFixedPartitioner

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Flink消费Kafka并将数据写入Hive的示例代码: ```java import org.apache.flink.api.common.functions.RuntimeContext; import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.api.java.utils.ParameterTool; import org.apache.flink.streaming.api.CheckpointingMode; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.functions.sink.RichSinkFunction; import org.apache.flink.streaming.api.functions.sink.SinkFunction; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer; import org.apache.flink.table.api.EnvironmentSettings; import org.apache.flink.table.api.Table; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; import org.apache.flink.types.Row; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Properties; public class FlinkKafkaToHiveDemo { public static void main(String[] args) throws Exception { // 获取命令行参数 final ParameterTool params = ParameterTool.fromArgs(args); // 设置检查点配置 final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.enableCheckpointing(10000, CheckpointingMode.EXACTLY_ONCE); env.getConfig().setGlobalJobParameters(params); // 设置Kafka配置 Properties kafkaProps = new Properties(); kafkaProps.setProperty("bootstrap.servers", params.get("bootstrap.servers", "localhost:9092")); kafkaProps.setProperty("group.id", params.get("group.id", "my-flink-consumer-group")); // 创建FlinkKafkaConsumer FlinkKafkaConsumer<String> kafkaConsumer = new FlinkKafkaConsumer<>( params.get("topic", "my-kafka-topic"), new SimpleStringSchema(), kafkaProps); // 将Kafka数据转换为Flink Table EnvironmentSettings settings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build(); StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env, settings); Table kafkaTable = tableEnv.fromDataStream(env.addSource(kafkaConsumer), "value"); // 将Flink Table写入Hive kafkaTable.executeInsert("my_hive_table"); // 执行Flink作业 env.execute("Flink Kafka to Hive Demo"); } // 定义Hive Sink public static class HiveSink extends RichSinkFunction<Row> { private Connection conn; private PreparedStatement stmt; @Override public void open(Configuration parameters) throws Exception { // 获取Hive连接 Class.forName("org.apache.hive.jdbc.HiveDriver"); conn = DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "hive", ""); stmt = conn.prepareStatement("INSERT INTO my_hive_table VALUES(?)"); } @Override public void invoke(Row row, SinkFunction.Context context) throws Exception { // 写入Hive stmt.setString(1, row.getField(0).toString()); stmt.executeUpdate(); } @Override public void close() throws SQLException { // 关闭连接 if (conn != null) { conn.close(); } if (stmt != null) { stmt.close(); } } } } ``` 上面的示例代码使用FlinkKafkaConsumer将Kafka数据转换为Flink Table,然后使用executeInsert将Flink Table写入Hive。此外,我们还定义了一个HiveSink来将数据写入Hive。请注意,为了使该作业正常运行,您需要在本地启动一个Hive服务,并创建一个名为“my_hive_table”的表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值