flink理论干货笔记(3)

201. pattern.oneOrMore()用于指定循环模式,比如上述b+,而pattern.times()可指定特定事件的出现次数,还可以指定最小和最大出现次数。pattern.greedy()使循环模式变得贪婪,即循环尽可能多次。pattern.optional()用于创建所有模式。pattern.timesOrMore(2)表示2次或者更多次

202. pattern的单模式api还有or、until等

203. 结合模式有严格连续性、轻松连续性、非确定性轻松连续性。具体算子有next、followedBy、followedByAny,以及notNext、notFollowedBy(无法结束)

204. pattern.within可定义模式在特定时间,如10秒内发生。注意,模式序列只能有一个时间约束

205. 严格连续用consecutive(),非确定性宽松连续用allowCombinations(),而默认的轻松连续用一般的oneOrMore()和times()等循环模式 

206. continuous()是严格连续,通常与oneOrMore以及times一起使用

207. 要控制分配事件的匹配数,可以指定跳过策略(AfterMatchSkipStrategy),具体有no_skip、skip_past_last_event、skip_to_first、skip_to_last 

208. 模式序列运行事件流是PatternStream,它通过CEP.pattern创建,参数是输入流、模式、比较器。比较器用于对具有相同时间戳的事件进行排序。

209. PatternStream可通过select或flatSelect进行选择。前者需要实现PatternSelectFunction接口。后者需要实现PatternFlatSelectFunction接口。 

210. 为了处理超时部分模式,提供了PatternTimeoutFunction和PatternFlatTimeoutFunction

211. sideOutputLateData方法用于处理迟到的数据 

212. flink dataset可通过env.fromElements创建,然后就能执行flatMap、groupBy、sum等算子。具体还有mapPartition、map、filter、reduce、reduceGroup、aggregate、and、andMin、distinct、join、where、equalTo、leftOuterJoin、coGroup、with、cross、union、reblance、partitionByHash、partitionByRange、partitionCustom、sortPartition、first、project、minBy、maxBy等 

213. env基于文件的创建方式有:readTextFile、readTextFileWithValue、readCsvFile、readFileOfPrimitives、readSequenceFile

214. env基于集合的创建方式有:fromCollection、fromElements、fromParallelCollection、generateSequence

215. 通用的创建方式有: readFile、createInput

216. flink dataset的输出方式有: writeAsText、writeAsFormattedText、writeAsCsv、print、write、output等

217. flink有两种类型的迭代:BulkIteration和DeltaIteration。前者是批量迭代,通过DataSet的iterate方法得到IterativeDataSet,使用closeWith来终止迭代。后者利用某些算法在每次迭代中不会更改解决方案的每个数据点,维护状态并增量更新。使用iterateDelta创建DeltaIteration对象,以及用getWorkset和getSolutionSet创建工作集和解决方案集。 

218. kmeans算法会用到BulkIteration来聚类未标记的点

219. 语义注释允许系统推断在多个算子操作中重用排序顺序或分区,可以加速执行,可用于提供函数行为的flink提示。它能使程序免于不必要的数据混洗或排序,提高了程序性能。宁愿没有,也不要提供错误的语义注释。 

220. 目前的语义注释有:转发字段注释、非转发字段、阅读字段。转发可以通过函数类注释或算子参数来声明,比如@ForwardedFields、@ForwardedFieldsFirst、@ForwardedFieldsSecond,以及withForwardedFields等。

221. 非转发字段声明所有未保存在函数中相同位置的字段。非转发字段和转发字段信息相反。非转发的规范是可选的。将转发字段声明为非转发是安全的。非转发被指定为字段表达式列表。且同样用函数类注释,如@NonForwardedFields、@NonForwardedFieldsFirst、@NonForwardedFieldsSecond等。

222. 阅读字段是读取字段信息声明由函数访问和评估的所有字段。同样使用函数类注释,如@ReadFields、@ReadFieldsFirst、@ReadFieldsSecond等。

