本文是已官方文档 为基础进行个人解释,有错误地方还望多多包涵:
首先启动flink集群模式,再启动./start-scala-shell.sh remote master 8082
启动后,flink会提示你:使用预绑定执行环境来实现批处理或流媒体程序。即:
第一种:
Batch - Use the 'benv' variable(批量使用“benv”变量)
val dataSet = benv.readTextFile("/path/to/data")
dataSet.writeAsText("/path/to/output")
benv.execute("My batch program")
HINT: You can use print() on a DataSet to print the contents to the shell.(提示:您可以在数据集上使用print()来 将内容打印到shell中。)
第二种:
Streaming - Use the 'senv' variable (流式-使用“senv”变量)
val dataStream = senv.fromElements(1, 2, 3, 4)
dataStream.countWindowAll(2).sum(0).print()
senv.execute("My streaming program")
HINT: You can only print a DataStream to the shell in local mode.(提示:您只能在本地模式下打印一个DataStream到shell。)
本文介绍 org.apache.flink.api.scala.DataSet 下的数据集,Flink的基本抽象。这表示一个特定类型的元素集合。这个类中的操作可以用来创建新的数据集和合并两个数据集。ExecutionEnvironment的方法可以用来从外部源创建数据集,比如HDFS中的文件。可以使用write方法将元素写入存储。。
DataSet所有操作都接受lambda函数或特定于操作的函数对象来指定操作。例如,使用lambda:
val input: DataSet[String] = senv.fromElements("I Love You,I Love Chain") val mapped = input flatMap { _.split(" ") }或者使用MapFunction:
val mapped = input flatMap { new FlatMapFunction[String, String] { def flatMap(in: String, out: Collector[String]): Unit = { in.split(" ") foreach { out.collect(_) } } }当需要更多的控制时,可以使用一个丰富的函数,例如访问RuntimeContext。flatMap的富函数是RichFlatMapFunction,所有其他函数的命名都类似。所有的功能都可以在包org.apache.flink.api.common.functions。
元素的分区取决于ExecutionEnvironment的并行性或一个特定的数据集。
算子介绍:
1、aggregate:使用给定的聚合函数聚合指定的字段,创建一个新的数据集。因为这不是一个键控数据集,所以聚合将在所有元素集合上执行。这只对CaseClass数据集起作用。
2、coGroup:对于这个数据集和其他数据集的每个键,创建一个包含两个数据集的元素列表的元组。要指定连接键,必须使用where和isEqualTo方法。
例如:
val left: DataSet[(String, Int, Int)] = ... val right: DataSet[(Int, String, Int)] = ... val coGrouped = left.coGroup(right).where(0).isEqualTo(1) 如果需要对结果进行更多的控制,则可以使用自定义的coGroup函数。 这可以作为一个lambda或一个自定义的CoGroupFunction 例如:
val left: DataSet[(String, Int, Int)] = ... val right: DataSet[(Int, String, Int)] = ... val coGrouped = left.coGroup(right).where(0).isEqualTo(1) { (l, r) => // l和r是Iterator迭代器。 (l.min, r.max) }coGroup函数与一个收集器可用于实现一个过滤器直接coGroup或输出多个值。这种类型的coGroup函数
不返回一个值,而不是使用收集器排放值
例如:
val left: DataSet[(String, Int, Int)] = ... val right: DataSet[(Int, String, Int)] = ... val coGrouped = left.coGroup(right).where(0).isEqualTo(1) { // l和r是Iterator迭代器。
(l, r, out: Collector[(String, Int)]) => out.collect((l.min, r.max)) out.collect(l.max, r.min)) } 3、collect:(和spark的collect一样)由于数据集可以包含大量的数据,所以使用方便的 方法将数据集的元素作为列表来获取,这种方法应该谨慎使用。