Flink的设计

特性

状态管理

  • Exactly-one 的实现
    基本原理:周期性快照(state_snapshot) + Event log(pos_x) 位置记录。即state_snapshot@pos_x
    分布式环境下每个节点都保存各自的快照与日志位置,形成总的checkpoint.
  • Event Time
    • Event time: 事件自己定义的时间戳。(Event Producer在交给Flink平台是已经创建好)
    • Ingestion time: 事件进入Flink数据流的source时间。
    • Processing time: 某个Operator对事件处理的本地系统时间。
  • 灵活的窗口操作
    支持基于time, count, session 以及 data-driven的窗口操作。在流式处理中,窗口决定了对流数据的聚合操作的间隔。
  • 有状态数据操作
    • 状态信息可以以key/value形式分布存储在各数据流中。只能通过keyBy()函数访问。
      一种是内存中的Hash map,另一种是存在Rocksdb(KV存储)中
  • Savepoints
    支持手工触发的状态保存。保存点是手动触发的,触发时会将它写入状态后端。

内存管理

Flink在JVM内部实现自己的内存管理

API设计

API层分为面向无界stream的流处理API, 和面向batch的批处理API。
API抽象层次从底层控制到SQL封装。

用户接口

  • Stream: 中间结果
  • Transformation: 数据操作,可以对一个或多个Stream进行处理。他们共同组成DAG结构。
    Flink对Stream和Transformation的处理都是并行的。在并行设计下Stream被拆分成Stream Partitions, Operator在并行任务中也变成Operator Subtask。

运行期进程

  • JobManagers
    master, 调度任务,协调checkpoint。可以有多个,但只有一个leader。
  • TaskManagers
    workers, 执行数据流或子任务。每个Worker(Task Manager)是一个JVM进程。
    TaskManager会将内存抽象成多个TaskSlot,用于执行Task任务。每个Task Slot代表固定的资源子集。目前Task Slot没有对CPU进行隔离,仅是针对内存。
    实践中,比较好的每个TaskManager的task slot的默认数量最好是CPU的核数。
  • Client
    任务提交者。可以断开或保持连接以获取任务状态。

如何创建Blog

布局

类型 文件路径
post source/_post
page source
draft source/_draft

创建命令

1
2
3
4
5
6
7
8
# 创建草稿
# 文件名和博客标题可以不一致,博客的标题通过title:标签指定
hexo create draft %file name%
hexo publish post %file name%
# 直接发布博客
hexo new post %file name%
# 删除博文
hexo clean #并在source/_posts/中直接删除文件

添加图片

1
2
3
4
5
6
<!-- 引用外部图片 -->
<img src="外部的url" width="160"/>
<!-- 引用内部图片 -->
<!-- 在source目录下创建img文件夹,将图片放到这个文件夹下 -->
<img style="display:inline" src="img/pb_1.png" width="100"/>
<!-- 如果希望图片在一行中显示,可以通过修改display:inline属性。同理也可以通过div标签和其他CSS进行显示控制。-->

配置 github

1
2
3
4
deploy:
type: git
repository: https://github.com/$用户名/$用户名.github.io
branch: master

发布服务

1
2
3
4
5
6
7
8
9
# 编译为静态文件
hexo g
# 启动本地预览
# 修改_post下的markdown会直接在服务器上进行刷新,无需运行静态文件编译
hexo s
# 发布到Github
hexo d
# 清理
hexo clean

美化博客(安装主题)

  • 安装next主题
    1
    2
    cd $LOCAL_HEXO_HOME
    git clone https://github.com/iissnan/hexo-theme-next themes/next
  • 配置
    1
    2
    3
    4
    5
    // 修改 _config.yml 中的主题样式为theme
    theme: next
    // 修改 编码为中文, 务必确保next/languages/目录下有同名的字体文件
    language: zh-Hans
    timezone: Asia/Shanghai
    其他美化请参考 Hexo-Next-主题优化

环境搭建

使用Docker搭建分布式环境(windows)

  • 从flink官网下载Flink Playgound代码
  • 挂载示例代码中配置文件目录到/var/conf中
    在windows下本地目录不能直接挂载到docker image中。我们需要将配置文件夹先挂载到docker虚拟机的文件目录。
    然后才能通过docker启动命令,或docker-compose的配置文件指定挂载方式。因为所有的docker命令都会实际运行在virtual box中。
    有一个比较奇怪的地方是使用docker而不是docker-compose启动镜像时,可以以相对路径方式挂载命令行当前的windows目录。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo mount -t vboxsf conf /var/conf
# setup into flink-playgrounds/operations-playground
# 启动服务
docker-compose up -d
# 查看服务列表
docker-compose ps
# 查看日志
docker-compose logs -f jobmanager
docker-compose logs -f taskmanager
docker-compose logs -f kafka
# 进入启动容器中查看
docker exec -it operationsplayground_jobmanager_1 bash
# 终止服务
docker-compose down -v
  • 服务管理

    Web console: http://localhost:8081 (使用virtual box的IP地址替换localhost)
    RESTful API: curl localhost:8081/jobs