Java常用开源库梳理(4)

Apache Flink库


1. StreamExecutionEnvironment, ExecutionConfig

LocalStreamEnvironment, RemoteStreamEnvironment
DataStream, DataStreamSource, DataStreamSink, KeyedStream, WindowedStream
(1)StreamExecutionEnvironment:流程序执行环境,抽象类。提供方法用于控制流作业的执行,并与外部数据访问进行交互。LocalStreamEnvironment实现让作业在当前JVM上执行,RemoteStreamEnvironment实现则让作业在远程的Flink集群上运行。主要方法:
createLocalEnvironment():创建一个本地流执行环境,流程序在本地JVM上以多线程方式运行。可以指定并发度和执行环境的配置信息。
createLocalEnvironmentWithWebUI():创建一个本地执行环境,同时启动web监控UI。
createRemoteEnvironment():创建一个远程执行环境,它把流程序发送到集群来执行。要指定JobManager的主机和端口、要发送的程序Jar文件路径、配置信息、并发度。
getExecutionEnvironment():根据当前上下文创建一个执行环境。
addSource():添加一个数据源,并打开DataStream数据流,例如添加一个kafka数据源FlinkKafkaConsumer08。
createInput():通用方法,根据指定的输入格式InputFormat创建输入数据流。
fromCollection():根据给定的非空集合创建一个数据流DataStream。
fromElements():根据给定元素列表创建DataStream。
fromParallelCollection():创建一个包含迭代器中元素的DataStream。
generateSequence():创建包含一个连续数字系列的DataStream。
readFile():根据文件路径和文件输入格式创建DataStream。
readTextFile():逐行读取文本文件并创建一个字符串DataStream。
socketTextStream():创建一个从socket中接收的无界字符串DataStream。
addOperator():添加一个算子到算子列表中,算子会在execute()触发时执行。
execute():触发流作业程序的运行,根据执行类型在本地执行或提交到集群上执行。返回JobExecutionResult,包含执行时间和累加器结果。
enableCheckpointing():激活流作业的检查点,要指定检查点时间间隔和检查点模式,支持至少一次和恰好一次模式。
getCheckpointConfig()/getCheckpointingMode()/getCheckpointInterval():获取检查点的相关属性和配置。
getParallelism()/setParallelism()/getMaxParallelism()/setMaxParallelism():获取或设置执行环境的并发度、最大并发度。
getDefaultLocalParallelism()/setDefaultLocalParallelism():获取或设置本地执行环境的并发度。
getStateBackend()/setStateBackend():获取状态后端。
getStreamTimeCharacteristic()/setStreamTimeCharacteristic():获取或设置流的时间特性,有EventTime、IngestionTime、ProcessingTime三种类型。
getStreamGraph():获取流拓扑图。
getRestartStrategy()/setRestartStrategy():获取或设置作业发生故障后的重启策略。重启策略定义在RestartStrategies中,有固定延迟重启fixedDelayRestart()是默认方式,按失败率重启failureRateRestart(),回退方式重启fallBackRestart(),不重启而直接失败noRestart()。
(2)ExecutionConfig:执行环境的行为配置信息。例如并行度、失败执行的重试次数、重试之间的延迟时间、ExecutionMode、CodeAnalysisMode、激活或禁用闭包清理器等。
(3)DataStream:无界数据流。一个数据流通过使用转换操作(例如map, filter)可以转换成另一个数据流,可以输出到外部系统。主要方法:
assignTimestampsAndWatermarks():给元素分配时间戳,并定期地创建水印以通知事件时间处理器。
getExecutionEnvironment()/getExecutionConfig():获取当前执行环境、环境的配置信息。
getMinResources()/getPreferredResources():获取当前算子使用的资源信息。
getParallelism():获取当前算子的并行度。
getTransformation():获取创建当前数据流的操作的StreamTransformation表示。

keyBy():分组算子。逻辑上将一个流分成不相交的分区。具有相同key的记录都被分配到相同的分区。内部是通过散列分区实现的,有不同的方法来指定键。返回KeyedStream。按键分组后的流,才能进行聚合、汇总、窗口等操作。
filter():过滤算子。对每个输入元素计算布尔函数,保留函数结果为true的元素。
map():单映射算子。对每个输入元素映射成单个的输出元素,返回SingleOutputStreamOperator。
flatMap():多映射算子。对每个输入元素,映射成零个或多个输出元素,返回SingleOutputStreamOperator。
reduce():聚合算子。适用于分区的数据流。将当前元素与最后一个聚合的值合并,并发出合并的新值。
aggregate():通用的聚合算子。在分组的数据流上进行滚动聚合操作。一些具体的聚合算子有sum(), min(), minBy(), max(), maxBy()。
window():窗口聚合算子。在KeyedStream上,按指定的窗口分配器(例如最近5秒内到达的数据)对每个键中的数据进行分组。返回WindowedStream。
countWindow():计数窗口聚合算子。将keyedStream聚合成无重叠的滚动计数窗口或有重叠的滑动计数窗口。返回WindowedStream。
timeWindow():时间窗口聚合算子。将KeyedStream聚合成滚动时间窗口或滑动时间窗口。返回WindowedStream。
windowAll():窗口全量聚合算子。根据指定的窗口分配器,对未分组的数据流中的所有事件进行分组。返回AllWindowedStream。
countWindowAll():计数窗口全量聚合算子。将DataStream聚合成滚动计数窗口或滑动计数窗口。返回AllWindowedStream。
timeWindowAll():时间窗口全量聚合算子。将DataStream聚合成滚动时间窗口或滑动时间窗口。返回AllWindowedStream。
apply():窗口通用操作算子。将给定的WindowFunction函数应用到当前WindowedStream的每个窗口上。
join():内连接算子。根据给定的键和公共窗口连接两个数据流。连接时使用where()和equalTo()指定连接的条件。
coGroup():分组连接算子。根据给定的键和公共窗口对两个数据流进行组合连接。
connect():连接操作算子。连接两个可能类型不同的数据流,并保留它们的类型,连接允许两个流之间共享状态。返回新的ConnectedStreams。
process():通用处理算子。对输入流使用一个ProcessFunction函数,产生转换后的输出流。
project():投影算子。只能应用于元组数据流,从元组中选择一个字段子集。
union():并集算子。将多个输入流联合成一个输出流,它包含了各个输入流中的所有元素。
transform():通用转换算子。使用用户自定义的转换函数来转换DataStream。
iterate():迭代算子。通过将一个算子的输出重定向到某个之前的算子,在流中创建一个反馈式的循环迭代。迭代部分最后调用IterativeStream.closeWith()来终止迭代。这对定义连续更新模型的算法特别有用。
broadcast():广播算子。将元素广播到下一个算子的每个并行实例。
forward():转发算子。将元素转发到下一个算子的本地子任务上。
global():全局汇集算子。将所有的元素值都分配给下一个算子的第一个实例。注意使用本操作可能会导致性能瓶颈。
partitionCustom():自定义分区算子。对每个元素使用自定义的分区器来选择目标任务实例。
shuffle():混洗算子。根据均匀分布来将元素随机地分配给下一个算子。
rebalance():重新平衡算子。按轮询方式将元素均匀地分配给下一个算子的所有分区实例,这样对每个分区创建相等的负载。在有数据倾斜情况下可用于性能优化。
rescale():重新调整算子。按轮询方式将元素均匀地分配给下一个算子的实例子集。
split():拆分算子。根据输出选择器将一个流拆分成两个或多个流,返回SplitStream。
select():选择算子。从SplitStream中选择一个多个流。

print()/printToErr():在标准输出/标准错误上打印每个元组。
writeAsText():将数据流中的元素以字符串形式写入文本文件。
writeAsCsv():将元素的各字段以逗号分隔符分隔的形式写入文件。行和字段分隔符是可配置的。
writeToSocket():根据序列化模式将元素以字节数组形式写入socket。
writeUsingOutputFormat():使用自定义的输出格式输出流中的元素。
addSink():调用自定义的接收器函数。例如与Kafka连接器绑定。注意上面的这些write*输出方法主要用于调试目的,并没有加入Flink的检查点机制,因此只实现了至少一次的语义。而自定义的连接器可以加入Flink的检查点机制,以实现恰好一次的语义。

2. AssignerWithPeriodicWatermarks, AssignerWithPunctuatedWatermarks

