flink-streaming消费kafka动态分区写入HDFS(SequenceFile)文件

本文介绍如何使用 Apache Flink 在 streaming 模式下实现动态分区,重点讲解自定义分区方法的过程,包括从流数据中获取分区字段,并通过具体示例展示如何配置 StreamingFileSink 实现数据写入 HDFS 的 SequenceFile。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         

 

        主要记录下streaming模式下动态分区怎么写文件,sql模式直接写就是了,streaming模式需要自己写下分区方法。大致的数据流程是消费kafka,拆解json,数据写到hdfs(sequenceFile)路径。

1、分区需要自定义,这里是读取流数据,获取分区字段

package partitionassigner;

import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.core.io.SimpleVersionedSerializer;
import org.apache.flink.streaming.api.functions.sink.filesystem.BucketAssigner;
import org.apache.flink.streaming.api.functions.sink.filesystem.bucketassigners.SimpleVersionedStringSerializer;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;

import java.text.SimpleDateFormat;
import java.util.Date;

public class PartitionAssigner<IN> implements BucketAssigner<Tuple2<LongWritable, Text>, String> {

    @Override
    public String getBucketId(Tuple2<LongWritable, Text> textTuple2, Context context) {
        String allCol = textTuple2.getField(1).toString();
        //截出来分区字段
        String[] strings = allCol.split("\\^");
        //取出来时间戳字段
        Long createTime = Long.parseLong(strings[10]);
        //取出来rank分区字段
        int rankPt =  Integer.parseInt(strings[11]);
        //时间戳 -> yyyyMMdd
        Date date = new Date(createTime);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyyMMdd");
        return "day=" + simpleDateFormat.format(date) + "/" + "rank_pt=" + rankPt;
    }

    @Override
    public SimpleVersionedSerializer<String> getSerializer() {
        return SimpleVersionedStringSerializer.INSTANCE;
    }


}

2、文件输出调用分区生成方法

        StreamingFileSink<Tuple2<LongWritable, Text>> sink = StreamingFileSink.forBulkFormat(
                        path,
                        new SequenceFileWriterFactory<>(hadoopConf, LongWritable.class, Text.class,"org.apache.hadoop.io.compress.GzipCodec",
                                SequenceFile.CompressionType.BLOCK))
                .withBucketAssigner(new PartitionAssigner())
                .build();

3、我的路径写的本地,可以看到文件夹,生产上改下文件路径就好

4、sequencefile列分隔符的问题

我是在toString这一步用 ^ 作为分隔符,然后hive建表的时候再用这个作为分隔符,这个文件格式在用impala查询的时候会有格式问题,个人觉得整体来说不如parquet稳定,细节问题可以少很多。

5、小文件问题

sink的线程太少数据就写的慢,文件会比较大,避免了小文件问题。

同样checkpoint时间短也会写的快,数据量小的话也会有小文件问题。不过我处理流量数据对这个问题感知还好,本身数据量大,一天几个t,只有夜里的时候文件会小一点。

总结:这个处理是想在流上把数据处理好写到离线数仓的dwd层,省去离线的处理逻辑,流批真正一体要做的工作还是比较多啊,维护成本当下看也高。

