目录
在StreamExecutionEnvironment中有以下几个预定义的源:
简单的wordCount就不再演示了,可以移步官网-https://ci.apache.org/projects/flink/flink-docs-release-1.8/tutorials/local_setup.html
Flink的程序每个程序包含相同的基本部分如下:
1.获得一个execution environment2.加载/创建初始数据,
3.执行此数据的转换,
4.指定位置计算结果的位置
5.触发程序的执行
查看API示例移步-https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/operators/
Flink支持的数据类型
有六种不同类型的数据类型:(1.7)
1.Java元组和Scala样例类
2.java POJO
3.原始类型
4.常规Class
5.value --org.apache.flinktypes.Value
6.Hadoop Writaables
7.特殊类型 --如Scala的Option和Try ,Either
--累加器和比较器
一个问题:在jdk1.8中使用Lambdas表达式在map等转换算子中会出现无法类型推断的问题!!!
可能初入门会疑惑keyBy是什么,在Stream中keyBy就是用来分流/组的。内部使用散列分区-使用key去计算.hashCode(),再将得到的hash值经过murmurhash得到更均衡的哈希值,最后分发到具体的task上执行--zhisheng 数据倾斜发生在此处!!
/**
* Groups the elements of a DataStream by the given key positions (for tuple/array types) to
* be used with grouped operators like grouped reduce or grouped aggregations.
*/
def keyBy(fields: Int*): KeyedStream[T, JavaTuple] = asScalaStream(stream.keyBy(fields: _*))
常见的有
keyBy(0) --以元组的第一个元素为key
keyBy(1) -- 同上 二
keyBy("word") --field --给了schema信息可以这样scala的case class java请重写hashCode方法
minby:比较两个数字的大小的。 再keyBy之后才能用。
任务链和资源组:
Flink可以设置公用插槽是的任务可以共同定位在同一个线程中获得更好的性能,如果可能的话,Flink默认链操作符(例如,两个后续的映射转换)。如果需要,API可以对链接进行细粒度的控制:
使用StreamExecutionEnvironment.disableOperatorChaining()如果要禁用整个工作链条。对于更细粒度的控制,可以使用以下功能。请注意,这些函数只能再DataStream转换之后立即使用,因为它们引用了前一个转换。例如,您可以使用someStream.map(...).startNewChain(),但是不能使用someStream.startNewChain()。
资源组是Flink中的一个插槽,详细了解请参阅插槽,如果需要,可以在单独的插槽中手动隔离。
支持的数据源:
源是您的程序从中读取输入的位置。您可以将它的使用附加到程序中
StreamExecutionEnvironment.addSource(sourceFunction)
Flink同样附带了很多预先实现的函数,但您可以通过实现sourceFunction非并行源,或通过实现ParallelSourceFunction接口或者扩展RichParallelSourceFunction并行源来编写自己的自定义源。
在StreamExecutionEnvironment中有以下几个预定义的源:
基于文件的:
readTextFile(path) -TextInputFormat逐行读取文本文件,即符合规范的文件,并将它们作为字符串返回。
readFile(fileInputFormat,path)-按指定的文件输入格式指定读取(一次)文件。
readFile(fileInputFormat,path,watchType,interval,pathFilter)-这是前两个内部调用的方法。它path根据给定的内容读取文件fileInputFormat。根据提供的watchType,此源可以定期监视(每interval ms)新数据(FileProcessingMode.PROCESS_CONTINUOUSL)的路径,或者处理当前在路径中的数据并退出(FileProcessingMode.PROCESS_ONCE)。使用该pathFilter,用户可以进一步排除正在处理的文件。
--实现:
在Flink引擎下,Flink将文件读取过程分为两个子任务,即目录监控和数据读取。这些子任务中的每一个都由单独的实体实现。监视由单个非并行(并行性=1)任务实现,而读取由并行运行的多个任务执行,后者的并行性等于工作并行性。单个监视任务的作用是扫描目录(定期或仅一次,具体取决于watchType),找到要处理的文件,将它们分成分割,并将这些拆分分配给下游Reader。r读者是那些将read实际数据的人。每个分割仅由一个Reader读取,而Reader可以逐个读取多个分割。
---import Tips:
1.如果watchType设置为FileProcessingMode.PROCESS_CONTINUOUSLY,则在修改文件时,并将完全处理其内容,这可以打破“完全一次”的语义,因为在文件末尾追加数据将导致其所有内容并重新处理。
2.如果watchType设置为FileProcessingMode.PROCESS_ONCE,则源路径扫描一次并退出,而不等待读者完全读取文件内容。当然读者将继续阅读,直到读取所有文件内容。在该店之后关闭源将导致不再有检查点。这可能会导致节点发生故障后恢复速度变慢,因为将从上一个检查点恢复读取。
基于socket的:
socketTextStream -从套接字读取,数据元可以用分隔符分割。
基于集合的:
fromCollection(Collection) -从Java Java.util.Collection创建数据流。集合中所有数据元必须属于同一类型。
fromCollection(Iterator,Class) --从迭代器创建数据流,该类指定迭代器返回的数据元的数据类型。
fromParallelCollection(SplittableIterator,Class) --并行地从迭代器创建数据流。该类指定迭代器返回的数据元的数据类型。
generateSequence(from,to) -并行生成给定间隔中的数字序列。
自定义的:
addSource --附加新的源函数。例如,要从Kafka中读取,您可以使用addSource(new FlinkKafkaConsumer010[]()),请参阅连接器获取更多~