【flink】RowData copy/clone方式

本文介绍了在ApacheFlink中,如何高效地复制RowData,包括使用复杂循环的方式和推荐的RowDataSerializer方法,强调了后者的简洁性和性能优势。

说明:一般用户常用的是GenericRowData。flink内部则多使用BinaryRowData

方法一、循环解决(不推荐):

代码较为复杂需要根据RowType获取到内部fields的logicalType,再使用RowData.createFieldGetter方法创建fieldGetters

    public static void copyRowData(RowData input, GenericRowData output, List<RowData.FieldGetter> fieldGetters) {
        for (int i = 0; i < input.getArity() && i < output.getArity(); i++) {
            if (input instanceof GenericRowData) {
                output.setField(i, ((GenericRowData) input).getField(i));
            } else {
                Preconditions.checkArgument(fieldGetters != null);
                Object value = fieldGetters.get(i).getFieldOrNull(input);
                output.setField(i, value);
            }
        }
    }

方法二、使用RowDataSerializer(推荐)

使用RowDataSerializer.copy方法

public RowDataSerializer(RowType rowType) {
...
}

public RowData copy(RowData from) {
...
}
要运行 Flink 示例程序 `WordCount.jar` 并测试其流处理功能,需使用 Flink 的流处理 API(DataStream API),并确保程序运行在支持流处理的环境中。以下是实现步骤和注意事项: ### 环境准备 1. **启动 Flink 集群** 如果尚未启动 Flink 集群,可以使用以下命令启动本地集群: ```bash ./bin/start-cluster.sh ``` 这将启动一个 JobManager 和一个 TaskManager,适合本地测试使用。 2. **准备输入数据源** 流处理通常依赖于实时数据源,例如通过 `nc`(NetCat)发送的数据。启动一个监听端口的 NetCat 服务: ```bash nc -l 9009 ``` 这将等待用户输入数据,并将其作为流式输入发送到 Flink 程序。 ### 运行流处理 WordCount 示例 Flink 提供了 `SocketWindowWordCount` 示例程序,用于演示如何通过流处理 API 统计单词出现的次数。运行该程序的命令如下: ```bash ./bin/flink run -c com.flink.example.SocketWindowWordCount ./examples/streaming/SocketWindowWordCount.jar --port 9009 ``` 其中 `-c` 指定主类名,`--port` 表示连接的端口号。程序会从指定端口读取数据流,并进行窗口统计。 ### 示例程序代码 以下是一个简化版的 `SocketWindowWordCount` 示例代码,展示了如何通过 DataStream API 实现流式 WordCount: ```java public class SocketWindowWordCount { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<String> text = env.socketTextStream("localhost", 9009); DataStream<WordWithCount> windowCounts = text .flatMap((String value, Collector<WordWithCount> out) -> { for (String word : value.split("\\s")) { out.collect(new WordWithCount(word, 1)); } }) .keyBy("word") .timeWindow(Time.seconds(5)) .sum("count"); windowCounts.print().setParallelism(1); env.execute("Socket Window WordCount"); } public static class WordWithCount { public String word; public long count; public WordWithCount() {} public WordWithCount(String word, long count) { this.word = word; this.count = count; } @Override public String toString() { return word + " : " + count; } } } ``` 该代码通过 `socketTextStream` 方法从指定端口读取数据流,然后使用 `flatMap` 将文本拆分为单词流,再通过 `keyBy` 和 `timeWindow` 进行窗口统计,并最终输出单词计数结果[^4]。 ### 提交任务到 Flink 集群 在 Flink 集群启动后,可以通过 Web UI 或命令行提交任务。命令行方式如下: ```bash ./bin/flink run -m localhost:8081 -c com.flink.example.SocketWindowWordCount ./examples/streaming/SocketWindowWordCount.jar --port 9009 ``` 其中 `-m` 指定 Flink 集群的 JobManager 地址,`-c` 指定主类名,`--port` 为数据源端口号。 ### 测试流处理功能 1. **发送测试数据** 在启动 NetCat 后,手动输入一些文本,例如: ``` hello world flink stream processing hello flink ``` 程序将根据设定的窗口大小(如 5 秒)输出单词计数结果。 2. **查看执行结果** Flink 程序的输出将显示在控制台,例如: ``` hello : 2 world : 1 flink : 2 stream : 1 processing : 1 ``` 这表明程序成功统计了窗口内的单词出现次数。 ### 注意事项 - **端口冲突**:确保使用的端口(如 9009)未被其他程序占用。 - **Flink 集群状态**:确保 Flink 集群正常运行,可以通过 Web UI(默认地址为 `http://localhost:8081`)查看任务状态。 - **依赖库**:如果程序依赖外部库(如 Kafka 连接器),需确保这些库已正确添加到 Flink 的 `lib` 目录或通过命令行指定。 通过以上步骤,可以成功运行 Flink 的流处理示例程序,并验证其功能。如果遇到连接问题或任务失败,可检查日志文件(位于 Flink 的 `log` 目录)以获取详细信息[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值