初探Flink与第一个Flink程序-wordcount

Flink简介

   Apache flink是一个开源的分布式、高性能、高可用、准确的 流处理框架,可对有限数据流和无限数据流进行有状态计算,可部署在各种集群环境下(local,standalone,yarn,以及云端)。统一的大数据分析和流计算、批计算及机器学习引擎,flink原生支持了迭代计算,内存管理和程序优化。Flink架构图如下(从官网拷贝):

注:有限数据流是指有限的不会改变的数据集合使用批处理属于离线运算(类似于直梯工作一般,把一批一批用户送往目的地), 无限数据流是指数据流源源不断的产生,通常使用流式计算(类似于手扶梯工作一般,每来一个人就把其开始送往目的地),无限数据流有:点击流,传感器测量数据,金融市场产生的数据,服务器上的日志文件 等等。

大数据处理模式:

     离线计算:批量获取数据、批量传输数据、周期性批量计算数据、数据展示

     实时计算:数据实时产生、传递、计算、显示

     流式计算:流水线形式的计算

     批处理:在预先定义的时间内运行计算,当完成时释放计算资源

离散计算:今天早上一点,把昨天累积的日志,计算出所需结果。一般累积时间较长,计算量级较大,计算时间也较长实时计算:与离线计算相比,运行时间短(人可以等待的时间),计算量级相对较小。强调计算过程的时间要短,即所查当下给出结果;

实时计算,强调的是实时。比如小明要查看他去年一年的消费总额度,那么当小明点下统计按钮的时候,服务器集群就需要赶紧计算了,且必须在小明能够忍耐的时间范围内得出结果。实时计算与离线计算的最大区别,就是离线计算是人无法忍耐的时间进行计算,因此人不需要等待,把任务丢给计算机后,自己该干嘛就去干嘛。

流式计算:与实时计算相比,时效稍微慢些,实时计算是以主动查询来触发,流式计算是以事务发生及结果变更为触发。与实时计算相比,时效稍微慢些,实时计算是以主动查询来触发,流失计算是以事务发生及结果变更为触发。比如,服务器端,有一个值,是记录小明订单数量。当小明每买一件东西后,服务端立即发出一个交易成功的事件,该值接收到这个事件后就立即加1。如果用离线计算的方式来做,估计是在查询时,才慢腾腾的从低速存储中,把小明的所有订单取出来,统计数量。

批处理:在批处理方式中,数据首先被存储,随后被分析。MapReduce是非常重要的批处理模型。MapReduce的核心思想是,数据首先被分为若干小数据块chunks,随后这些数据块被并行处理并以分布的方式产生中间结果,最后这些中间结果被合并产生最终结果。MapReduce分配与数据存储位置距离较近的计算资源,以避免数据传输的通信开销。由于简单高效,MapReduce被广泛应用于生物信息、web挖掘和机器学习中。

离线和实时指的是:数据处理的延迟;

批量和流式指的是:数据处理的方式。

Flink的流处理和批处理

       在大数据处理领域,批处理任务与流处理任务一般被认为是两种不同的任务,一个大数据框架一帮会被设计为只能处理其中一种任务,例如Storm只支持流处理任务,而Map + Reduce spark只支持批处理任务,Spark Streaming是spark之上支持流处理任务的子系统,采用一种micro-batch架构,把输入的数据流切分成细粒度的batch,并未每一个batch数据提交一个批处理的spark任务,所以spark Streaming本质上还是基于spark批处理系统对流式数据进行处理。

       Flink通过灵活的执行引擎,能够同时支持批处理任务与流处理任务,在执行引擎这一层流处理系统和批处理系统最大的不同在于节点间数据传输方式。流处理系统:当一条数据被处理完成之后,序列化到缓存中,然后立刻通过网络传输到下一个节点,由下一个节点继续处理---低延迟;批处理系统:当一条数据完成后,序列化到缓存中,不会立刻传输到下一个节点,而是当缓存写满后,就持久化到本地硬盘,当所有数据都处理完成后,才会通过传输给下一个节点---高吞吐量。Flink执行引擎采用了一种灵活的方式,通过设置缓存块超时值来控制数据传输,当超时值为0时,相当于流处理系统—最低的处理延迟;当超时值为无限大时,则flink的数据传输方式类似批处理系统—最高吞吐量。

