本文是已官方文档 为基础进行个人解释,有错误地方还望多多包涵:
首先启动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一样)由于数据集可以包含大量的数据,所以使用方便的 方法将数据集的元素作为列表来获取,这种方法应该谨慎使用。
4、combineGroup:在分组数据集上应用GroupCombineFunction。
GroupCombineFunction类似于GroupReduceFunction,但不执行完整的数据交换。
相反,GroupCombineFunction调用一次合并方法,将一组结果组合起来。该操作符
适合于将值组合为中间格式,然后再进行适当的groupReduce,将数据拖跨节点以进
一步减少。通过实现RichGroupReduce函数,还可以为GroupReduce操作符提供一个
组合器。RichGroupReduce函数的组合方法要求输入和输出类型相同。另一方面,
GroupCombineFunction可以有任意的输出类型。
5、count:(和spark用法一样)获取数据集的计数(元素数量)的方便方法。
6、cross:通过形成这个数据集和其他数据集的笛卡尔积,创建一个新的数据集。
默认的交叉结果是一个数据集,其值为两个元组。如果需要对结果进行更多的控制,则可以使用自
定义交叉函数。这可以作为一个lambda或一个自定义的交叉函数。
例如:
val left: DataSet[(String, Int, Int)] = ...
val right: DataSet[(Int, String, Int)] = ...
val product = left.cross(right) { (l, r) => (l._2, r._3) }
}
6.1、crossWithHuge:特殊的交叉操作,明确地告诉系统,左侧被认为比笛卡尔积的右边小很多。
6.2、crossWithTiny:特殊的交叉操作,明确地告诉系统右侧被认为比笛卡尔积 的左边小很多。
7、distinct:使用字段位置键返回一组不同的元组数据集。(取出数据键相同的数据键)
如果输入是复合类型(Tuple或Pojo类型),那么在所有字段上都执行不同的操作,每个字段必须是一个键类型。
字段位置键指定了元组的字段,如果两个元组是不同的,就会做出决定。
注意:只能为Tuple数据集指定字段位置键。
8、filter:(过滤)创建只包含满足给定筛选谓词的元素的新数据集。
9、first:创建包含该数据集的前n个元素的新数据集。
10、flatMap:通过将给定的函数应用到每个元素并使结果趋于平滑,创建一个新的数据集。
11、fullOuterJoin:特殊的fullOuterJoin操作,明确告诉系统使用什么连接策略。如果将null作为连接策略给出,那么优化器将选择策略。
12、getExecutionEnvironment:返回与当前数据集相关联的执行环境。
13、getParallelism:返回该操作的并行性。
14、getType:返回该数据集的元素的类型信息。
15、groupBy:创建一个GroupedDataSet,它提供对元素组的操作。元素根据给定的字段分组。这将不会创建一个新的数据集,它只会附加字段名,在执行分组操作时将用于分组。
16、iterate:使用给定的步骤函数执行批量迭代创建一个新的数据集。在执行最后时,迭代终止。
例如:
val input: DataSet[(String, Int)] = ...
val iterated = input.iterate(5) { previous =>
val next = previous.map { x => (x._1, x._2 + 1) }
next
}
这个示例将简单地增加元组的第二个字段5。
17、iterateDelta:使用给定的步骤函数执行delta(或工作集)迭代创建一个新的数据集。
在开始时,这个数据集是解决方案集,而工作集是工作集。迭代步骤函数得到当前的解决
方案集和工作集,并且必须输出解决方案集的delta和下一个迭代的工作集。
注意:增量迭代的语法很可能很快就会改变。18、iterateWithTermination:使用给定的步骤函数执行批量迭代创建一个新的数据集。
步骤函数返回的第一个数据集是下一个迭代的输入,第二个数据集是终止标准。当终止标
准数据集不包含任何元素,或者在达到最后迭代时,迭代终止。
例如:
val input: DataSet[(String, Int)] = ... val iterated = input.iterateWithTermination(5) { previous => val next = previous.map { x => (x._1, x._2 + 1) } val term = next.filter { _._2 < 3 } (next, term) } 这个示例只会增加元组的第二个字段,直到它们不再小于3。
19、join:特殊连接操作,明确告知系统使用什么连接策略。如果将null作为连接策略给出,那么优化器将选择策略。
19.1 joinWithHuge、
joinWithTiny、
leftOuterJoin、
(自个看算子名称,CSDN的富文本编辑太差劲了)
20、map:(和spark的用法一样)通过将给定的函数应用于该数据集的每个元素,创建一个新的数据集。
21、mapPartition:通过将给定的函数应用于数据集的每个并行分区,创建一个新的数据集。
此函数用于不能转换单个元素且不需要元素分组的操作。为了转换单个元素,最好使用map和flatMap。
22、max:获取数据集中最大值
23、maxBy:选择具有最大值的元素。最大值是根据字典顺序的指定字段计算的。
例1:给定一个带有元素的数据集[0,1],[1,0],结果将是:
maxBy(0)[1, 0] maxBy(1)[0, 1] 例2:给定一个包含元素的数据集[0,0],[0,1],结果将是:
maxBy(0, 1)[0, 1] 如果在指定的字段中存在具有最大值的多个值,则在内部选择一个随机的值,这个操作将作为一个reduce函数实现。
24、min:获取数据集最小值
26、minBy:选择具有最小值的元素。最小值是通过字典顺序的指定字段来计算的。
例1:给定一个带有元素的数据集[0,1],[1,0],结果将是:
minBy(0)[0, 1] minBy(1)[1, 0] 例2:给定一个包含元素的数据集[0,0],[0,1],结果将是: minBy(0, 1)[0, 0] 如果在指定字段中有多个具有最小值的值,则会选择一个随机值。在内部,这个操作被实现为一个还原函数。
27、minResources:返回该操作的最小资源。
28、name:设置数据集的名称。这将出现在执行图的日志和图形表示中。
29、output:使用一个自定义org.apache.flink.api.common.io.OutputFormat发出
这个数据集。
30、partitionByHash:使用指定的键选择器函数对数据集进行分区。重要:该操作将整个数据集在网络上进行了洗牌,并且可以花费大量的时间。
31、partitionByRange:使用指定的键选择器函数来划分数据集。重要的:这个操作需要一个额外的通过数据集来计算范围边界,并在整个网络上打乱整
个数据集。这需要大量的时间。
32、partitionCustom:在选择器返回的键上分区一个数据集、POJO数据集、元组数据集,
使用自定义的分区器。该方法使用密钥选择器来获取关键的分区,以及接受密钥类型的分区。注意:此方法只对单个字段键有效,即选择器不能返回字段的元组。
33、preferredResources:返回该操作的首选资源。
34、print:将数据集中的元素打印到标准输出流系统。在调用print()方法的JVM中。
对于在集群中执行的程序,此方法需要将数据集的内容收集回客户机,以便在那里打印。为每个元素编写的字符串由AnyRef定义。toString方法。该方法会立即触发程序执行,类似于collect()和count()方法。
35、printOnTaskManager:将数据集写入执行该程序的任务管理器的标准输出流
(或更具体地说,数据接收器操作符)。在典型的集群设置中,数据将出现在taskmanager的.out文件中。要将数据打印到控制台或客户机进程的stdout流,请使用print()方法。对于数据集的每个元素,将写入AnyRef.toString()的结果。前缀在输出的每行前面加上前缀的字符串。这有助于识别来自不同打印接收器的输出。返回写数据集的DataSink操作符。
36、printToErr:把错误信息打印出来(表示没用过)
37、rebalance:强制重新平衡数据集,即,数据集均匀分布于以下任务的所有并行实例中。
这可以帮助在严重数据倾斜和计算密集型操作的情况下提高性能。
重要:该操作将整个数据集在网络上进行了洗牌,并且可以花费大量的时间。38、reduce:通过使用关联reduce函数合并该数据集的元素来创建一个新的数据集。
39、reduceGroup:通过将此数据集中的所有元素传递给组reduce函数,创建一个新的
数据集。该函数可以使用收集器输出零个或多个元素。所释放的值的连接将形成结果数据集。
40、registerAggregator:寄存器的org.apache.flink.api.common.aggregators.Aggregator
迭代。聚合器可以用于在迭代过程中维护简单的统计信息,比如处理的元素数量。聚合器计算全局聚合:
在每个迭代步骤之后,全局聚合的值生成一个集合,表示跨所有并行实例的统计数据。
可以在下一次迭代中访问聚合器的值。聚合器可以访问内部函数通过
org.apache.flink.api.common.functions.AbstractRichFunction
# getIterationRuntimeContext。
41、setParallelism:设置此操作的并行性。这个一定大于1。
42、sortPartition:在按指定的顺序对提取的键上的数据集的分区进行局部排序。
通过从KeySelector返回一个tuple,数据集可以通过多个值进行排序。注意,没有附加的排序键可以附加到KeySelector排序键。要使用KeySelector对
多个值进行分区,KeySelector必须返回由值组成的tuple。
43、sum:求和
44、union:创建包含来自该数据集和其他数据集的元素的新数据集。
45、withBroadcastSet:将特定的数据集添加到该操作符的广播集合中。该操作符
的所有并行实例都可以使用广播数据集。广播数据集以一个特定的名字注册,并且
可以在这个名字从运营商运行时上下文检索通过org.apache.flink.api.common.functions.
RuntimeContext.getBroadCastVariable(字符串)中可用的运行时上下文本身是所有通过
org.apache.flink.api.common.functions.AbstractRichFunction#
getRuntimeContext udf()
46、withForwardedFields、withForwardedFieldsFirst、
withForwardedFieldsSecond 、withParameters
以上四个不知道是啥,貌似是转发,找不到相应的解释文档
47、write:写这个数据集使用自定义org.apache.flink.api.common.io.FileOutputFormat到指定位置。
48、writeAsCsv:将此数据集写到指定位置为CSV文件。
这只适用于元组数据集。对于单个tuple字段AnyRef。使用toString。
49、writeAsText:将此数据集写入指定位置为text文件。
Detect languageAfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu | AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu |
来源:CSDN
作者:tomcat先生
链接:https://blog.csdn.net/qq_34841911/article/details/79441421