Flink 学习笔记二

2017/06/24 Flink

Flink2 学习笔记二

Flink的功能

  1. 高性能。Flink设计之初就是为了实现高性能低延迟。不同于Spark,Flink不需要做很多手动配置就可以实现很好的性能。Flink的流水线处理机制设计使用它比它的竞争者性能更加出色。
  2. 保证唯一处理机制 。Flink的checkpoint机制使得程序可以保证对每条数据只处理一次。
  3. 灵活的流窗口机制 。Flink支持数据驱动的窗口,使得使用者可以根据时间,计数器或者Session建立窗口,窗口也可以被自定义从而实现在流中提取特征。
  4. 容错机制。Flink分布式,轻量级快照使得程序的容错能力很高。
  5. 内存管理。Flink自己实现了内存管理功能,使得Flink程序不会被JVM的GC功能所影响。主要实现方法是hashing,indexing,caching,sorting。
  6. 优化器。Flink批处理API是被优化过以避免消耗内存的操作的像是shuffle,sort等操作。它同样使用缓存以减少磁盘IO操作。
  7. 同时支持流处理和批处理操作。
  8. 丰富的库支持,Flink支持很多机器学习,图计算,关系数据处理等库。同时很容易实现复杂事件处理和告警。
  9. 消息顺序语言支持。Flink支持消息时间语义,使得它可以处理有序接收的消息。

上手指南

单机运行

去下载一个Flink程序,解压开,然后运行 start-local.sh文件即可。

集群运行

集群运行程序的话,需要hadoop集群,至少2核心CPU和4GB内存。需要四台机器 ,一台作为Job Manager,三台作为Task Manager存在。然后配置SSH无密钥登陆。然后安装flink,修改flink的配置文件conf/flink-conf.yaml文件。最后使用start-cluster.sh脚本来启动程序。 Flink的UI是在8081端口上。

数据处理API

实时分析是一个重要的话题,为了支持处理这个问题,Flink开发了数据处理API,叫作DataStream API。包含以下方面:

  1. 执行环境(Execution environment)
  2. 数据源(Data sources)
  3. 数据处理(Transformation)
  4. 数据输出(Data sinks)
  5. 连接器(Connectors) 任何一个flink程序都有一个确定的结构,这个结构如下图所示: 图一

Execution environment

为了写Flink程序,我们需要一个exectuion environment,Flink支持三个执行环境。

  1. 获得一个已经存在的执行环境。
  2. 创建一个本地执行环境。
  3. 创建一个远程执行环境。 只需要调用getExecutionEnvironment(),这个函数会根据上下文提供所要求的执行环境。在IDE中执行Flink程序的时候会启动本地执行环境,如果是运行Jar包会启动分布式执行环境。或者也可以在代码中选择运行环境。createLocalEnvironment()或者是createRemoteEnvironment(String host,int port,String ,Jar file)

Data Source

是Flink程序的数据源,是Flink程序结构的第二个部分。Flink有一些内置的Data source function,Flink同时也支持自定义data source。 内置的source如下:

socket-based

socketTextStream(hostName,port)
socketTextStream(hsotName,port,delimiter)
socketTextStream(hostName,port,delimiter,maxRetry)

file-based

如果是文本文件readTextFile(String path)可以把文件作为流访问,一行一行的读取文件,同时会调用TextInputFormat。 也可以用readFile(FileInputFormat<Out> inputFormat,String path),这样可以自定义文件读取方法。 同时Flink也支持交文件作为流读取。

readFileStream(String filePath,long intervalMillis,FileMonitoringFunction.WatchType watchType)

WatchType有三种:

  1. ONLY_NEW_FILES 只处理新文件。
  2. PROCESS_ONLY_APPENDED 只处理文件内容增加的情况。
  3. REPROCESS_WITH_APPENDED 系统重新处理文件有添加内容的文件。

如果文件不是文本文件,可以用下述函数:

readFile(fileInputFormat,path,watchType,interval,pathFilter,typeInfo)

这个函数会在内部把文件流读取变成两个子任务,一个负责监视文件路径,一个负责读取文件,读取文件的子任务是并行执行的,监视任务不是并行执行的。如图所示: 图二

Show Disqus Comments

Search

    Table of Contents