Flink的运行时架构

角色主要有client(客户端), JobManager (master管控节点),TaskManager(slave) 角色间通信(AKKA),数据的传输(Netty)。

TaskManager是进程,下面运行的是task线程,每个task/subtask线程下可以运行一个或者多个operator,及OperatorChain。

Task 是class,subtask是object。

一个taskmanager通过slot(任务槽)来控制他上面可以接受多少个task(仅限内存托管,目前CPU未做隔离)slot均分TaskManager所托管的内存

同一个Taskmanager中的task共享TCP连接(通过多路复用)和心跳信息,他们还可以共享数据集合数据结构,从而减少每个任务的开销。

Flink入门案例--wordcount

idea+maven+git模式

  第一步.创建maven项目--在控制台下输入

mvn archetype:generate                              

   -DarchetypeGroupId=org.apache.flink             

   -DarchetypeArtifactId=flink-quickstart-java     

   -DarchetypeCatalog=https://repository.apache.org/content/repositories/snapshots/

    -DarchetypeVersion=1.10-SNAPSHOT

注:对于Maven 3.0或更高版本,不再可以通过命令行指定存储库(-DarchetypeCatalog),可通过指定版本来解决问题.

mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate -DarchetypeGroupId=org.apache.flink -DarchetypeArtifactId=flink-quickstart-java -DarchetypeVersion=${1:-1.9-SNAPSHOT} -DgroupId=org.myorg.quickstart -DartifactId=$PACKAGE -Dversion=0.1 -Dpackage=org.myorg.quickstart  -DinteractiveMode=false -DarchetypeCatalog=https://repository.apache.org/content/repositories/snapshots/

  第二步从idea打开创建好的maven项目

创建好的项目目录如下所示:

https://github.com/apache/flink/tree/master/flink-examples/flink-examples-streaming/src/main/java/org/apache/flink/streaming/examples链接找到wordcount代码,即可,如下

核心代码如下:

DataSet<Tuple2<String, Integer>> counts =
  // split up the lines in pairs (2-tuples) containing: (word,1)
  text.flatMap(new Tokenizer())
  // group by the tuple field "0" and sum up tuple field "1"
  .groupBy(0)
  .sum(1);

结果如下所示

Local Flink cluster模式:

该模式下需要下载flink安装包到linux系统中,对于版本而言,如果之后需要使用hadoop组件,则需根据安装的hadoop版本来选择flink版本,本人之前安装的是hadoop 2.7.3,故使用flink-1.7.2-bin-hadoop27-scala_2.11.tgz。

下载该flink版本(地址为:http://mirror.bit.edu.cn/apache/flink/flink-1.7.2/flink-1.7.2-bin-hadoop27-scala_2.11.tgz

上传到虚拟机中,使用tar -zxvf  flink-1.7.2-bin-hadoop27-scala_2.11.tgz -C /usr/local

其目录如下:

local模式不需要修改任何配置,可直接使用。

进入flink目录输入:./bin/start-cluster.sh ,可在web端输入 http://ip地址:8081

centos下安装netcat

wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz

tar –zxvf netcat-0.7.1.tar.gz –C /usr/local

进入netcat目录下,查看编译 配置文件

./configure

编译安装

make &&make install

然后打开/etc/profile 配置全局变量NETCAT_HOME=/安装目录,在path后面加上:$NETCAT_HOME/bin

验证 安装成功 nc -help

运行wc程序 首先使用netcat来启动本地服务

nc -l 9000(有些版本是nc -l -p 9000)

验证 9000端口是否启动重新打开一个终端,输入 netstat -anlp | grep 9000 

启动成功之后,在第二个终端提交代码

注:安装netcat时可能 报下列错误

checking for gcc... no
checking for cc... no
checking for cc... no
checking for cl... no
此时说明缺少gcc cc cl.ext,安装即可

yum install -y gcc glibc

可通过在web端查看进程状态,在第一个终端下输入字符串,以空格隔开

再次启动一个终端查看输出结果

运行成功。

Flink特性

    支持批处理和数据流程序处理,优雅流畅的支持java和Scala API,同时支持高吞吐量和低延迟,支持事件处理和无序处理通过stataStream API,基于DataFlow数据流模型,在不同的时间语义下灵活支持灵活的窗口,仅处理一次的容错担保,自动反压机制。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值