AscendingTimestampExtractor, BoundedOutOfOrdernessTimestampExtractor, IngestionTimeExtractor
(1)AssignerWithPeriodicWatermarks:带有定期水印的时间戳分配器接口。时间戳和水印通常用于事件时间窗口的算子上。方法有getCurrentWatermark()返回当前水印,extractTimestamp()给元素分配一个时间戳。在每个生成定期时间间隔处,系统会调用getCurrentWatermark()来探测下一个水印值,如果探测值非空并且有时间戳大于前一个水印,就生成新的水印值。Flink预定义了几种广泛使用的时间戳分配和水印生成器。AscendingTimestampExtractor用于源任务的时间戳是单调递增的情况。这种情况下当前时间戳总是可以充当水印,因为不会有更早的时间戳到达。BoundedOutOfOrdernessTimestampExtractor有界无序型时间戳分配器,生成的水印落后于在流中出现的最大(事件时间)时间戳一段固定的时间。IngestionTimeExtractor基于机器挂钟时间的时间戳分配器。若用于数据源之后的流操作,则相当于实现了摄取时间的语义。
(2)AssignerWithPunctuatedWatermarks:带有标记水印的时间戳分配器接口。水印的生成基于传入元素的一些属性,例如在流中遇到特殊元素时。主要方法extractTimestamp()给元素分配一个时间戳。checkAndGetNextWatermark()用于实现水印的生成,你需要实现它。

3. State, StateBackend

ValueState, ListState, ReducingState, AggregatingState, MapState
CheckpointedFunction, ListCheckpointed
FsStateBackend, MemoryStateBackend, RocksDBStateBackend
(1)State:状态接口。不同类型的分区都要有自己状态实现。状态只能用在带键的KeyedStream流的操作算子上,因此算子看到的状态值总是映射到了当前元素的键。这样系统可以一致处理流和状态分区。ValueState保留一个可以更新和检索的值,用update()更新,value()检索。ListState保留元素列表,用add()添加,get()检索。ReducingState保留所有元素的聚合值,使用add()添加元素,通过ReduceFunction来聚合。AggregatingState保留所有元素的聚合值,用add()添加元素,用AggregateFunction来聚合。MapState保留key-value映射列表,用put()/putAll()添加,用get()检索,entries()获取所有映射对。所有的状态判刑都有一个方法clear()来清除当前键的状态。
(2)CheckpointedFunction:有状态的转换函数接口。这意味着函数会跨越多个流记录来维持状态,状态恢复通过检查点来实现。方法initializeState()用于初始化状态,当创建函数的并发实例时,或者或者当函数从早期检查点恢复时调用该就读。它通过FunctionInitializationContext传入参数来访问OperatorStateStore和KeyedStateStore状态存储,状态存储中有各种状态数据结构(如ValueState或ListState)来透明地管理Flink的检查点。方法snapshotState()当请求一个检查点快照时被调用。
(3)ListCheckpointed:更加有限的状态检查点接口。只支持在恢复时使用均匀再分配方式的列表状态。转换函数可以实现这个接口来存储列表式的状态。方法snapshotState()返回函数的当前状态列表,restoreState()则从之前的检查点恢复,并处理这样的状态列表。
(4)StateBackend:状态后端存储的接口。定义流程序的状态怎样存储和检查。主要方法createKeyedStateBackend(), createOperatorStateBackend(), createStreamFactory(), createSavepointStreamFactory()。常用实现有MemoryStateBackend将工作状态存储在TaskManager的内存中,将检查点存储在JobManager的内存中。FsStateBackend将工作状态存储在TaskManager的内存中,将状态检查点存储在高可用的分布式文件系统的指定目录下(如HDFS,Ceph,S3等)。RocksDBStateBackend将工作状态存储在RocksDB中,状态检查点默认存储在分布式文件系统中。

4. Function

MapFunction, FlatMapFunction, FilterFunction, ReduceFunction, AggregationFunction
JoinFunction, FlatJoinFunction, CoGroupFunction, CombineFunction, CrossFunction
GroupCombineFunction, GroupReduceFunction, MapPartitionFunction, Partitioner
WindowFunction, AllWindowFunction, ProcessFunction, ProcessWindowFunction, ProcessAllWindowFunction
RichFunction
(1)Function:各种算子函数接口。每种算子操作都对应一个函数接口,如MapFunction, FilterFunction, AggregationFunction等。
(2)RichFunction:在原有的算子函数接口上添加了更丰富的功能。定义了函数生命周期的方法、访问函数执行上下文的方法。每个算子函数都有一个对应的Rich*函数版本,如RichMapFunction, RichFilterFunction, RichAggregationFunction等。主要方法getRuntimeContext()/setRuntimeContext(),getIterationRuntimeContext(),open()/close()。

5. WindowAssigner

TumblingEventTimeWindows, TumblingProcessingTimeWindows
SlidingEventTimeWindows, SlidingProcessingTimeWindows
EventTimeSessionWindows, ProcessingTimeSessionWindows
GlobalWindows
(1)TumblingEventTimeWindows/TumblingProcessingTimeWindows:滚动窗口分配器。给元素分配一个固定大小、不重叠无间隙的时间窗口。前者基于元素的时间戳,后者基于当前正在运行算子的机器系统时间。方法of()返回一个指定大小和对齐偏移量的滚动窗口。其他方法assignWindows()分配窗口集合,getDefaultTrigger()返回窗口触发器,getWindowSerialier()返回窗口序列化器。
(2)SlidingEventTimeWindows/SlidingProcessingTimeWindows:滑动窗口分配器。给元素分配一个固定大小、可能重叠的时间窗口。前者基于元素的时间戳,后者基于当前正在运行算子的机器系统时间。方法of()返回一个指定大小和滑动距离的滑动窗口。其他方法assignWindows(),getDefaultTrigger(),getWindowSerialier(),getSize(),getSlide()。
(3)EventTimeSessionWindows/ProcessingTimeSessionWindows:会话窗口分配器。给元素分配一个无固定大小、不重叠、有会话间隙的时间窗口。前者基于元素的时间戳,后者基于当前正在运行算子的机器系统时间。会话窗口分配器配置有会话间隙,该会话间隙定义了需要的不活动时间有多长。当这段时间到期时,当前会话关闭,随后的元素被分配到一个新的会话窗口。方法withGap()返回一个指定会话间隔大小的会话窗口。其他方法assignWindows(),getDefaultTrigger(),getWindowSerialier()。mergeWindows()用于合并窗口。
(4)GlobalWindows:全局窗口分配器。分配所有有相同key的元素到同一个单一的全局窗口。用于自定义窗口触发器Trigger和元素驱逐器Evictor的情况下。方法create()创建具体的全局窗口。

6. Trigger, Evictor

EventTimeTrigger, ProcessingTimeTrigger
ContinuousEventTimeTrigger, ContinuousProcessingTimeTrigger
CountTrigger, PurgingTrigger, DeltaTrigger
CountEvictor, TimeEvictor, DeltaEvictor
(1)EventTimeTrigger/ProcessingTimeTrigger:基于时间的窗口触发器。触发器确定窗口何时开始由窗口操作算子处理。每个WindowAssigner都有一个默认值Trigger。EventTimeTrigger当水印表示的事件时间通过一个窗口末尾时触发。ProcessingTimeTrigger当当前系统时钟时间通过一个窗口末尾时触发。主要方法create()用于创建该类型的触发器,onElement()在每个元素添加到窗口时调用,返回TriggerResult。onEventTime()当一个注册的事件时间计时器触发时调用,onProcessingTime()当一个注册的处理时间计时器触发时调用,onMerge()当两个窗口合并成一个窗口时调用(例如会话窗口的合并),合并两个触发器的状态。clear()清除触发器的所有状态。
(2)ContinuousEventTimeTrigger/ContinuousProcessingTimeTrigger:在给定的时间间隔内定期触发的触发器,前者基于水印表示的事件时间,后者基于元素的处理时间。方法of()返回给定时间间隔的该类型触发器。
(3)CountTrigger:计数型触发器。当窗口中的元素数量超过给定的上限时触发。方法of()创建给定元素个数上限的计数型触发器。
(4)PurgingTrigger:将另一个触发器转发换为清理触发器。
(5)DeltaTrigger:基于一个增量函数DeltaFunction,和一个阈值threshold的触发器。
(6)Evictor:驱逐器。用于从一个窗口中移除元素,这发生在Trigger触发之后,在窗口算子处理之前或之后。因此有两个方法evictBefore()和evictAfter()用于驱逐元素。CountEvictor保留窗口中指定数量的元素,放弃从窗口缓冲区开始处剩余的元素。TimeEvictor以给定时间间隔size为参数,找到窗口中各元素的最大时间戳max_ts,删除所有时间戳小于max_ts-sie的元素。DeltaEvictor使用一个DeltaFunction和threshold计算窗口缓冲区中最后一个元素与其余各个元素之间的增量,并删除大于或等于阈值的增量。