223. 广播变量允许为算子操作的所有并行实例提供数据集。对于辅助数据集和数据相关的参数化非常有用。具体方法有withBroadcastSet、getRuntimeContext().getBroadcastVariable(String) 

224. 由于广播变量的内容保存在每个节点的内存中,因此不应该太大 

225. flink提供了分布式缓存,可以在本地访问用户函数的并行实例。可用于共享包含静态外部数据的文件,如字典或机器学习的回归模型。具体:env.registerCachedFile("hdfs:///…")或者把hdfs改为本地file 

226. withParaneters用于将参数传给函数,其中参数是Configuration对象,后者可以用setInteger等来设置键值对。flink还允许将自定义配置传递到全局配置ExecutionConfig,方法是setGlobalJobParameters 

227. flink dataset容错通过重试执行,比如env.setNumberOfExecutionRetries(3),在flink-conf.yaml还可以定义execution-retries.default为3

228. 重试延迟是env.getConfig().setExecutionRetryDelay(5000),也可以在yaml中指定,具体是execution-retries.delay:10s 

229. DataSetUtils. zipWithIndex用于压缩密集索引。而zipWithUniqueId以流水线方式工作,加快标签分配过程。

230. ExecutionConfig.enableObjectReuse()用来开启对象重用模式。该模式可最小化flink对象实例化的数量。 

231. Table api和sql api紧密集成,和其他api都可以轻松切换。比如可以用CEP从datastream提取模式,然后用table api分析模式。或者在运行Gelly图算法之前使用sql查询、过滤和聚合批处理表数据。 

232. table api和sql捆绑在flink-table的组件中,例如可以加入flink-table_2.11依赖项。目前flink的table api和sql是否已经分离? 

233. TableEnvironment.getTableEnvironment()来获取table执行环境tableEnv。然后registerTable或registerTableSource或registerExternalCatalog来注册表。然后通过table api来创建表,如tableEnv.scan("table1").select(..)或从sql查询来创建表,如tableEnv.sqlQuery(…)。最后写入sink,如writeToSink(…) 

234. TableEnvironment是table api和sql的核心。它负责table在内部目录注册、注册外部目录、执行sql查询、注册udf、转换datastream或dataset为table、持有对执行环境或流执行环境的引用。 

235. tableEnv.registerTableSource(…,…)用来注册Tablesource,而registerTableSink()用来注册Tablesink

236. tableEnv.registerExternalCatalog(…,…)用来注册外部目录,比如InMemoryExternalCatalog() 就是一种外部目录,其他包括HCatalog和Metastore等

237. table api可直接查询表,比如tableEnv.scan(…)以及.filter(…).groupBy(…).select(…)等 

238. tableEnv.sqlQuery()可直接执行sql,或者sqlUpdate() 

239. TableSink包括BatchTableSink(批处理用)、AppendStreamTableSink(流处理用)、RetractStreamTableSink(流处理用)、UpsertStreamTableSink(流处理用) 

240. Table.writeToSink()或Table.insertInto()都可以写入表

241. DataStream和DataSet可在TableEnvironment中注册,具体是tableEnv.registerDataStream (…,…)

242. DataStream和DataSet可直接转化为表,比如tableEnv.fromDataStream(stream,…)就得到Table

243. 表也能转化为DataStream或DataSet,其中最方便的转换类型是Row,其他还有pojo、case class、元组、原子类型

244. 将表转换为DataStream有两种模式,追加模式(仅insert)和缩进模式(包括insert和delete)。前者如tableEnv.toAppendStream(table,Row.class),后者如tableEnv.toRetractStream ( table, Row.class) 

245. 将表转化为DataSet使用tableEnv.toDataSet(table,…) 

246. DataStream到Table的数据类型转换,有两种方式:基于字段位置映射和基于字段名称映射。前者可用于保持字段顺序的同时为字段提供更有意义的名称,如tableEnv.fromDataStream ( stream, "myLong, myInt")。后者可用于任何数据类型,是最灵活的映射方式,如tableEnv. fromDataStream(stream,"f1 as myInt, f0 as myLong") 

247. 原子类型、元组、案例类、pojo、Row的datastream和dataset都能转换为表。 

