一.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")