7. FlinkKafkaConsumerBase, FlinkKafkaProducerBase

FlinkKafkaConsumer08, FlinkKafkaConsumer09, FlinkKafkaConsumer010, FlinkKafkaConsumer011
FlinkKafkaProducer08, FlinkKafkaProducer09, FlinkKafkaProducer010, FlinkKafkaProducer011
(1)FlinkKafkaConsumer08:用作Flink数据源的kafka消费者。从Kafka 0.8.x拉取数据,可以运行在多个并行实例上,每个实例从一个或多个kafka分区拉取数据。它加入了检查点机制,保证在失败时无数据丢失,处理过程提供只好一次的语义。构造函数参数有主题列表、数据反序化器DeserializationSchema/KeyedDeserializationSchema、属性集必需的有bootstrap.servers,zookeeper.connect,group.id。主要方法:
assignTimestampsAndWatermarks():指定一个时间戳和水印分配器,以便在拉取数据时生成时间戳和水印。
createFetcher():创建拉取器,连接到kafka brokers,拉取数据,反序列化并发送到Flink数据流中。
createPartitionDiscoverer():创建分区发现器,用来为当前运行的算子实例发现新的分区。
initializeState():初始化状态信息。在并行实例被创建时调用。
snapshotState():请求生成一个检查点快照。
notifyCheckpointComplete():通知函数,在分布式检查点完成时调用。
open():用指定的配置初始化并打开到kafka的连接。
run():开始运行当前数据源算子。
cancel():取消当前算子。
close():关闭操作,取决用户的具体实现。
setCommitOffsetsOnCheckpoints():设置消费者是否在检查点上提交偏移量到后端kafka。
setStartFromEarliest()/setStartFromLatest():设置从所有分区的最早/最新偏移处的记录开始消费。
setStartFromGroupOffsets():默认行为。设置从zookeeper/kafka broker中发现的消费组偏移处的记录开始消费,如果有分区没有找到偏移,则使用auto.offset.reset的设置。
setStartFromSpecificOffsets():从指定的各个分区偏移处开始消费。
(2)FlinkKafkaConsumer09/FlinkKafkaConsumer010/FlinkKafkaConsumer011:适用相应Kafka版本的Flink数据源。
(3)FlinkKafkaProducer08:用作Flink数据接收器的Kafka生产者,适用于kafka 0.8。该版本的kafka不提供任何可靠性保证,不支持至少一次,也不支持恰好一次的语义。构造参数有主题名称、数据序列化器SerializationSchema/KeyedSerializationSchema、自定义分区器FlinkKafkaPartitioner、生产者的配置属性集。主要方法:
initializeState():初始化状态信息。在并行实例被创建时调用。
snapshotState():请求生成一个检查点快照。
open():打开到kafka的连接。
invoke():当数据到达接收器时调用,把数据写入到kafka主题。
flush():刷新挂起的记录。
close():关闭和清理操作。
setLogFailuresOnly():设置是否只用日志记录失败,而不是捕捉并重新抛出失败(即使记录从未写入kafka主题)。默认为false。对至少一次的语义保证,必须禁用它。
setFlushOnCheckpoint():设置是否等待检查点之前的所有消息被确认成功写入Kafka。默认为false。对至少一次的语义保证,必须启用它。
(4)FlinkKafkaProducer09/FlinkKafkaProducer010:适用于相应Kafka版本的Flink数据接收器。可以提供至少一次的语义保证。这时setLogFailureOnly必须设置为false并且setFlushOnCheckpoint必须设置为true。
(5)FlinkKafkaProducer011:适用于kafka 0.11的Flink数据接收器。默认提供至少一次的语义。通过使用Kafka 0.11的事务特性,可能提供恰好一次的语义。主要方法:
initializeState():初始化状态信息。在并行实例被创建时调用。
snapshotState():请求生成一个检查点快照。
open():打开到kafka的连接。
beginTransaction():开始一个新的事务。
preCommit():准备提交先前创建的事务(两阶段提交中的第一阶段)。
commit():提交一个预先准备好的事务。
invoke():在一个事务中把消息写入到kafka主题。
abort():终止一个事务。
recoverAndAbort():终止一个在事务协调器失败后被拒绝的事务。
recoverAndCommit():从失败中恢复并提交事务。
ignoreFailuresAfterTransactionTimeout():禁用事务超时后的异常传播。
setLogFailuresOnly():设置是否只用日志记录失败,而不是捕捉并重新抛出失败(即使记录从未写入kafka主题)。
setWriteTimestampToKafka():设置在将记录发送到Kafka时是否也写入对应的时间戳。
close():关闭和清理操作。

8. CassandraSink

CassandraRowSink, CassandraPojoSink, CassandraTupleSink
ElasticsearchSink
BucketingSink
(1)CassandraSink:支持Cassandra的Flink数据接收器。它包装了不同的Cassandra数据接受器实现如CassandraRowSink,CassandraPojoSink和CassandraTupleSink,以提供一致的接口。通过addSink()静态方法给DataStream添加数据接收器,将DataStream写入Cassandra数据库。返回CassandraSinkBuilder,它提供了进一步配置接收器的方法。包括setHost()设置数据库连接的host/port,setQuery()设置对每条记录要执行的查询语句。setClusterBuilder()设置配置连接的构建器(例如配置一致性级别、读写重试策略等)。setMapperOptions()设置配置DataStax ObjectMapper的选项,只用于处理POJO数据类型。enableWriteAheadLog()激活预写式事务日志功能,允许对使用幂等更新的非确定性算法执行恰好一次的处理语义。build()构建CassandraSink实例。其他方法有disableChaining(), setParallelism(), setUidHash(), uid(), slotSharingGroup(), name()。
(2)ElasticsearchSink:支持Elasticsearch的Flink数据接收器。它对每个进来的元素,向ES集群发送多个ActionRequest请求,把元素写入ES集群。内部使用一个TransportClient与ES集群通信,使用BulkProcessor来发送批量请求,可以配置发送前要缓存的元素个数。构造函数中指定创建TransportClient的配置信息、ES集群地址列表、对每个元素要执行的ElasticsearchSinkFunction函数。主要方法initializeState(),snapshotState(),open(),invoke(),close(),disableFlushOnCheckpoint(),uildBulkProcessor()。
(3)BucketingSink:支持Hadoop文件系统的分段接收器。它集成了检查点机制以实现恰好一次的语义。唯一的参数是存储桶的文件系统基路径basePath。对接收器的每个并行实例都创建对应的分段输出文件,以接收输出的数据。还可以通过setBucketer()指定自定义分段策略,setWriter()指定写入格式,setBatchSize()指定批量写入的分段文件大小。setInactiveBucketThreshold()设置不活动桶的时间阈值,在该段时间内桶目录没有数据写入时就会被标记为不活动并且关闭。setInactiveBucketCheckInterval()设置不活动桶定期检查的时间间隔。
(4)其他的Flink连接器实现:有RabbitMQ,AWS Kinesis的。通过Apache Bahir扩展项目,还有Redis,Netty,Akka,ActiveMQ,Flume的连接器。

9. ExecutionEnvironment

