Flink经典案例HelloWorld

本文介绍了Apache Flink的基础用法,包括使用Maven生成项目骨架,编写Java和Scala代码实现批处理和流处理的HelloWorld示例。批处理示例展示了如何读取文本、数据处理转换及输出。流处理示例则演示了从Socket读取数据,进行实时计算,并按5秒窗口聚合数据。通过实例展示了Flink在数据处理中的基本操作。

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

扫码关注系列文章

 

​    Flink是由Scala进行开发的,而Scala是基于JVM的一种语言。所以最终也会转换为JAVA字节码文件,所以Flink程序可以由Java、Scala两种语言都可以进行开发。也可以同时开发。比如Java写一部分代码,Scala写另一部分代码。可以参考<Apache Flink利用Maven对Scala与Java进行混编>。

首先运用maven的flink1.13.0项目骨架生成项目

mvn archetype:generate     -DarchetypeGroupId=org.apache.flink   -DarchetypeArtifactId=flink-quickstart-java -DarchetypeVersion=1.13.0

查看生成后项目的pom文件:

Flink之HelloWorld读取text

下面是flink的读取text的示例:

// 1.准备环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 设置运行模式 为批
env.setRuntimeMode(RuntimeExecutionMode.BATCH);
// 2.准备数据源
DataStreamSource<String> elementsSource = env.fromElements("java,scala,php,c++",
        "java,scala,php", "java,scala", "java");
// 3.数据处理转换
KeyedStream<Tuple2<String, Integer>, String> streamResult = elementsSource.flatMap(new FlatMapFunction<String, String>() {
    @Override
    public void flatMap(String element, Collector<String> out) throws Exception {
        String[] wordArr = element.split(",");
        for (String word : wordArr) {
            out.collect(word);
        }
    }
}).map(new MapFunction<String, Tuple2<String, Integer>>() {
    @Override
    public Tuple2<String, Integer> map(String word) throws Exception {
        return Tuple2.of(word, 1);
    }
}).keyBy(new KeySelector<Tuple2<String, Integer>, String>() {
    @Override
    public String getKey(Tuple2<String, Integer> value) throws Exception {
        return value.f0;
    }
});
SingleOutputStreamOperator<Tuple2<String, Integer>> sum = streamResult.sum(1);
// 4.数据输出
sum.print();
// 5.执行程序
env.execute("flink-hello-world");

运行后,我们看到下面的结果。

下面我们设置为流处理方式,把env.setRuntimeMode(RuntimeExecutionMode.

STREAMING);执行结果如下,流处理每来一条处理一条

2> (php,1)2> (c++,1)2> (php,2)1> (java,1)1> (java,2)1> (scala,1)1> (java,3)1> (scala,2)1> (java,4)1> (scala,3)

 Flink之HelloWorld读取流:

flink之HelloWorld读取流

//获取运行环境
 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
 env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
 //连接socket获取输入的数据
 DataStreamSource<String> text = env.socketTextStream("127.0.0.1", port, "\n");
  //计算数据
DataStream<WordWithCount> windowCount = text.flatMap(new FlatMapFunction<String, WordWithCount>() {
 public void flatMap(String value, Collector<WordWithCount> out) throws Exception {
          String[] splits = value.split("\\s");
          for (String word : splits) {
                    out.collect(new WordWithCount(word, 1L));
                }
            }
 })//打平操作,把每行的单词转为<word,count>类型的数据
                //针对相同的word数据进行分组
                .keyBy("word")
                //指定计算数据的窗口大小
                .timeWindow(Time.seconds(5))
                .sum("count");
//把数据打印到控制台,使用一个并行度
windowCount.print().setParallelism(1);
//注意:因为flink是懒加载的,所以必须调用execute方法,上面的代码才会执行
env.execute("streaming word count");

 

过5秒后再次输入:

过5秒后再次输入:

我们看到数据每5秒计算一次。

好了今天就介绍到这里!
 