248. TableEnvironment.explain(table)用于解释计算的逻辑和优化查询计划。有三个计划:关系查询的抽象语法树(即未优化的逻辑查询计划)、优化的逻辑查询计划、物理执行计划。 

249. sql和流处理的关系:
1) 数据库表可看成一个结果流(如insert、update、delete)的DML语句,也叫做更新日志流。
2) 物化视图定义为sql查询。为了更新视图,查询将持续处理视图基本关系的更改日志流。
3) 物化视图是流式sql查询的结果。 

250. 动态表是table api和sql支持流数据的核心概念。与表示批处理数据的静态表相比,动态表随时间变化。查询动态表会产生连续查询,连续查询永远不会终止,并生成动态表作为结果。查询不断更新(动态)结果表以反映其输入(动态)表的更改。对动态表的连续查询和物化视图的定义查询非常相似。

251. 动态表和连续查询的关系:
1) 转换为动态表
2) 在动态表上评估连续查询,生成新的动态表
3) 生成的动态表将转换回流 

252. 动态表是一个逻辑概念,查询期间,动态表不一定完全实现 

253. 在流上定义表,才能使用关系查询处理流。流的每个记录可看成insert对结果表的修改。因此可以建立一个insert-only changelog流构造一个表。 

254. 在任何时间点,连续查询的结果在语义上等同于在输入表的快照上以批处理模式执行的相同查询的结果。 

255. 连续查询在无界流上进行评估,通常运行数周或数月,因此处理的数据总量可能非常大。如果只添加或更新了单个输入记录,某些查询也需要重新计算和更新大部分发出的结果行,这样的查询不适合作为连续查询执行。

256. 表到流的转换,有三种编码动态表更改的方法:
1) 仅附加流,即只能通过insert更改的动态表
2) 撤销流,即包含添加和撤销消息。具体是insert、delete和update
3) upsert流,它包含upsert和delete

257. assignTimestampAndWatermarks(…)用来抽取时间戳并赋值水印(基于流的知识)

258. 流到表的转换:Table table=tEnv.fromDataStream(stream, …)以及WindowedTable  wintab = table. window(Tumble.over()...)

259. QueryConfig是查询配置,table api&sql用它来调整连续查询的准确性和资源消耗。具体是StreamQueryConfig qConfig=tableEnv.queryConfig()以及qConfig.withIdleStateRetentionTime (Time.hours(12),…) 

260. 表到dataset,用tableEnv.toDataSet(table,Row.class) 

261. dataset变为表,用xx.toTable(tEnv,…) 

262. 表到datastream,用table.toAppendStream(…)或tEnv.toAppendStream(table) 

263. 问题:dataset和datastream能否互通,而不经过table? 

264. table api&sql可以连接到外部系统,来处理批处理表和流表,格式有csv、parquet、orc等。需要先注册:tableEnv.connect(…).withFormat(…).withSchema(…).inAppendMode().  registerTableSource ("Mytable")

265. 可以用yaml配置来代替java/scala代码,来连接到外部系统 

266. flink提供了以下时间戳提取器:timestampFromField("…")、timestampFromSource (…)、timestampFromExtractor()

267. flink提供了以下水印策略:watermarksPeriodicAscending()、watermarksPeriodicBounded(2000)、watermarksFromSource() 

268. 和外部连接器的更新模式有,追加模式(insert)、回退模式(add和retract)、upsert模式(upsert和delete) 

269. 连接到外部系统的连接器有,文件系统连接器(内置)、kafka连接器等 

270. flink提供了一组可与表连接器一起使用的表格格式,如csv格式、json格式、avro格式 

271. flink sql的数据类型总结一下!以及csv、json、avro与flink sql的类型映射关系! 

272. OrcTableSource的maven依赖是flink-orc
CsvTableSink的maven依赖是flink-table
JDBCAppendTableSink的maven依赖是flink-jdbc
CassandraAppendTableSink的maven依赖是flink-connector-cassandra