LocalEnvironment, RemoteEnvironment
DataSet, DataSource, DataSink
(1)ExecutionEnvironment:针对有界批数据集的执行环境,操作的是DataSet。LocalEnvironment和RemoteEnvironment是具体实现类。方法与StreamExecutionEnvironment类似。
(2)DataSet:有界数据集,适用于批处理的场景。一个数据集通过使用转换操作(例如map, filter)可以转换成另一个数据集,可以输出到外部系统。主要方法:
getExecutionEnvironment():获取当前执行环境。
groupBy():分组算子。按指定字段对数据集进行分组。
map():单映射算子。取一个元素并映射成一个新元素。
flatMap():多映射算子。取一个元素并映射成零个或多个元素。
mapPartition():分区映射算子。对数据集的整个分区使用单个映射转换操作。这个操作通过迭代器一次获取整个分区元素,产生任意数量的结果值。
filter():过滤算子。为每个元素计算布尔函数并保留结果为true的元素。
reduce():聚合算子。通过将两个元素不断地组合并为一个元素,将一组元素合并为一个元素,合并后的元素类型不变。适用于完整的数据集或分组数据集。
reduceGroup():分组聚合算子。将一组元素合并成一个或多个元素。可应用于完整数据集或分组数据集。
aggregate()/sum():通用聚合算子。将一组元素聚合为一个值。应用于完整数据集或分组数据集。一些具体的聚合算子实现有min(), minBy(), max(), maxBy()。
distinct():去重算子。删除数据集中的重复元素。涉及元素的所有字段或字段的子集。
iterate()/iterateDelta():迭代算子。通过将一个算子的输出重定向到某个之前的算子,在数据集中创建一个反馈式的循环迭代。迭代部分最后调用IterativeDataSet.closeWith()来终止迭代。
collect():返回数据集所有元素构成的列表。
runOperation():通用处理算子。对每个元素运行指定的操作。
count():计数算子。返回数据集中元素总个数。
first(n):返回前n个元素。可以应用于常规数据集,分组数据集或分组排序数据集。
project():投影算子。只能应用于元组数据集,从元组中选择一个字段子集。
join()/joinWithHuge()/joinWithTiny():内连接算子。通过创建键相等的所有元素对来连接两个数据集。可选择使用JoinFunction将一对元素转换为单个元素,或使用FlatJoinFunction将该对元素转换为任意多个元素。连接时使用where()和equalTo()指定连接的条件。joinWithHuge()适用于第二个数据集远大于第一个数据集时,做了优化。对joinWithTiny()则相反。
leftOuterJoin()/rightOuterJoin()/fullOuterJoin():外连接算子。
coGroup():分组连接算子。reduce操作的二维变体。在一个或多个字段上对每个输入进行分组,然后连接各个分组。
combineGroup():联合分组算子。对数据集应用一个GroupCombineFunction。
cross()/crossWithHuge()/crossWithTiny():笛卡尔积算子。构建两个输入集的笛卡尔积(交叉积),创建所有元素对。可以选择使用CrossFunction将一对元素转换为单个元素。注意cross可能是一项非常计算密集型的操作,建议使用crossWithTiny()和crossWithHuge()向系统提示DataSet的大小。
union():并集算子。产生两个数据集的并集。
rebalance():重新平衡算子。均匀地重新平衡数据集的并行分区以消除数据倾斜。只有类似map的转换可以跟在rebalance转换之后。
partitionByHash():哈希分区算子。在给定键上对数据集进行散列分区。键可以指定为位置键、表达式键和键选择器功能。
partitionByRange():范围分区算子。在给定键上对数据集进行范围分区。键可以指定为位置键、表达式键和键选择器功能。
partitionCustom():自定义分区算子。手动指定分区策略Partitioner。注意方法仅适用于单个字段键。
sortPartition():排序分区算子。按指定的顺序和指定的字段在对数据集的所有分区进行本地排序。字段可以指定为元组位置或字段表达式。通过sortPartition()调用链可以对多个字段排序。

print()/printToErr()/printOnTaskManager():打印操作算子。在TaskManager的标准输出、标准错误上打印数据集。
write()/writeAsCsv()/writeAsText()/writeAsFormattedText():文件输出操作算子。将数据集输出到相应格式的文件。
output():使用的自定义的输出格式输出数据集。

10. DataSetUtils, ParameterTool

(1)DataSetUtils:数据集操作的一些静态工具方法,如为数据元素分配唯一标识符或者连续的索引。主要方法:
countElementsPerPartition():遍历所有分区并统计每个分区元素个数。返回新的DataSet。
partitionByRange():按指定的元素位置字段对DataSet进行范围分区。
sample():按指定概率对数据集的每个元素采样,产生一个采样的数据集。
sampleWithSize():产生一个含有固定元素个数的数据集采样。注意它并没有概率采样有效,除非需要精确的元素个数,否则尽量使用概率采样。
summarize():产生数据集的一个概要。对元组型数据集每列进行single-pass统计,产生每列的概要。
zipWithIndex():为输入数据集的每个元素分配一个唯一的long型索引值,产生的索引值是连续。返回包含索引值和元素值的元组数据集。
zipWithUniqueId():为输入数据集的每个元素分配一个long型的唯一标识,生产和标识值可能是不连续的。返回包含索引值和元素值的元组数据集。
(2)ParameterTool:读取和解析程序的参数列表的工具。参数列表可以从不同数据源获取。包括fromArgs(),fromMap(),fromProperitesFile(),fromSystemProperties(),toMap(),获取各个类型值的getXXX()函数。

11. InputFormat, OutputFormat

FileInputFormat, BinaryInputFormat, CollectionInputFormat, AvroInputFormat, CassandraOutputFormat, CsvInputFormat, HadoopInputFormat
HBaseRowInputFormat, HCatInputFormat, JDBCInputFormat, OrcRowInputFormat, PojoCsvInputFormat, PrimitiveInputFormat
RowCsvInputFormat, TableInputFormat, TextInputFormat, TupleCsvIputFormat
FileOutputFormat, BinaryOutputFormat, CassandraOutputFormat, CsvOutputFormat, HadoopOutputFormat
JDBCOutputFormat, LocalCollectionOutputFormat, PrintingOutputFormat, TextOutputFormat
(1)InputFormat:数据源通用接口。用于从不同的数据源产生Flink数据流或数据集。Flink有大量内置的输入源实现,如FileInputFormat, JDBCInputFormat, HadoopInputFormat。主要方法configure(), createInputSplits(), open(), nextRecord(), reachedEnd(), close(), getStatistics(), getInputSplitAssigner()。
(2)OutputFormat:数据接收器通用接口。用于输出Flink数据到目标系统。Flink有大量内置的输入源实现,如FileInputFormat, JDBCInputFormat, HadoopInputFormat。主要方法configure(), open(), writeRecord(), close()。

12. TableEnvironment, Table

StreamTableEnvironment, BatchTableEnvironment
Tumble, Slide, Session, Over
TableSource, Kafka011AvroTableSource, Kafka011JsonTableSource, CsvTableSource, OrcTableSource
TableSink, Kafka010JsonTableSink, CassandraAppendTableSink, CsvTableSink, JDBCAppendTableSink
TableFunction, ScalarFunction, AggregateFunction
(1)TableEnvironment:表环境操作的工具类。方法getTableEnvironment()用于从StreamExecutionEnvironment获取一个数据流的表执行环境StreamTableEnvironment,或者从ExecutionEnvironment获取一个批处理的表执行环境BatchTableEnvironment。表执行环境注册表数据源,执行和种表API和SQL语句。
(2)StreamTableEnvironment/BatchTableEnvironment:流式表执行环境和批处理表执行环境。代表一个表API或SQL语句的执行环境,它可以很好地与DataStream和DateSet的操作集成。注意一个Table总是绑定到一个特定的TableEnvironment,不可能在同一个查询中组合不同TableEnvironments的表。主要方法:
registerTable():注册一个Table。
registerTableSource():注册一个表数据源,例如CsvTableSoruce。
registerTableSink():注册一个表数据接收器,例如CsvTableSink。注册时还需要指定字段名称和类型列表。
registerExternalCatalog():注册一个外部目录,例如InMemoryExternalCatalog。外部目录提供外部数据库和表的信息,例如其名称,模式,统计信息,如何访问其数据等。以通过实现ExternalCatalog接口来创建外部目录,并注册到表执行环境中。
registerDataStream()/registerDataSet():将DataStream/DataSet注册为一个Table。
fromeDataStream()/fromDataSet():将DataStream/DataSet转换成Table。
toTable():将DataStream/DataSet转换成Table。
toAppendStream()/toRetractStream()/toDataSet():将Table转换成DataStream/DataSet,Append追加模式,Extract是回退模式。
registerFunction():注册一个操作函数,例如自定义的TableFunction。
explain():解释Table的查询计划。返回一个描述三个计划的字符串,关系查询的抽象语法树即未优化的逻辑查询计划、优化的逻辑查询计划和物理执行计划。
scan():扫描注册的表格,类似于SQL FROM子句,返回代表该表的Table对象,然后可以执行各种表API算子操作。
sqlQuery():执行SQL查询语句,返回查询的Table结果。
sqlUpdate():执行SQL增删改语句,返回Table结果。
(3)Table:表示一个表格,类似于数据库中的视图View。主要方法:
select():执行选择操作,类似SQL SELECT语句。
as():重命名字段,类似SQL AS子句。
where()/filter():过滤掉不符合滤器谓词的行。类似于SQL WHERE子句。
groupBy():在分组键上对行进行分组,后面一般跟一个聚合操作如select,以便按组聚合行。
window():定义聚合用的分组窗口,可能还有一个或多个分组键。可以在窗口上对表格进行聚合。
distinct():返回具有不同值组合的记录。类似于SQL DISTINCT子句。
join():内连接两个表格。类似于SQL JOIN子句。
leftOuterJoin()/rightOuterJoin()/fullOuterJoin():外连接两个表格。类似于SQL LEFT/RIGHT/FULL OUTER JOIN子句。
TableFunction:使用表函数的结果连接表格。左(外)表的每一行都与表函数生成的所有行连接在一起。如果其表函数返回空结果,则会删除左(外)表的一行。
union():并集操作。联合两张表格并删除重复记录。类似于SQL UNION子句。
unionAll():并集操作。联合两张表格,可能有重复记录。类似于SQL UNION ALL子句。
Intersect():交集操作。类似于SQL INTERSECT子句。相交返回两个表中存在的记录,如果一条记录多闪出现在表中,它只返回一次,即结果表没有重复记录。
intersectAll():交集操作。类似于SQL INTERSECT ALL子句。如果一个记录不多闪出现在这两个表中,它将返回与出现在两个表中相同的次数,即结果表可能有重复的记录。
minus():减法操作。类似于SQL EXCEPT子句。从左表中返回右表中不存在的记录,左表中的重复记录只返回一次,即删除重复项。
minusAll():减法操作。类似于SQL EXCEPT ALL子句。在左表格中出现n次,在右表格出现m次的记录被返回(n-m)次,也就是说,删除右表格中存在的重复数量。
in():类似于SQL IN子句。如果表达式存在于给定的表子查询中,则返回true。
orderBy():返回所有并行分区的全局排序记录。类似于SQL ORDER BY子句。
offset()/fetch():类似于SQL OFFSET和FETCH子句。偏移和提取限制从排序结果返回的记录数。偏移和提取在技术上是Order By操作符的一部分,因此必须在它之后。
insertInto():将表格数据插入到已注册的输出表。类似于INSERT INTO子句。输出表必须在TableEnvironment中注册。
writeToSink():将表格数据发送到指定接收器,例如CsvTableSink。
(4)Tumble/Slide/Session/Over:在窗口聚合操作时用来定义不同的窗口策略,有Tumble滚动窗口,Slide滑动窗口,Session会话窗口,Over计数窗口(可以是无界或有界的,类似于SQL OVER子句)。
(5)TableSource:表数据源接口,具体接口主要有StreamTableSource,BatchTableSource,ProjectableTableSource,NestedFieldsProjectableTableSource,FilterableTableSource。窗口接口需要指定时间属性,可以用DefinedProctimeAttribute,DefinedRowtimeAttribute接口。Flink有各种实现好的数据源,如Kafka011AvroTableSource, Kafka011JsonTableSource, CsvTableSource, OrcTableSource。
(6)TableSink:表数据接收器接口,具体接口有AppendStreamTableSink,RetractStreamTableSink,UpsertStreamTableSink和BatchTableSink。Flink有各种实现好的数据接收器,如Kafka010JsonTableSink, CassandraAppendTableSink, CsvTableSink, JDBCAppendTableSink。
(7)TableFunction/ScalarFunction/AggregateFunction:用来定义自己的表操作函数。

