flink

一.flink是什么

 

实时计算框架,流处理

对于有界和无界的数据流进行有状态计算的框架和分布式处理引擎

flink和spark的对比

spark整体思想是批处理,也可以做流处理,即利用微批次模拟流处理

flink整体思想是流处理,也可以做批处理,即通过添加界限模拟批处理

1.DataStream(数据流)

源源不断产生的数据,可以确定flink是实时的计算框架

2.unbounded(无界) / bounded(有界)

unbounded源源不断的产生且没有任何限制的数据流,代表实时数据(流处理)
bounded在无界数据流的基础上,加上一个界限,代表批次数据(批处理)

3.stateful(状态化)

当前的数据要基于之前所有的数据进行计算,结果就是状态

根据每条数据进行实时更新

二.flink的主要特点

1.事件驱动型

每来一条数据,就触发程序执行,并把结果更新到state中

2.基于流的世界观

在flink中的世界中,一切都是流式数据

3.分层API

越顶层越抽象,使用越方便,但是具有局限性

越底层越具体,使用越复杂,但是越灵活

flink其他特点

1.支持时间语义

2.精准一次的状态一致性保存

3.与众多常用的系统进行连接:例如kafka,mysql,HBase,Hive等

4.高可用,动态拓展

三.为什么选择flink

1.有大公司的技术引领

2.flink是有自己的优势

   a.流处理的形式更加真实反应了我们的生活方式

   b.低延迟,flink和stome都是纯实时的,响应时间在毫秒级别对数据处理

   c.高吞吐,一秒钟可以处理几百万条数据

   d.容错机制,保证数据的安全可靠,保证运行环境的稳定

3.本身对流处理和批处理都可以支持

四.哪些行业需要流式处理

1.电商

2.每天学习量

3.物联网

4.银行和金融业

五.wordCount案例代码

1.批处理操作

def wordCount(env:ExecutionEnvironment) = {
    //获取原数据,泛型就是每一行数据的类型
    val lineDDataSet:DataSet[String] = env.readTextFile(path)
    //对每一行数据按空格拆分形成一个单词集合 单词的类型是String
    val wordsDataSet:DataSet[String] = lineDDataSet.flatMap(_.split(" "))
    //把每一个单词变成二元组的形式,key为单词String,value为1是Int类型
    val kvDataSet:DataSet[(String,Int)] = wordsDataSet.map((_,1))
    //把单词相同的分层一组   按照第0个字段进行分组
    val groupDataSet:GroupedDataSet[(String,Int)] = kvDataSet.groupBy(0)
    //在key相同的基础上,把第一个字段进行合并
    val resultDataSet:AggregateDataSet[(String,Int)] = groupDataSet.sum(1)
    //打印数据
    resultDataSet.print()
  }

  def main(args: Array[String]): Unit = {
    //创建批处理的运行环境
    val env:ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment
    wordCount(env)
  }

2.流处理操作

def wordCount(env:StreamExecutionEnvironment, args:Array[String]) = {

    //通过参数工具获取主方法的参数
    val params = ParameterTool.fromArgs(args)

    val inputPath = params.get("input")

    //读取元数据,每行数据都是字符串类型
    val lineDataStream:DataStream[String] = env.readTextFile(inputPath)
    //把数据进行切割形成单词集合
    val wordsDataStream:DataStream[String] = lineDataStream.flatMap(_.split(" "))
    //把单词变成k-v键值对
    val kvDataStream:DataStream[(String,Int)]  = wordsDataStream.map((_,1))
    //按key(第0个字段)相同进行分组 加Tuple元组
    val keyByDataStream:KeyedStream[(String,Int),Tuple] = kvDataStream.keyBy(0)
    //key相同把value值进行相加
    val resultDataStream:DataStream[(String,Int)] = keyByDataStream.reduce((wordPair1,wordPair2) => {
      //wordPair1 和 wordPair2 key相同 ,值相加
      (wordPair1._1,wordPair1._2+wordPair2._2)
    })
    //输出
    resultDataStream.print()
      //可以自定义并行度
      .setParallelism(1)

    //流处理必须添加开启启动执行的语句
    env.execute("wc")

    //8> (hadoop,1)
    //并行度 8
  }


    def main(args: Array[String]): Unit = {
      //创建流式处理的运行环境
      val env:StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment

      //设置全局的并行度 从头到尾只在这一条线上执行
      env.setParallelism(1)
      wordCount(env,args)
    }

 总结:

1.批处理使用的是 ExecutionEnvironment 运行环境,流处理使用是 StreamExecutionEnvironment

运行环境

2.流处理也可以读取文本或集合等固定数据源,按照流数据形式读取,没有数据后程序会自动终止

3.如果不设置并行度,默认是cpu的核心数

并行度也可以手动设置:全局并行度 env.setParallelism(*),某个算子单独设置.setParallelism(*)

 4.传递参数的工具

val params = ParameterTool.fromArgs(args)
val inputPath = params.get("input")

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值