273. table api的算子操作:scan(类似from)、select(类似select)、as(重命名)、where(类似where)、filter(类似where)、groupBy(类似group by)、Over(在window内定义)、distinct(类似distinct)、join(类似join,指内连)、leftOuterJoin/rightOuterJoin/fullOuterJoin(类似outer join)、union(类似union)、unionAll(类似union all)、intersect(类似intersect)、intersectAll(类似intersect all)、minus(类似except)、minusAll(类似except all)、in(类似in)、orderBy(类似order by)、offset和fetch(必须跟在orderBy后面)、insertInto(类似insert into) 

274. groupBy算子跟在window算子后面,有特殊的含义,叫做groupWindows

275. window(Tumble.over(…)).on(…).as(…)叫做滚动窗口操作 

276. window(Slide.over(…).every(…).on(…).as(…))叫做滑动窗口操作 

277. window(Session.withGap(…).on(…).as(…))叫做会话窗口操作 

278. dataset变表还有一种方法,tableEnv.fromDataSet(ds,…) 

279. OverWindows使用window(w:OverWindow*)子句定义,并通过select()方法的别名引用 

280. 有界的window写法:
.window (Over.partitionBy(…).orderBy(…).preceding("1 minutes").as(…)) 

281. 无界的window写法:
.window(Over.partitionBy(…).orderBy(…).preceding("unbounded_row").as(…)) 

282. table api使用TypeInformation来定义数据类型。table api和sql的类型有对应关系,比如Types.String对应varchar、Types.byte对应tinyint,Types.Row对应Row等等。 

283. 要访问sql查询的表,必须在TableEnvironment中注册它。可以从TableSource、Table、DataStream、DataSet来注册表,甚至可以用外部目录来注册。不支持的sql查询会报错TableException 

284. flink udf必须在TableEnvironment注册。比如,用户可以自定义聚合函数(UDAGG) 

285. flink sql支持内部相等join、外部相等join、time-windowed join 

286. groupwindows即组窗口函数,有tumble、hop、session三种。且这三者都能加上_start、_end、_rowtime、_proctime 

287. flink sql同样使用TypeInformation来定义数据类型。Table api、sql、java类型,这三者有对应关系 

288. flink sql有大量保留关键字 

289. table api&sql有大量内置函数,包括比较函数(如between、like、in等)、逻辑函数(如or、and、is、is not等)、算术函数(如power、mod、log、sin等)、字符串函数(如lower、trim、concat、repeat等)、时间函数(如Date、time、year等)、条件函数(如case、casewhen、boolean等)、类型转换函数(如cast)、集合函数(如map的、array的、element等)、value构建函数(如row、map、array等)、value访问函数(如composite.get、any.flatten等)、分组函数(group_id、grouping等)、散列函数(如md5、sha1、sha256等)、聚合函数(如count、avg、max等)、日期格式说明符(如%a、%b等) 

290. TableSource的方法有getTableSchema、getReturnType、explainSource 

291. BatchTableSource继承了TableSource,并提供了getDataSet方法 

292. StreamTableSource继承了TableSource,并提供了getDataStream方法 

293. TableSource通过实现DefinedProctimeAttribute来定义处理时间属性

294. TableSource通过实现DefinedRowtimeAttributes来定义rowtime属性

295. TableSource通过实现ProjectableTableSource来支持Projection下推

296. 如果TableSource用嵌套模式定义表,可以实现NestedFieldsProjectableTableSource将Projection扩展到嵌套字段

297. FilterableTableSource增加了对过滤器下推的支持。TableSource扩展该接口能够过滤记录,返回较少记录的流或批

298. TableSink的方法有getOutputType、getFieldNames、getFieldTypes、configure 

299. BatchTableSink扩展了TableSink,用于发出批处理表 

300. AppendStreamTableSink扩展了TableSink,用于发出仅具有插入更改的流表。RetractStreamTableSink扩展了TableSink,用于发出具有插入更新和删除更改的流表。UpsertStreamTableSink扩展了TableSink,用于发出具有插入更新和删除更改的流表 
 

你可能感兴趣的:(flink,大数据,spark,java,scala)