13. CEP, Pattern

PatternStream
PatternSelectFunction, PatternFlatSelectFunction, PatternTimeoutFunction, PatternFlatTimeoutFunction
IterativeCondition, SimpleCondition
AfterMatchSkipStrategy
(1)CEP:用于复杂事件处理的工具类。pattern()方法通过在输入流上应用一个模式序列Pattern,以检测潜在的匹配,然后转换成另一个PatternStream。
(2)PatternStram:用于CEP模式检测的数据流。模式数据流会发送检测到的事件模式序列,通常模式使用NFA来检测。主要方法select()和flatSelect(),从检测到的事件序列中进行选择。为了处理检测到的序列,用户需要指定一个PatternSelectFunction或PatternFlatSelectFunction。也可以处理已经超时的部分匹配到的事件模式序列,用户需要指定一个PatternTimeoutFunction或PatternFlatTimeoutFunction。
(3)Pattern:模式定义类。模式定义被NFACompiler用来创建NFA。模式API定义了要从输入流中搜索的复杂模式序列。主要方法:
begin():开始一个模式序列。
followedBy()/followedByAny():后面跟着一个指定的模式。followedBy是宽松的连续性。followedByAny是非确定性的宽松连续性。
notFollowedBy():否定模式,表示后面不跟着一个模式。宽松的连续性。
next():后面接着下一个模式。严格的连续性。
notNext():否定模式,表示后面不跟着下一个模式。严格的连续性。
oneOrMore():循环模式,指定模式循环匹配一次或多次。
optional():指定当前模式是可选的,即它可能根本不会发生。
greedy():指定当前模式是贪婪的。即它会尽可能地重复。
times():循环模式。模式将匹配指定的次数。
timesOrMore():循环模式。模式至少匹配指定的次数。
consecutive():严格的连续模式。任何不匹配的元素都会中断当前的模式。
allowCombinations():非确定性的宽松连接性。允许其他的模式忽略一些匹配事件。
subtype():指定一个子类型约束。将接受的事件类型限制哦该子类型。
or():添加一个过滤条件IterativeCondition,匹配条件为true的事件。和已有的条件构成或的关系。
where():添加一个过滤条件IterativeCondition,匹配条件为true的事件。和已有的条件构成且的关系。
until():应用一个停止条件。针对循环模式根据指定的停止条件停止循环匹配。
within():指定模式的最大时间窗口约束。这个时间间隔是第一个事件和最近一个事件之间的最大时间间隔。
getName()/getPrevious()/getQuantifier()/getTimes()/getUntilCondition()/getWindowTime()/getAfterMatchSkipStrategy():获取模式定义的相关属性。
(3)PatternSelectFunction/PatternTimeoutFunction:在Pattern用select()做模式选择时,要指定的对事件的选择函数。还有对应的Flat版本函数,返回多个结果。
(4)IterativeCondition/SimpleCondition:模式的过滤约束条件。抽象基类。唯一的方法filter()。用于实现自定义的过滤条件。
(5)AfterMatchSkipStrategy:匹配后的跳过策略。有noSkip()每一个可能的匹配都会发送出去,skipPastLastEvent()放弃包含匹配事件的每个部分匹配,skipToFirst()放弃每个包含了第一个PatternName之前事件的部分匹配,skipToLast()放弃每个包含了最后一个PatternName之前事件的部分匹配。

14. LabeledVector, MLUtils