<think>好的,我现在需要帮用户介绍Python使用Flink的例子。首先,用户之前问了关于ISA-95标准的问题,现在转到了Python和Flink,可能是在工业自动化或数据处理方面的应用。用户可能有一定的技术背景,想了解如何用Python结合Flink进行实时数据处理或者流处理。 首先,我要确认Flink对Python的支持情况。Apache Flink主要用Java和Scala编写,但通过PyFlink,用户可以用Python API来编写作业。需要说明PyFlink的版本兼容性,比如Flink 1.9之后开始支持Python,现在可能已经更新到更高版本了。 接下来,用户可能需要一个简单的例子来入门。我应该选择一个典型的流处理案例,比如WordCount,这是大数据领域的经典例子,容易理解。另外,可能需要介绍安装步骤,确保用户能顺利运行示例。 另外,用户可能对实际应用场景感兴趣,比如实时数据分析、事件驱动应用或者ETL处理,需要举一些实际例子,比如日志分析、实时监控等。同时,需要指出PyFlink的局限性,比如某些高级功能可能不如Java API完善,性能也可能有差异。 还要注意代码的结构,确保用户能复制并运行示例,可能需要提醒安装必要的依赖,比如Java环境,PyFlink的安装命令。此外,需要解释代码的每一步,让用户理解数据处理的流程,比如Source、Transformation、Sink。 最后,总结PyFlink的优势和适用场景,帮助用户判断是否适合他们的项目需求。可能还需要提到社区支持和学习资源,方便用户进一步探索。</think>以下是使用Python(通过**PyFlink**)编写Apache Flink流处理任务的示例及关键步骤解析: --- ### **1. 环境准备** - **安装PyFlink**: ```bash pip install apache-flink ``` - **依赖**:确保本地已安装Java 8+(Flink运行需要Java环境)。 --- ### **2. 简单示例:实时单词计数(WordCount)** #### **代码实现** ```python from pyflink.datastream import StreamExecutionEnvironment from pyflink.datastream.functions import MapFunction, FlatMapFunction # 创建执行环境 env = StreamExecutionEnvironment.get_execution_environment() # 定义数据源(模拟实时输入) source_data = env.from_collection(["hello world", "hello flink", "flink is powerful"]) # 数据处理逻辑 class SplitWords(FlatMapFunction): def flat_map(self, value): return value.lower().split() class CountWords(MapFunction): def __init__(self): self.word_counts = {} def map(self, value): self.word_counts[value] = self.word_counts.get(value, 0) + 1 return (value, self.word_counts[value]) # 执行任务 result = ( source_data .flat_map(SplitWords()) # 拆分单词 .map(CountWords()) # 统计词频 .print() # 输出结果 ) env.execute("Python Flink WordCount") ``` #### **运行结果** ``` (hello, 1) (world, 1) (hello, 2) (flink, 1) (flink, 2) (is, 1) (powerful, 1) ``` --- ### **3. 核心概念解析** #### **3.1 数据流结构** - **Source**:`from_collection`模拟实时输入流。 - **Transformation**: - `flat_map`:拆分句子为单词(一对多转换)。 - `map`:统计每个单词的出现次数。 - **Sink**:`print()`将结果输出到控制台。 #### **3.2 窗口处理(示例:5秒滚动窗口统计)** ```python from pyflink.common import Time from pyflink.datastream.window import TumblingProcessingTimeWindows # 按时间窗口聚合 result = ( source_data .flat_map(SplitWords()) .map(lambda word: (word, 1)) .key_by(lambda pair: pair[0]) # 按单词分组 .window(TumblingProcessingTimeWindows.of(Time.seconds(5))) .sum(1) # 对计数求和 .print() ) ``` --- ### **4. 实际应用场景** - **实时日志分析**:监控服务器日志,统计错误频率。 - **传感器数据处理**:工业设备实时温度异常检测。 - **电商用户行为分析**:页面点击流实时聚合。 --- ### **5. PyFlink的限制与优化** - **限制**: - 部分高级API(如复杂状态操作)需依赖Java/Scala实现。 - 性能略低于Java API(序列化开销)。 - **优化建议**: - 对关键逻辑使用`@udf`装饰器加速。 - 调整并行度:`env.set_parallelism(4)`。 --- ### **总结** PyFlink为Python开发者提供了便捷的流/批处理接口,适合快速实现轻量级实时任务。若需深度优化或复杂功能(如自定义窗口、状态管理),建议结合Java/Scala API使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值