<think>好的,我需要帮助用户找到Flink Kafka连接器版本2.12-1.1的相关信息和依赖。首先,用户提到的版本格式有点不寻常,通常Flink连接器的版本结构是Flink版本加连接器版本,比如flink-connector-kafka_2.12后面跟着的是对应Flink的版本号。用户给出的“2.12-1.1”可能是指Scala版本2.12和连接器版本1.1,但需要确认。 首先,查阅Flink官方文档,看看是否有对应的版本。Flink Kafka连接器的版本通常与Flink主版本号一致,例如Flink 1.17.x对应的连接器可能是1.17.x版本。用户提到的2.12可能是指Scala的版本,而1.1可能是指连接器的版本,但这样的组合是否存在呢? 根据引用[2]中的例子,用户之前添加了Kafka 0.10的依赖,使用的是artifactId为flink-connector-kafka-0.10_2.11,版本1.6.1。这说明在旧版本中,artifactId的结构是flink-connector-kafka-<kafka版本>_<scala版本>,版本号可能对应Flink的版本。但现在的Flink连接器可能改变了命名规则。 现在,Flink官方仓库中的Kafka连接器通常以Flink的版本为主,例如对于Flink 1.17,连接器版本可能是1.17.0,并且Scala版本可能包含在artifactId中,如_2.12或_2.13。因此,用户提到的2.12-1.1可能不太准确,需要进一步澄清。 接下来,检查Maven仓库。访问https://mvnrepository.com/,搜索flink-connector-kafka。查看是否有Scala 2.12和版本1.1的组合。例如,是否存在类似flink-connector-kafka_2.12版本1.1的构件。但根据我的了解,Flink连接器的版本通常与Flink主版本一致,而1.1可能是一个较旧的版本,可能对应Flink 1.1.x,但那时候可能还不支持Scala 2.12,因为Scala 2.12是在较新的版本中引入的。 可能的结论是用户可能混淆了版本号。例如,正确的artifactId可能是flink-connector-kafka_2.12,而版本号是1.1.x,但需要确认是否存在这样的版本。或者用户可能指的是Kafka客户端的版本,而不是Flink连接器的版本。 如果用户确实需要Flink连接器与Kafka版本2.12和连接器版本1.1,可能需要查看Flink的旧版本文档。例如,Flink 1.1.x版本可能对应较旧的Kafka连接器,但那时候的命名方式可能不同。例如,旧版本的连接器可能使用不同的artifactId格式。 此外,用户提供的引用[1]中提到了flink-doris-connector-1.17,版本1.4.0,说明用户可能在使用较新的Flink版本,如1.17.x。因此,用户可能需要确认是否真的需要旧版本的连接器,或者是否有版本兼容性问题。 可能的解决方法是建议用户查看Flink官方文档中关于Kafka连接器的部分,确认正确的artifactId和版本号组合。例如,Flink 1.17对应的Kafka连接器版本应为1.17.x,并且artifactId中包含Scala版本,如flink-connector-kafka_2.12。 如果用户确实需要特定的版本组合,但官方未提供,可能需要检查是否有社区维护的版本,或者是否存在版本号的误写。例如,可能用户实际需要的是Scala 2.12和Flink连接器版本1.11.x,或者其他组合。 总结步骤: 1. 确认用户需求的正确性,可能存在版本号误解。 2. 检查Flink官方文档和Maven仓库,寻找可能的匹配版本。 3. 根据现有引用中的例子,指导用户正确配置依赖,特别是artifactId和版本的格式。 4. 若版本不存在,建议用户使用兼容版本,并提供相应示例。</think>根据您的描述,“Flink Kafka connector version 2.12-1.1”可能存在版本号格式的混淆。Flink连接器的版本命名通常遵循**Flink主版本号** + **Scala版本**的组合,例如: - `flink-connector-kafka_2.12`表示Scala 2.12版本的连接器 - `1.17.1`表示适配Flink 1.17.1 您提到的“2.12-1.1”可能是将Scala版本和Flink版本混合了。以下是具体分析: --- ### 1. **版本号的可能解释** - **若需适配Flink 1.1.x**:早期Flink版本(如1.1.x)的Kafka连接器依赖格式不同,且可能不兼容Scala 2.12(旧版本多使用Scala 2.11)[^2]。 - **若需适配Kafka 2.12**:Kafka自身的版本格式为`kafka_2.12-3.5.0`(如引用[1]所示),其中`2.12`是Scala版本,`3.5.0`是Kafka版本。Flink连接器需匹配Kafka版本,而非Scala版本。 --- ### 2. **正确依赖配置** #### 场景1:适配Flink 1.17 + Kafka 3.5.0(最新推荐) 若您使用**Flink 1.17.x**(如引用[1]中的环境),依赖应配置为: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka</artifactId> <version>1.17.1</version> </dependency> ``` 同时需匹配Kafka客户端的Scala版本(如Kafka 3.5.0对应Scala 2.12)[^1]。 #### 场景2:适配旧版本Flink 1.1.x 若您确需**Flink 1.1.x**的旧版本连接器,依赖格式为: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_2.11</artifactId> <version>1.1.5</version> </dependency> ``` 但需注意:此版本仅支持Scala 2.11且功能受限[^2]。 --- ### 3. **验证与下载** - **Maven仓库查询**:访问[Maven中央仓库](https://mvnrepository.com/),搜索`flink-connector-kafka`,筛选对应版本。 - **官方文档**:参考[Apache Flink官方文档](https://nightlies.apache.org/flink/flink-docs-release-1.17/docs/connectors/datastream/kafka/)确认版本兼容性。 --- ### 4. **代码示例(Flink 1.17 + Kafka)** ```java import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer; Properties props = new Properties(); props.setProperty("bootstrap.servers", "localhost:9092"); FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>( "input-topic", new SimpleStringSchema(), props ); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值