SVM, MultipleLinearRegression, GradientDescent, KNN
StandardScaler, MinMaxScaler, PolynomialFeatures
DistanceMetric, Splitter
ALS, StochasticOutlierSelection
(1)LabeledVector:对于监督学习问题,FlinkML通常使用LabeledVector类来表示(标记,特征)样例数据。LabeledVector对象有表示样例特征的Vector成员,以及表示标记的Double成员,该标记可能是分类问题中的类,也可以是回归问题的因变量。一般要将输入数据集转换成DataSet[LabeledVector],然后才可以用各种算法进行训练学习。
(2)MLUtils:机器演习工具类。例如readLibSVM()方法用于读取LibSVM格式的机器演习数据集。
(3)SVM:支持向量机学习器。用于线性分类,使用具有转折点损失函数的CoCoA算法来实现。损失函数最小值通过SDCA算法求得,为了让算法在分布式环境下更加高效,COCOA算法首先在本地的一个数据块上计算若干次SDCA迭代,然后再将本地更新合并到有效全局状态中。全局状态被重新分配到下一轮本地SDCA迭代的数据分区,然后执行。SVM是一个预测模型,因此它支持拟合fit()与预测predict()两种操作。用作预测时,会对Vector的所有子类预测其对应的分类标签。传入测试数据集DataSet[LabeledVector],得到每个数据的回归值后返回DataSet[(Double,Double)]。元组的第一个元素是输入的DataSet[LabeledVector]中的正确值,第二个元素是对应的预测值。参数和方法包括:
Blocks:输入数据被切分的块数量。
Iterations:外层方法的最大迭代次数。
LocalIterations:定义SDCA最大迭代次数。
Regularization:正则化常数。
Stepsize:初始步长。
ThresholdValue:分类的边界值。若决策函数返回值超过了它,则标记为正类(+1.0)。若低于它,标记为负类(-1.0)。
OutputDecisionFunction:决定SVM的预测和评估方法是返回与分离超平面的距离还是二分类的标签值。
Seed:随机数生成器种子。
fit():对输入数据集进行拟合训练。
predict():对输入数据集进行预测训练,返回DataSet[(Double,Double)]。
(4)MultipleLinearRegression:多元线性回归学习器。目标是找到一个最佳拟合输入数据的线性函数。对大数据集一般通过随机梯度下降(SGD)来得到一个近似解。多元线性回归是一个预测模型。因此它支持拟合操作fit()和预测操作predict()。用作预测时,传入DataSet[LabeledVector],得到每个数据的回归值后返回DataSet[(Double,Double)]。元组的第一个元素是输入的DataSet[LabeledVector]中的正确值,第二个元素是对应的预测值。参数和方法包括:
Iterations:最大迭代次数。
Stepsize:梯度下降的初始步长。
ConvergenceThreshold:收敛阈值。
LearningRateMethod:学习率方法,用于计算每次迭代的有效学习率。
fit():对输入数据集进行拟合训练。找到合适的权重。
predict():对测试数据集进行预测训练,返回DataSet[(Double,Double)]。
(5)GradientDescent:随机梯度下降优化器。用于在监督式学习中对拟合过程损失函数不断优化。参数和方法包括:
setLossFunction():指定损失函数。常见的有回归任务常用的平方损失函数SquareLoss,分类任务中常用的逻辑损失函数LogisticLoss和转折点损失函数HingeLoss。线性回归和线性分类中常用的线性预测函数LinearPrediction。
setRegularizationPenalty():正则化惩罚函数。默认为NoRegularization,常用的有L1Regularization和L2Regularization。也可以通过RegularizationPenalty接口实现自定义的正则化惩罚函数。
setRegularizationConstant():正则化常数。默认为0.1。
setIterations():最大迭代次数,默认为10。
setLearningRate():学习率。这个值控制了梯度下降法要沿着梯度的反方向移多远,默认值为0.1。
setLearningRateMethod():学习率方法。在LearningRateMethod中定义,常用的有Default,Constant,Bottou,InvScaling,Xu方法。
setConvergenceThreshold():收敛阈值,目标函数相对变化量小于此阀值时迭代停止。
setDecay():衰退值,默认为0.0。
optimize():使用随机梯度下降优化对指定的数据集做优化,找到给定数据的最优权重。返回DataSet[WeightVector]。
(6)KNN:K最近邻算法学习器。最简单的分类算法,属于非监督式学习。即每个样本都可以用它最接近的k个邻居来代表。它支持fit和predict操作。用作预测时输入DataSet[LabeledVector],返回DataSet[(T, Array[Vector])],这里(T, Array[Vector])元组对应(test point, K-nearest training points)。参数和方法包括:
K:要搜索的最近邻居数量。
DistanceMetric:用来计算两点之间距离的度量标准。默认值是EuclideanDistanceMetric
Blocks:设置输入数据将会被切分的块数。该数目至少应该被设置成与并行度相等。
UseQuadTree:指定是否使用能够对训练集进行分区,并且有可能简化平滑KNN搜索的四叉树。
SizeHint:指定训练集或测试集是否小到能优化KNN搜索所需的向量乘操作。
fit():对输入数据集进行拟合训练。
predict():对测试数据集进行预测训练,返回DataSet[(T, Array[Vector])]。
(7)StandardScaler:标准化缩放器。用来做数据预处理。根据用户指定的均值与标准差值对给定数据集进行标准化缩放。如果没有指定均值与标准差,标准化缩放器将会根据均值为0、标准差为1对输入数据集进行缩放。它是一个转换器,因此它支持拟合fit()与转换transform()两种操作。可以将Vector或LabeledVector的子类型数据集转换到对应的相同类型的数据集。主要参数和方法:
Mean:被缩放数据集的均值,默认值为0.0。
Std:被缩放数据集的标准差,默认值为1.0。
fit():计算被缩放数据的均值与标准差。
transform():根据前面指定的均值和标准差对数据集进行缩放,返回缩放后的数据集。
(8)MinMaxScaler:区间缩放器。将输入数据集缩放到指定的区间[min,max]内。如果没有指定区间,则缩放到[0,1]区间内。它也支持拟合fit与转换transform两种操作。
(9)PolynomialFeatures:多项式特征转换器。能把一个向量映射到一个自由度为d的多项式特征空间。输入特征的维度决定了多项式因子的个数,多项式因子的值就是每个向量的项。它支持拟合fit与转换transform两种操作。它并不对数据进行训练,因此它支持所有类型的输入数据。方法setDegree()设置最大多项式自由度。
(10)DistanceMetric:距离度量抽象类。Flink支持的距离度量有EuclideanDistanceMetric,SquaredEuclideanDistanceMetric,CosineSimilarityMetric,ChebyshevDistanceMetric,ManhattanDistanceMetric,MinkowskiDistanceMetric,TanimotoDistanceMetric。
(11)Splitter:数据分割器,用于交叉验证。主要的分割策略有:
trainTestSplit():一般分割法。它会随机地以fraction为概率在数据集中抽取子集。返回TrainTestDataSet对象,其中成员.training中是训练数据集,.testing中是测试数据集。
trainTestHoldoutSplit():holdout分割法会创建一个额外的holdout数据集,在使用训练集与测试集完成训练之后,会使用holdout集做一次额外的最终验证。
kFoldSplit():k-fold分割策略。数据集会被等分成k个子集。每个子集都会被设为一次.training(训练)数据集,同时在该次训练中其它的子集会被设为.testing(测试集)。
randomSplit():一元随机分割法。传入一个fraction值,根据该概率随机分割数据集,返回分割后的数据集。
multiRandomSplit():多元随机分割法。需要传入任意长度的fraction数组。它能创建多个holdout集,返回一个数据集的数组。
(12)ALS。交替最小二乘法,用来对矩阵进行因式分解。它将一个给定的R矩阵因式分解为U和V两个因子。矩阵因式分解可以用在推荐系统的场景,U和V矩阵可以分别称为用户和商品矩阵。ALS是一个预测模型,支持fit和predict操作。主要参数和方法:
NumFactors:底层模型中使用的潜在因子数目。等价于计算用户和商品向量的维度。
Lambda:因式分解的正则化因子。该值用于避免过拟合或者由于强生成导致的低性能。
Iterations:最大迭代次数。
Blocks:设定用户和商品矩阵被分组后的块数量。
Seed:算法生成初始矩阵的随机种子。
TemporaryPath:导致结果被立即存储到临时目录的路径。
fit():计算因式分解。这会在稀疏的评分矩阵上进行训练。输入评分矩阵数据DataSet[(Int, Int, Double)],然后计算因式分解。
predict():对测试数据集进行评分预测。输入行列索引值表示的矩阵数据DataSet[(Int, Int)],输出评分预测DataSet[(Int, Int, Double)]。
(13)StochasticOutlierSelection:随机离群点选择。一种无监督的离群值选择算法,将一组向量型数据点作为输入。离群值是一个或多个观测数据与大多数数据集的定量偏差。该算法使用基于亲和力的离群值选择来为每个数据点输出离群概率。当一个数据点的离群点概率与其他数据点相差较大时,就认为是离群的点。可用于日志分析,欺诈检测,噪声消除,新颖性检测,质量控制,传感器监控等。主要参数和方法:
Perplexity:困惑度。
ErrorTolerance:错误容忍度。用于在计算亲和度时减少计算时间。它会牺牲准确性,从而缩短计算时间。
MaxIterations:计算亲和度的最大迭代次数。
transform():对输入的一组数据点进行随机离群计算,返回的向量中表示每个数据点的离群概率。

15. Graph

