flink

Apache 开源的流处理引擎

Posted by 果然 on June 15, 2022

流程包括:
-1. 设置运行环境

// java
// 使用本地资源
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 使用远程资源
StreamExecutionEnvironment env = StreamExecutionEnvironment.createRemoteEnvironment(host, port);
// scala
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
val env = StreamExecutionEnvironment.getExecutionEnvironment

-2. 获取数据源

// java 
DataStreamSource<String> stream = env.socketTextStream(hostName, port);
// scala
val stream = env.socketTextStream(hostname,port);

-3. transformation
-4. sink
将运行结果保存至kafka/hbase等,或print
-5. 执行提交任务

env.execute("xxx");

flink 作为第四代大数据计算引擎,具备优秀的特性,如:高性能、低延迟、支持事件时间和无序事件、内存管理、可扩展性等,以下为几个比较重要的特性:
-1. 事件驱动型
-2 流与批的世界观不同
-3. 分层API(stateful stream processing、DataStream/DataSet API、table API、SQL)
-4. 支持状态计算
-5. 支持 exactly-once语义
-6. 支持事件时间(Event time/Ingestion time/Processing Time)

维表关联

在使用 flink 对数据解析时,涉及到**维表关联**的概念,该概念是 flink 的重点也是难点。

what(什么是维表关联)

简单理解:维表关联即join操作,是两条数据流中的事件进行联结(connect)或join。

**例子**

:如 flink 主流数据包含 student 的 id,name,sex,city id,城市维度表(city_id,city_name)存储在 hbase/kafka/mysql等中,此时,若要输出 student 的city_name 就涉及到了两条数据流之间的关联操作。也可以称作,hbase/kafka/mysql lookup 操作。(???)

关联方案

-1. 将维表预加载到内存中关联(richmapfunction):适用于维表小、基本不变的情况,如本例中从mysql中lookup 数据协议
-2. 维表流存储在 state中:同样维表的数据量受限制(内存)。
-3. 广播维表(内存):使用 flink的 broadcast state将维度数据流广播到下游做 join 操作。
-4. 热存储维表(hbase+cache+异步查询):适用于维度表大的情况,支持flinksql,但是会影响性能。如flinksql中,参数:lookup.async、lookup.cache.ttl等。

一些关联的例子

-1. Flink HBaseLookupFunction