建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块
直达楼层
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

采纳成功

您已采纳当前回复为最佳回复

狗叔

发帖: 13粉丝: 0

发消息 + 关注

发表于2018年04月18日 09:54:06 18009 1
直达本楼层的链接
楼主
显示全部楼层
[技术干货] Flink – 实时流计算领域内的新贵

万物互联的时代,在很多场景中,数据都是源源不断产生的,比如物理传感器提供的测量数据、服务器上的日志数据、金融市场产生的数据等,而这些数据的价值随着时间的流逝会迅速降低,这就要求数据被实时地、持续地处理。在这种背景下,就产生了很多用于实时流计算的开源框架,比如Kafka、Storm、Spark Streaming和本文要介绍的Flink等。
完善的流式计算不仅应该提供实时计算能力,还应该支持计算过程中的状态管理,状态主要是指计算过程中需要的数据或者变量,例如:统计计算中的aggregation(sum/min/max…),机器学习中的feature和model,状态管理包括这些数据的存储、备份、恢复,版本管理,提供读写访问API,并保证一致性。此外,完善的流计算还需要考虑数据的时序问题,因为现实场景中,数据的产生顺序和接收顺序未必一致,因此需要给数据附带时间戳属性,即:event time,计算逻辑可以按照数据的event time来处理,这样可以解决数据的乱序问题,配合watermark机制,可以较好的解决time window计算。
ApacheFlink是一种开源的分布式流化和批量化数据处理平台。Flink的诞生受到了Google Data Flow模型的启发,可支持Java和Scala语言开发的Stream Processing API。相比其他流式数据处理框架,Flink中不存在微批量(Micro batching)数据,而是使用了一种“一次一条消息”的流处理技术。
navbar-brand-logo.jpg
ApacheFlink的核心是运行时(Runtime),一个分布式流式数据流引擎,提供数据分发和通信。流式数据流引擎将每个程序解释为数据流图。在Runtime之上,有用于Stream处理的DataStream API和用于批处理的DataSet API。
stack.png
另外Flink还包含了多种多样的扩展库,用来解决不同领域内的问题:
1. TableAPI支持对数据使用SQL查询。它们很容易嵌入在DataStream和DataSets API中,并支持关系运算符(如选择,聚合和连接)。
2. Flink ML,是Flink的机器学习库,提供了机器学习Pipelines API并实现了多种机器学习算法。它可通过DataSet API执行机器学习任务,它使用户能够编写ML管道,使其更容易处理机器学习工作流程。ML管道将ML流的不同步骤绑定在一起,使其有效地在生产环境中准备和部署模型。
3. Gelly,Flink的图计算库,提供了图计算的相关API及多种图计算算法实现。它提供了一组操作符来创建和修改图形,图形由边缘的DataSet和顶点的DataSet表示。Gelly仅适用于DataSet API,并且只能用于批处理。
4. FlinkCEP是Flink的复杂事件处理库。它允许用户快速检测无尽数据流中的复杂事件模式。Flink CEP仅可用于通过DataStream API的流处理。
此外,Flink也可以方便地和Hadoop生态圈中其他项目集成,例如Flink可以读取存储在HDFS或HBase中的静态数据,以Kafka作为流式的数据源,直接重用MapReduce或Storm代码,或是通过YARN申请集群资源等。
Flink的基本用法也是很简单的,下面是一个WordCount的例子:
  
object SocketWindowWordCount {
  
  
     def main(args: Array[String]) : Unit = {
  
  
        // the port to connect to
  
        val port: Int = try {
  
             ParameterTool.fromArgs(args).getInt("port")
  
        } catch {
  
            case e: Exception => {
  
                System.err.println("No  port specified. Please run 'SocketWindowWordCount --port '")
  
                return
  
            }
  
        }
  
  
        // get the execution environment
  
        val env: StreamExecutionEnvironment =  StreamExecutionEnvironment.getExecutionEnvironment
  
  
        // get input data by connecting to  the socket
  
        val text =  env.socketTextStream("localhost", port, '\n')
  
  
        // parse the data, group it, window  it, and aggregate the counts
  
        val windowCounts = text
  
            .flatMap { w => w.split("\\s")  }
  
            .map { w => WordWithCount(w,  1) }
  
            .keyBy("word")
  
            .timeWindow(Time.seconds(5),  Time.seconds(1))
  
            .sum("count")
  
  
        // print the results with a single  thread, rather than in parallel
  
        windowCounts.print().setParallelism(1)
  
  
        env.execute("Socket Window  WordCount")
  
     }
  
  
     // Data type for words with count
  
     case class WordWithCount(word: String, count: Long)
  
}
  
可以看到,StreamExecutionEnvironment用来初始化流计算的环境,使用其API就可以从socket中流式的读取数据生成DataStream对象,并且使用丰富的算子来对流式数据进行处理。
相比较Spark Streaming来说,两者都支持易用性较好的API,并且可以保持较大的吞吐量和exactly once的数据处理保证,容错机制在两个系统里也表现的比较好。但相对于Spark Streaming的micro batch处理方式来说,Flink采取的是流式处理,数据是即时接收、即时处理的,相对于micro batch减少了作业调度的时间,可以取得更低的延迟(毫秒级)。相对于Storm,Flink支持状态管理,无需用户自行对状态进行操作,并且支持比较完善的窗口操作,可以允许用户使用Event Time来进行窗口操作,在实际场景测试中,Flink比Storm的单线程吞吐量高出3-5倍左右,满吞吐时的时延约为Storm的一半。由此可见,Flink适用于以下实时流计算场景:
1.要求消息投递语义为Exactly Once;
2.数据量较大,要求高吞吐低延迟;
3.需要进行状态管理或窗口统计。
举报
分享

分享文章到朋友圈

分享文章到微博

采纳成功

您已采纳当前回复为最佳回复

Big Data

发帖: 101粉丝: 61

级别 : 版主

发消息 + 关注

发表于2018年04月18日 10:03:58
直达本楼层的链接
沙发
显示全部楼层

学习了,好东东

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册

结贴

您对问题的回复是否满意?
满意度
非常满意 满意 一般 不满意
我要反馈
0/200