Vertex, Edge
(1)Vertex/Edge:Vertex是图的顶点,由一个唯一ID和一个value定义。Edge是图的边,则一个源ID(即源Vertex的ID),一个目的ID(即目的Vertex的ID),一个可选的value定义。
(2)Graph:则顶点集DataSet和边集DataSet组成的图。主要方法:
fromCollection():从一个边集合、一个可选的顶点集合创建一个图。
fromCsvReader():从边数据csv文件、以及可选的顶点数据csv文件创建图。
fromDataSet():从一个边数据集、一个可选的顶点数据集创建图。
fromTuple2DataSet():根据一个由表示边的Tuple2类组成的DataSet创建图。
fromTupleDataSet():根据一个由Tuple3组成的表示边的DataSet创建图。
getVertices()/getEdges():获取由端点构成的DataSet,边的DataSet。
getVertexIds()/getEdgeIds():获取由端点的ID构成的DataSet,由边ID构成的source-target pair组成的DataSet。
numberOfVertices()/numberOfEdges():获取端点的数量,边的数量。
inDegrees()/outDegrees():获取端点的<端点ID,入度> pair组成的DataSet,或者点的<端点ID,出度> pair组成的DataSet。
getDregrees():取端点的<端点ID,度> pair组成的DataSet,这里的度=入度+出度。
getTriplets():获取由三元组构成的DataSet。
mapVertices()/mapEdges():用来对端点的值和边的值进行map变换。它们返回一个新的Graph,它的端点(或者边)的ID保持不变,但是值变成了用户自定义的MapFunction所提供的对应值。MapFunction也允许改变端点或者边的值的类型。
translateGraphIds()/translateVertexValues()/translateEdgeValues():用自定义的TranslateFunction修改端点和边的ID类型和值,端点的值,或者边的值。
filterOnVertices()/filterOnEdges()/subgraph():用自定义的FilterFunction过滤图中的端点或边,返回一个sub-graph。
joinWithVertices()/joinWithEdges():将输入的顶点DataSet或边DataSet与图中的顶点或边做join连接操作,并用一个自定义的JoinFunction改变匹配记录的值。
joinWithEdgesOnSource()/joinWithEdgesOnTarget():前者的join操作发生在边的源端点和输入的第一个field上。后者的join操作发生在边的目的端点和输入的第一个field上。
reverse():反转所有边的方向,返回一个新图。
getUndirected():给图中的所有边添加一个反方向的边,从而变成无向图。注意Flink中的图默认都是有向图。
union():并集操作。合并两个图,删除重复的顶点,但保留重复的边。
difference():差集操作。在指定图和当前图的端点和边的集合上取差集。
intersect():交集操作。在指定图和当前图的端点和边的集合上取交集。
addVertex()/addVertices()/addEdge()/addEdges():添加顶点或边的操作。
removeVertex()/removeVertexs()/removeEdge()/removeEdges():删除顶点或边的操作。
reduceOnEdges()/reduceOnNeighbors():邻域聚合操作。reduceOnEdges对一个端点的相邻边的值进行聚合,reduceOnNeighbors对一个端点的相邻点的值进行聚合。返回端点和聚合值的DataSet。聚合具有结合性和交换性,利用了内部的组合,因此极大提升了性能。邻域的范围由EdgeDirection参数指定,可选值有IN,OUT,ALL。IN聚合一个端点所有的入边,OUT聚合一个端点所有的出边,ALL聚合一个端点所有的边。
groupReduceOnEdges()/groupReduceOnNeighbors():按端点分组,并对端点的相邻边或相邻点的值做分组聚合。对每个端点返回0个或多个值,而且提供对所有邻居的访问。
validate():用自定义的GraphValidator验证图是否是合法的图。Flink内置的InvalidVertexIdsValidator验证所有边的ID在端点的ID集合中也存在。
(3)Graph.runVertexCentricIteration():在图上运行一个Vertex-Centric迭代计算,输出顶点值更新后的新图。它是整体同步并行计算的一种。该计算在迭代的每个超步中同步地处理,每个顶点执行一个ComputeFunction。顶点之间通过消息进行通讯,任何一个顶点可以给图中任何其他的顶点发送消息,只要知道它的ID即可。当没有顶点的值发生更新或者达到了最大的超步迭代次数,算法将会收敛。参数有自定义ComputeFunction,消息合并器MessageCombiner,最大迭代次数,以及迭代计算的配置如名称、并行度、堆内Solution-Set、聚合器、广播变量。
(4)Graph.runScatterGatherIteration():在图上运行一个Scatter-Gather迭代计算,输出顶点值更新后的新图。该计算在迭代的每个超步中同步地处理,每个顶点为其他顶点产生消息,并基于它接受到的消息更新自己的值。用户只需要定义每次超步中每个顶点的行为ScatterFunction和GatherFunction即可。还要指定最大迭代次数。当没有顶点的值发生更新或者达到了最大迭代次数,算法将收敛。
(5)Graph.runGatherSumApplyIteration():在图上运行一个Gather-Sum-Apply迭代计算,输出顶点值更新后的新图。该计算也在迭代超步中同步执行。每个超步包含GatherFunction函数一个在边和对应顶点邻居上并行调用的UDF,产生一个局部值。SumFunction函数是用户定义的聚合函数,将Gather产生的局部值合并为一个单一值。ApplyFunction函数通过该函数将Sum产生的聚合值更新到每个顶点的当前值。还要指定最大迭代次数。当没有顶点的值发生更新或者达到了最大迭代次数,算法将收敛。
(6)Graph.run():在图上运行一个指定的图算法。图算法通过GraphAlgorithm或GraphAnalytic接口定义。Flink提供了大量的图算法,例如单源最短路径、社区探测、标签传播等。

16. GraphAlgorithm

CommunityDetection, LabelPropagation, ConnectedComponents, GSAConnectedComponents
SingleSourceShortestPaths, GSASingleSourceShortestPaths
TriangleEnumerator, Summarization, TriangleListing
HITS, PageRank, AdamicAdar, JaccardIndex
VertexInDegree, VertexOutDegree, VertexDegrees, VertexDegree
EdgeSourceDegrees, EdgeTargetDegrees, EdgeDegreesPair
EdgeSourceDegree, EdgeTargetDegree, EdgeDegreePair, MaximumDegree, Simplify
TranslateGraphIds, TranslateVertexValues, TranslateEdgeValues
(1)CommunityDetection:社区探测算法。社区指的是一组对内紧密连接,但对外与其它组连接稀疏的节点。该算法接收一个任何顶点类型的Graph,Long类型顶点值和Double类型的边值作为输入,返回一个和输入同类型的Graph,其中顶点值与社区标签(community labels)对应,也就是说如果两个顶点有相同的顶点值,则这两个顶点属于同一个社区。
(2)标签传播。标签传播算法。该算法对一个图通过迭代地在邻居间传播标签来发现该图中的社区。与社区探测不同,该算法的实现并不使用与顶点相关的分数。该算法接收一个Comparable顶点类型的Graph,一个Comparable顶点值类型和一个任意边值类型。 它返回一个顶点组成的DataSet,其中顶点值与该算法收敛后该点所属的社区对应。
(3)ConnectedComponents/GSAConnectedComponents:这是一个弱连接组件算法的实现。当该算法收敛时,如果两个点间是相连的,不管是从哪个点连向哪个点,这两点都属于同一个组件。前者使用Scatter-Gatter迭代实现,后者使用Gather-Sum-Apply迭代实现。该算法的结果是一个顶点组成的DataSet,其中顶点值与分配给该顶点的组件相对应。
(4)SingleSourceShortestPaths/GSASingleSourceShortestPaths:单源最短路径算法。该实现是为了计算加权图。给定一个源点,该算法计算图中从该源点到所有其它点的最短路径。前者使用Scatter-Gatter迭代实现,后者使用Gather-Sum-Apply迭代实现。该接收一个任何顶点类型的Graph和Double类型的边值。顶点值可以是任何类型,且不会被该算法使用。顶点类型必须实现equals()。 输出是一个顶点组成的DataSet,其中顶点值对应从给定源点到该点的最小距离。
(5)TriangleEnumerator:三角枚举算法。用于枚举出现在输入图中的唯一三角。一个三角由连接相互三个点的三条边组成。该实现忽略了边的方向。该算法接收一个有向图作为输入,并输出一个Tuple3组成的DataSet。顶点ID类型必须是Comparable。 每一个Tuple3对应一个三角,其中的字段包含了组成三角形的顶点的ID。
(6)Summarization:总结算法。总结算法通过基于点和边的值对点和边分组来计算一个浓缩版的输入图。通过这种做法,该算法能帮助洞察获悉图中的模式和分布。该算法的一个用途是社区的可视化,其中社区所在图极大且该图需要基于存于顶点的社区ID来总结。该算法接收一个有向,顶点(和边)带属性的图作为输入,并输出一个新的图,其中每一个顶点表示一组来自输入图的顶点,每一条边表示一组来自输入图的边,每一个顶点和每一条边储存了共有的组值和代表元素的数量。
(7)TriangleListing:三角罗列算法。枚举图中所有的三角。一个三角由三条把三个点连接成一个大小为3的圈组成。该算法接收一个简单图作为输入,并输出一个TertiaryResult组成的DataSet,其中包含了三个三角定点。对无向图该算法类似于TriangleEnumerator。对于有向图算法,还包含一个位掩码,该位掩码标记六个潜在的连接三角的点的边。图ID类型必须是Comparable和Copyable。
(8)HITS:基于超链接的主题检索算法。是链接分析中非常基础且重要的算法。它为一个有向图的每个顶点计算两个互相独立的分数。优质的枢纽是那些指向许多优质的权威的枢纽,而优质的权威是那些被优质的枢纽指向的权威。该算法接收一个简单的有向图作为输入,输出一个UnaryResult组成的DataSet,其中包含了顶点的ID,枢纽得分,和权威得分。可以通过配置迭代的次数和/或在所有顶点上的得分变化的迭代总和上的收敛阈值来决定何时终结算法。
(9)PageRank:佩奇排名算法。佩奇排名是一个最早被使用来对网页搜索引擎进行排名的算法。如今该算法及其许多变体在各种图应用领域都被使用。排名算法的思想是重要或相关的顶点总是倾向与其它重要的顶点链接。该算法接收一个有向图作为输入,并输出一个DataSet,其中每一个Result包含顶点ID和佩奇排名得分。可以通过配置迭代的次数和/或在迭代之间的每一个顶点的分数变化的总和上的收敛阈值来决定何时终结算法。
(10)AdamicAdar:AA指数。AA指数衡量顶点对之间的相似度,通过共享邻居上的自由度的逆对数的和来计算。得分是非负且无界的。拥有较高自由度的顶点总体上有较大的影响,但每对邻居则没那么有影响。该算法接收一个简单无向图作为输入,并输出一个BinaryResult组成的DataSet,其中包含了两个顶点ID和AA相似度分数。图ID类型必须是Copyable。
(11)JaccardIndex:杰卡德指数。杰卡德指数衡量顶点邻居间的相似度,通过共享的邻居数除以各自不同的邻居数来计算。分数范围从0.0(没有共享邻居)到1.0(所有邻居均共享)。该算法接收一个简单的无向图作为输入,并输出一个元组(tuple)组成的DataSet,其中包含了两个顶点ID,共享邻居的数量,和不同邻居的数量。该结果类提供一个方法来计算杰卡德指数得分。图ID类型必须是Copyable。
(12)VertexInDegree/VertexOutDegree/VertexDegrees:用入边(in-degree),或出边(out-degree)标注一个有向图的点。VertexDegrees则用自由度(degree)、出边(out-degre)和入边(in-degree)标注一个有向图的点。
(13)VertexDegree:用自由度(degree)标注一个无向图的点。
(14)EdgeSourceDegrees/EdgeTargetDegrees/EdgeDegreesPair:用源点、目标点的自由度(degree),出边(out-degree)和入边(in-degree)标注一个有向图的边。
(15)EdgeSourceDegree/EdgeTargetDegree/EdgeDegreePair:用源点、目标点的自由度(degree)标注一个无向图的边。
(16)MaximumDegree:用最大自由度过滤一个无向图,大于该自由度的顶点以及相关的边将被删除。
(17)Simplify:图的简化。对有向图移除自环(self-loops)和重复的边,对无向图移除自环(self-loops)和重复的边,并添加对称边。
(18)TranslateGraphIds/TranslateVertexValues/TranslateEdgeValues:用给定的TranslateFunction转换点和边的ID、点的值、边的值。

17. GraphAnalytic

AverageClusteringCoefficient, GlobalClusteringCoefficient, LocalClusteringCoefficient
TriadicCensus, VertexMetrics, EdgeMetrics
(1)AverageClusteringCoefficient:图的聚类分析,这个表示平均集聚系数,有向图和无向图都有提供。它衡量一个图的平均连通性,得分从0.0(无三角形)到1.0(完全图)。平均集聚系数是所有拥有至少两个邻居的顶点上的本地集聚系数得分的平均值。每一个顶点,无论度数如何,对于该得分有相等的权重。该分析接收一个简单图作为输入,并输出一个AnalyticResult,该结果包含了顶点的总数和图的平均集聚系数。图ID类型必须是Comparable和Copyable。
(2)GlobalClusteringCoefficient:整体集聚系数分析。它衡量了一个图的连通性,得分从0.0(无三角形)到1.0(完全图)。整体集聚系数是整个图上的相连邻居的比率。拥有较高度数的顶点对于该得分有比较大的权重,因为邻居对数目是度数的二次方。该分析接收一个简单图作为输入,并输出一个AnalyticResult,该结果包含了图中三点组(triplet)和三角(triangle)的总数。该结果类提供了一个方法来计算整体集聚系数得分。图ID类型必须是Comparable和Copyable。
(3)LocalClusteringCoefficient:局部聚类系数分析。它衡量每个顶点的邻居的连通性。得分从0.0(邻居之间没有边)到1.0(邻居是一个圈)。一个顶点的邻居之间的边是一个三角。对邻居间的边计数相当于计算包含了顶点的三角形的数量。集聚系数是邻居间的边的数目与邻居间潜在边的数目的商。该分析接收一个简单图作为输入,并输出一个UnaryResult组成的DataSet,其中包含了顶点ID顶点自由度,和包含顶点的三角的数量。该结果类提供一个方法来计算局部集聚系数得分。图ID类型必须是Comparable和Copyable。
(4)TriadicCensus:三元统计分析。一个三点组合是由一个图内的三个顶点组成。每个三点组合包含了三对可能相连或不相连的顶点。三元统计计算图中每种类型的三点组合的出现次数。该分析接收一个简单图作为输入,并为查询每个三点组合类型的数目输出一个带有accessor方法的AnalyticResult。图ID类型必须是Comparable和Copyable。
(5)VertexMetrics:顶点指标分析。该图分析对有向图和无向图计算下列统计:- 顶点数量(number of vertices) - 边数量(number of edges) - 平均自由度(average degree) - 三点组数(number of triplets) - 最大自由度(maximum degree) - 三点组最大数(maximum number of triplets)。对有向图,可以额外计算下列统计:- 无向边数量(number of unidirectional edges) - 双向边数量(number of bidirectional edges) - 最大出边自由度(maximum out degree) - 最大入边自由度(maximum in degree)。
(6)EdgeMetrics:边指标分析。该图分析对有向图和无向图计算下列统计:- 三角三点组数(number of triangle triplets) - 长方三点组数(number of rectangle triplets) - 三角三点组的最大数量(maximum number of triangle triplets) - 长方三点组的最大数量(maximum number of rectangle triplets)。

18. GraphGenerator

CompleteGraph, CycleGraph, EmptyGraph, GridGraph
HypercubeGraph, PathGraph, RMatGraph, SingletonEdgeGraph, StarGraph
(1)GraphGenerator:图生成器接口。每个生成器都是并行的,用于创建大型数据集;是可自由扩展的,用于生成并行度无关的同样的图;并且是简洁的,它使用了尽可能少的算子。图生成器使用Builder模式进行配,可以通过调用setParallelism(parallelism)设置并行度。减少并行度可以降低内存和网络缓冲区的使用。特定的图配置必须首先被调用,该配置对所有的图生成器都是通用的,最后才会调用generate()。
(2)CompleteGraph:完全图。连接所有不同顶点对的无向图。
(3)CycleGraph:环图。所有的边形成一个环的无向图。
(4)EmptyGraph:空图。不存在边的图。
(5)GridGraph:网格图。一种点在一到多个维度正常平铺的无向图。每个维度都是独立配置的。当维度大小多于3时,每个维度的端点可以通过设置wrapEndpoints连接起来。
(6)HypercubeGraph:超立方图。所有的边形成N维超立方体的无向图。超立方体内的每个顶点和同维度的其他顶点连接。
(7)PathGraph:路径图。所有的边形成了一条路径的无向图。
(8)RMatGraph:使用Recursive Matrix(R-Mat)模型生成的有向幂法则多重图。
(9)SingletonEdgeGraph:单边图。包含一个或多个相互独立的双路径的无向图。每个端点的度数为1。
(10)StarGraph:星图。包含一个连接到所有其他叶子顶点的中心顶点的无向图。

19. BipartiteGraph, BipartiteEdge

(1)BipartiteGraph:二分图。其顶点被分成两个不相交的集合,分别称为顶部顶点集和底部顶点集。该图中的边只能连接相对集合中的顶点(即底部顶点到顶部顶点),并且不能连接同一集合中的两个顶点。这些图表在实践中具有广泛的应用,并且对于特定领域可能是更自然的选择。BipartiteGraph代表一个顶部端点集DataSet,一个底部端点集DataSet,由顶部和底部端点之间连接的边集DataSet。端点则Vertex类型表示,顶部和底部端点连接的边由BipartiteEdge表示。BipartiteEdge由顶部ID(顶部的ID Vertex),底部ID(底部的ID Vertex)和可选值定义。它与Edge的主要区别是,它链接的节点的ID可以是不同的类型。没有值的边具有NullValue值类型。主要操作:
fromDataSet():从顶部、底部节点集、边集DataSet创建二分图。
getTopVertices():顶部节点集DataSet。
getBottomVertices():底部节点集DataSet。
getEdges():二分图的边集DataSet。
projectionTopSimple()/projectionTopFull():顶部投影。将二分图转换成一个只包含顶部节点的图,并且只有在顶部节点都连接到原始图中的中间底部节点时,才在新图中创建它们之间的链接。其中简单投影使结果图中的每个节点都包含一对连接原始图中节点的边的值。完整投影保留有关两个顶点之间连接的所有信息并将其存储在Projection实例中。这包括中间顶点,源和目标顶点值以及源和目标边的值和ID。
projectionBottomSimple()/projectionBottomFull():底部投影。底部投影与顶部投影相反,即只保留底部节点,并连接一对节点(如果它们在原始图中有连接)。

你可能感兴趣的:(Java&Java企业级架构)