Repository: yangyichao-mango/flink-study
Branch: main
Commit: 9e7daac7923b
Files: 393
Total size: 1.5 MB
Directory structure:
gitextract_amrzktuf/
├── .gitignore
├── README.md
├── flink-examples-1.10/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── flink/
│ └── examples/
│ └── sql/
│ └── _07/
│ └── query/
│ └── _06_joins/
│ └── _02_interval_joins/
│ └── _01_outer_join/
│ ├── WindowJoinFunction$46.java
│ └── _06_Interval_Outer_Joins_EventTime_Test.java
├── flink-examples-1.12/
│ ├── .gitignore
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── flink/
│ └── examples/
│ ├── datastream/
│ │ └── _07/
│ │ └── query/
│ │ └── _04_window/
│ │ └── _04_TumbleWindowTest.java
│ └── sql/
│ └── _07/
│ └── query/
│ └── _04_window_agg/
│ ├── _04_TumbleWindowTest.java
│ ├── _04_TumbleWindowTest_GroupingWindowAggsHandler$59.java
│ ├── _04_TumbleWindowTest_KeyProjection$69.java
│ └── _04_TumbleWindowTest_WatermarkGenerator$6.java
├── flink-examples-1.13/
│ ├── .gitignore
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── flink/
│ │ │ ├── core/
│ │ │ │ └── source/
│ │ │ │ ├── JaninoUtils.java
│ │ │ │ └── SourceFactory.java
│ │ │ └── examples/
│ │ │ ├── FlinkEnvUtils.java
│ │ │ ├── JacksonUtils.java
│ │ │ ├── datastream/
│ │ │ │ ├── _01/
│ │ │ │ │ └── bytedance/
│ │ │ │ │ └── split/
│ │ │ │ │ ├── codegen/
│ │ │ │ │ │ ├── JaninoUtils.java
│ │ │ │ │ │ └── benchmark/
│ │ │ │ │ │ └── Benchmark.java
│ │ │ │ │ ├── job/
│ │ │ │ │ │ ├── SplitExampleJob.java
│ │ │ │ │ │ └── start.sh
│ │ │ │ │ ├── kafka/
│ │ │ │ │ │ ├── KafkaProducerCenter.java
│ │ │ │ │ │ └── demo/
│ │ │ │ │ │ ├── Application.java
│ │ │ │ │ │ ├── ConsumerThread.java
│ │ │ │ │ │ └── ProducerThread.java
│ │ │ │ │ ├── model/
│ │ │ │ │ │ ├── ClientLogSink.java
│ │ │ │ │ │ ├── ClientLogSource.java
│ │ │ │ │ │ ├── DynamicProducerRule.java
│ │ │ │ │ │ └── Evaluable.java
│ │ │ │ │ └── zkconfigcenter/
│ │ │ │ │ ├── ZkBasedConfigCenter.java
│ │ │ │ │ ├── new.json
│ │ │ │ │ └── old.json
│ │ │ │ ├── _02/
│ │ │ │ │ ├── DataStreamTest.java
│ │ │ │ │ └── DataStreamTest1.java
│ │ │ │ ├── _03/
│ │ │ │ │ ├── enums_state/
│ │ │ │ │ │ ├── EnumsStateTest.java
│ │ │ │ │ │ └── SenerioTest.java
│ │ │ │ │ └── state/
│ │ │ │ │ ├── StateExamplesTest.java
│ │ │ │ │ ├── _01_broadcast_state/
│ │ │ │ │ │ └── BroadcastStateTest.java
│ │ │ │ │ ├── _03_rocksdb/
│ │ │ │ │ │ ├── CreateStateBackendTest.java
│ │ │ │ │ │ ├── GettingStartDemo.java
│ │ │ │ │ │ ├── Rocksdb_OperatorAndKeyedState_StateStorageDIr_Test.java
│ │ │ │ │ │ ├── keyed_state/
│ │ │ │ │ │ │ ├── RocksBackendKeyedMapStateTest.java
│ │ │ │ │ │ │ └── RocksBackendKeyedValueStateTest.java
│ │ │ │ │ │ └── operator_state/
│ │ │ │ │ │ ├── KeyedStreamOperatorListStateTest.java
│ │ │ │ │ │ └── RocksBackendOperatorListStateTest.java
│ │ │ │ │ ├── _04_filesystem/
│ │ │ │ │ │ ├── keyed_state/
│ │ │ │ │ │ │ └── FsStateBackendKeyedMapStateTest.java
│ │ │ │ │ │ └── operator_state/
│ │ │ │ │ │ └── FsStateBackendOperatorListStateTest.java
│ │ │ │ │ └── _05_memory/
│ │ │ │ │ └── keyed_state/
│ │ │ │ │ └── MemoryStateBackendKeyedMapStateTest.java
│ │ │ │ ├── _04/
│ │ │ │ │ └── keyed_co_process/
│ │ │ │ │ ├── HashMapTest.java
│ │ │ │ │ └── _04_KeyedCoProcessFunctionTest.java
│ │ │ │ ├── _05_ken/
│ │ │ │ │ └── _01_watermark/
│ │ │ │ │ └── WatermarkTest.java
│ │ │ │ ├── _06_test/
│ │ │ │ │ └── _01_event_proctime/
│ │ │ │ │ ├── OneJobWIthProcAndEventTimeWIndowTest.java
│ │ │ │ │ └── OneJobWIthTimerTest.java
│ │ │ │ ├── _07_lambda_error/
│ │ │ │ │ └── LambdaErrorTest.java
│ │ │ │ ├── _08_late_record/
│ │ │ │ │ └── LatenessTest.java
│ │ │ │ ├── _09_join/
│ │ │ │ │ ├── _01_window_join/
│ │ │ │ │ │ └── _01_Window_Join_Test.java
│ │ │ │ │ └── _02_connect/
│ │ │ │ │ └── _01_Connect_Test.java
│ │ │ │ └── _10_agg/
│ │ │ │ └── AggTest.java
│ │ │ ├── practice/
│ │ │ │ └── _01/
│ │ │ │ └── dau/
│ │ │ │ └── _01_DataStream_Session_Window.java
│ │ │ ├── question/
│ │ │ │ ├── datastream/
│ │ │ │ │ └── _01/
│ │ │ │ │ └── kryo_protobuf_no_more_bytes_left/
│ │ │ │ │ └── KryoProtobufNoMoreBytesLeftTest.java
│ │ │ │ └── sql/
│ │ │ │ └── _01/
│ │ │ │ └── lots_source_fields_poor_performance/
│ │ │ │ ├── EmbeddedKafka.java
│ │ │ │ ├── _01_DataGenSourceTest.java
│ │ │ │ └── _01_JsonSourceTest.java
│ │ │ ├── runtime/
│ │ │ │ ├── _01/
│ │ │ │ │ └── future/
│ │ │ │ │ ├── CompletableFutureTest.java
│ │ │ │ │ ├── CompletableFutureTest4.java
│ │ │ │ │ ├── CompletableFuture_AnyOf_Test3.java
│ │ │ │ │ ├── CompletableFuture_ThenApplyAsync_Test2.java
│ │ │ │ │ ├── CompletableFuture_ThenComposeAsync_Test2.java
│ │ │ │ │ └── FutureTest.java
│ │ │ │ └── _04/
│ │ │ │ └── statebackend/
│ │ │ │ └── CancelAndRestoreWithCheckpointTest.java
│ │ │ └── sql/
│ │ │ ├── _01/
│ │ │ │ └── countdistincterror/
│ │ │ │ ├── CountDistinctErrorTest.java
│ │ │ │ ├── CountDistinctErrorTest2.java
│ │ │ │ ├── CountDistinctErrorTest3.java
│ │ │ │ └── udf/
│ │ │ │ ├── Mod_UDF.java
│ │ │ │ ├── StatusMapper1_UDF.java
│ │ │ │ └── StatusMapper_UDF.java
│ │ │ ├── _02/
│ │ │ │ └── timezone/
│ │ │ │ ├── TimeZoneTest.java
│ │ │ │ ├── TimeZoneTest2.java
│ │ │ │ └── TimeZoneTest3.java
│ │ │ ├── _03/
│ │ │ │ └── source_sink/
│ │ │ │ ├── CreateViewTest.java
│ │ │ │ ├── DataStreamSourceEventTimeTest.java
│ │ │ │ ├── DataStreamSourceProcessingTimeTest.java
│ │ │ │ ├── KafkaSourceTest.java
│ │ │ │ ├── RedisLookupTest.java
│ │ │ │ ├── RedisSinkTest.java
│ │ │ │ ├── SocketSourceTest.java
│ │ │ │ ├── TableApiKafkaSourceTest.java
│ │ │ │ ├── UpsertKafkaSinkProtobufFormatSupportTest.java
│ │ │ │ ├── UpsertKafkaSinkTest.java
│ │ │ │ ├── UserDefinedSourceTest.java
│ │ │ │ ├── abilities/
│ │ │ │ │ ├── sink/
│ │ │ │ │ │ ├── Abilities_SinkFunction.java
│ │ │ │ │ │ ├── Abilities_TableSink.java
│ │ │ │ │ │ ├── Abilities_TableSinkFactory.java
│ │ │ │ │ │ └── _01_SupportsWritingMetadata_Test.java
│ │ │ │ │ └── source/
│ │ │ │ │ ├── Abilities_SourceFunction.java
│ │ │ │ │ ├── Abilities_TableSource.java
│ │ │ │ │ ├── Abilities_TableSourceFactory.java
│ │ │ │ │ ├── _01_SupportsFilterPushDown_Test.java
│ │ │ │ │ ├── _02_SupportsLimitPushDown_Test.java
│ │ │ │ │ ├── _03_SupportsPartitionPushDown_Test.java
│ │ │ │ │ ├── _04_SupportsProjectionPushDown_JDBC_Test.java
│ │ │ │ │ ├── _04_SupportsProjectionPushDown_Test.java
│ │ │ │ │ ├── _05_SupportsReadingMetadata_Test.java
│ │ │ │ │ ├── _06_SupportsWatermarkPushDown_Test.java
│ │ │ │ │ ├── _07_SupportsSourceWatermark_Test.java
│ │ │ │ │ └── before/
│ │ │ │ │ ├── Before_Abilities_SourceFunction.java
│ │ │ │ │ ├── Before_Abilities_TableSource.java
│ │ │ │ │ ├── Before_Abilities_TableSourceFactory.java
│ │ │ │ │ ├── _01_Before_SupportsFilterPushDown_Test.java
│ │ │ │ │ ├── _02_Before_SupportsLimitPushDown_Test.java
│ │ │ │ │ ├── _03_Before_SupportsPartitionPushDown_Test.java
│ │ │ │ │ ├── _04_Before_SupportsProjectionPushDown_Test.java
│ │ │ │ │ ├── _05_Before_SupportsReadingMetadata_Test.java
│ │ │ │ │ ├── _06_Before_SupportsWatermarkPushDown_Test.java
│ │ │ │ │ └── _07_Before_SupportsSourceWatermark_Test.java
│ │ │ │ ├── ddl/
│ │ │ │ │ └── TableApiDDLTest.java
│ │ │ │ └── table/
│ │ │ │ ├── redis/
│ │ │ │ │ ├── container/
│ │ │ │ │ │ ├── RedisCommandsContainer.java
│ │ │ │ │ │ ├── RedisCommandsContainerBuilder.java
│ │ │ │ │ │ └── RedisContainer.java
│ │ │ │ │ ├── demo/
│ │ │ │ │ │ └── RedisDemo.java
│ │ │ │ │ ├── mapper/
│ │ │ │ │ │ ├── LookupRedisMapper.java
│ │ │ │ │ │ ├── RedisCommand.java
│ │ │ │ │ │ ├── RedisCommandDescription.java
│ │ │ │ │ │ └── SetRedisMapper.java
│ │ │ │ │ ├── options/
│ │ │ │ │ │ ├── RedisLookupOptions.java
│ │ │ │ │ │ ├── RedisOptions.java
│ │ │ │ │ │ └── RedisWriteOptions.java
│ │ │ │ │ ├── v1/
│ │ │ │ │ │ ├── RedisDynamicTableFactory.java
│ │ │ │ │ │ ├── sink/
│ │ │ │ │ │ │ └── RedisDynamicTableSink.java
│ │ │ │ │ │ └── source/
│ │ │ │ │ │ ├── RedisDynamicTableSource.java
│ │ │ │ │ │ └── RedisRowDataLookupFunction.java
│ │ │ │ │ └── v2/
│ │ │ │ │ ├── RedisDynamicTableFactory.java
│ │ │ │ │ ├── sink/
│ │ │ │ │ │ └── RedisDynamicTableSink.java
│ │ │ │ │ └── source/
│ │ │ │ │ ├── RedisDynamicTableSource.java
│ │ │ │ │ ├── RedisRowDataBatchLookupFunction.java
│ │ │ │ │ └── RedisRowDataLookupFunction.java
│ │ │ │ ├── socket/
│ │ │ │ │ ├── SocketDynamicTableFactory.java
│ │ │ │ │ ├── SocketDynamicTableSource.java
│ │ │ │ │ └── SocketSourceFunction.java
│ │ │ │ └── user_defined/
│ │ │ │ ├── UserDefinedDynamicTableFactory.java
│ │ │ │ ├── UserDefinedDynamicTableSource.java
│ │ │ │ └── UserDefinedSource.java
│ │ │ ├── _04/
│ │ │ │ └── type/
│ │ │ │ ├── BlinkPlannerTest.java
│ │ │ │ ├── JavaEnvTest.java
│ │ │ │ └── OldPlannerTest.java
│ │ │ ├── _05/
│ │ │ │ └── format/
│ │ │ │ └── formats/
│ │ │ │ ├── ProtobufFormatTest.java
│ │ │ │ ├── SocketWriteTest.java
│ │ │ │ ├── csv/
│ │ │ │ │ ├── ChangelogCsvDeserializer.java
│ │ │ │ │ ├── ChangelogCsvFormat.java
│ │ │ │ │ └── ChangelogCsvFormatFactory.java
│ │ │ │ ├── protobuf/
│ │ │ │ │ ├── descriptors/
│ │ │ │ │ │ ├── Protobuf.java
│ │ │ │ │ │ └── ProtobufValidator.java
│ │ │ │ │ ├── row/
│ │ │ │ │ │ ├── ProtobufDeserializationSchema.java
│ │ │ │ │ │ ├── ProtobufRowDeserializationSchema.java
│ │ │ │ │ │ ├── ProtobufRowFormatFactory.java
│ │ │ │ │ │ ├── ProtobufRowSerializationSchema.java
│ │ │ │ │ │ ├── ProtobufSerializationSchema.java
│ │ │ │ │ │ ├── ProtobufUtils.java
│ │ │ │ │ │ └── typeutils/
│ │ │ │ │ │ └── ProtobufSchemaConverter.java
│ │ │ │ │ └── rowdata/
│ │ │ │ │ ├── ProtobufFormatFactory.java
│ │ │ │ │ ├── ProtobufOptions.java
│ │ │ │ │ ├── ProtobufRowDataDeserializationSchema.java
│ │ │ │ │ ├── ProtobufRowDataSerializationSchema.java
│ │ │ │ │ ├── ProtobufToRowDataConverters.java
│ │ │ │ │ └── RowDataToProtobufConverters.java
│ │ │ │ └── utils/
│ │ │ │ ├── MoreRunnables.java
│ │ │ │ ├── MoreSuppliers.java
│ │ │ │ ├── ThrowableRunable.java
│ │ │ │ └── ThrowableSupplier.java
│ │ │ ├── _06/
│ │ │ │ └── calcite/
│ │ │ │ ├── CalciteTest.java
│ │ │ │ ├── ParserTest.java
│ │ │ │ └── javacc/
│ │ │ │ ├── JavaccCodeGenTest.java
│ │ │ │ ├── Simple1Test.java
│ │ │ │ └── generatedcode/
│ │ │ │ ├── ParseException.java
│ │ │ │ ├── Simple1.java
│ │ │ │ ├── Simple1Constants.java
│ │ │ │ ├── Simple1TokenManager.java
│ │ │ │ ├── SimpleCharStream.java
│ │ │ │ ├── Token.java
│ │ │ │ └── TokenMgrError.java
│ │ │ ├── _07/
│ │ │ │ └── query/
│ │ │ │ ├── _01_select_where/
│ │ │ │ │ ├── SelectWhereHiveDialect.java
│ │ │ │ │ ├── SelectWhereTest.java
│ │ │ │ │ ├── SelectWhereTest2.java
│ │ │ │ │ ├── SelectWhereTest3.java
│ │ │ │ │ ├── SelectWhereTest4.java
│ │ │ │ │ ├── SelectWhereTest5.java
│ │ │ │ │ └── StreamExecCalc$10.java
│ │ │ │ ├── _02_select_distinct/
│ │ │ │ │ ├── GroupAggsHandler$5.java
│ │ │ │ │ ├── KeyProjection$0.java
│ │ │ │ │ ├── SelectDistinctTest.java
│ │ │ │ │ └── SelectDistinctTest2.java
│ │ │ │ ├── _03_group_agg/
│ │ │ │ │ ├── _01_group_agg/
│ │ │ │ │ │ ├── GroupAggMiniBatchTest.java
│ │ │ │ │ │ ├── GroupAggTest.java
│ │ │ │ │ │ └── GroupAggsHandler$39.java
│ │ │ │ │ ├── _02_count_distinct/
│ │ │ │ │ │ ├── CountDistinctGroupAggTest.java
│ │ │ │ │ │ └── GroupAggsHandler$17.java
│ │ │ │ │ ├── _03_grouping_sets/
│ │ │ │ │ │ ├── GroupingSetsEqualsGroupAggUnionAllGroupAggTest2.java
│ │ │ │ │ │ ├── GroupingSetsGroupAggTest.java
│ │ │ │ │ │ ├── GroupingSetsGroupAggTest2.java
│ │ │ │ │ │ └── StreamExecExpand$20.java
│ │ │ │ │ ├── _04_cube/
│ │ │ │ │ │ ├── CubeGroupAggTest.java
│ │ │ │ │ │ └── CubeGroupAggTest2.java
│ │ │ │ │ └── _05_rollup/
│ │ │ │ │ ├── RollUpGroupAggTest.java
│ │ │ │ │ └── RollUpGroupAggTest2.java
│ │ │ │ ├── _04_window_agg/
│ │ │ │ │ ├── _01_tumble_window/
│ │ │ │ │ │ ├── TumbleWindow2GroupAggTest.java
│ │ │ │ │ │ ├── TumbleWindowTest.java
│ │ │ │ │ │ ├── TumbleWindowTest2.java
│ │ │ │ │ │ ├── TumbleWindowTest3.java
│ │ │ │ │ │ ├── TumbleWindowTest4.java
│ │ │ │ │ │ ├── TumbleWindowTest5.java
│ │ │ │ │ │ ├── global_agg/
│ │ │ │ │ │ │ ├── GlobalWindowAggsHandler$232.java
│ │ │ │ │ │ │ ├── LocalWindowAggsHandler$162.java
│ │ │ │ │ │ │ └── StateWindowAggsHandler$300.java
│ │ │ │ │ │ └── local_agg/
│ │ │ │ │ │ ├── KeyProjection$89.java
│ │ │ │ │ │ └── LocalWindowAggsHandler$88.java
│ │ │ │ │ ├── _02_cumulate_window/
│ │ │ │ │ │ ├── CumulateWindowGroupingSetsBigintTest.java
│ │ │ │ │ │ ├── CumulateWindowGroupingSetsTest.java
│ │ │ │ │ │ ├── CumulateWindowTest.java
│ │ │ │ │ │ ├── TumbleWindowEarlyFireTest.java
│ │ │ │ │ │ ├── cumulate/
│ │ │ │ │ │ │ ├── global_agg/
│ │ │ │ │ │ │ │ ├── GlobalWindowAggsHandler$232.java
│ │ │ │ │ │ │ │ ├── KeyProjection$301.java
│ │ │ │ │ │ │ │ ├── LocalWindowAggsHandler$162.java
│ │ │ │ │ │ │ │ └── StateWindowAggsHandler$300.java
│ │ │ │ │ │ │ └── local_agg/
│ │ │ │ │ │ │ ├── KeyProjection$89.java
│ │ │ │ │ │ │ └── LocalWindowAggsHandler$88.java
│ │ │ │ │ │ └── earlyfire/
│ │ │ │ │ │ ├── GroupAggsHandler$210.java
│ │ │ │ │ │ └── GroupingWindowAggsHandler$57.java
│ │ │ │ │ └── _03_hop_window/
│ │ │ │ │ └── HopWindowGroupWindowAggTest.java
│ │ │ │ ├── _05_over/
│ │ │ │ │ ├── _01_row_number/
│ │ │ │ │ │ ├── RowNumberOrderByBigintTest.java
│ │ │ │ │ │ ├── RowNumberOrderByStringTest.java
│ │ │ │ │ │ ├── RowNumberOrderByUnixTimestampTest.java
│ │ │ │ │ │ ├── RowNumberWithoutPartitionKeyTest.java
│ │ │ │ │ │ ├── RowNumberWithoutRowNumberEqual1Test.java
│ │ │ │ │ │ └── Scalar_UDF.java
│ │ │ │ │ └── _02_agg/
│ │ │ │ │ ├── RangeIntervalProctimeTest.java
│ │ │ │ │ ├── RangeIntervalRowtimeAscendingTest.java
│ │ │ │ │ ├── RangeIntervalRowtimeBoundedOutOfOrdernessTest.java
│ │ │ │ │ ├── RangeIntervalRowtimeStrictlyAscendingTest.java
│ │ │ │ │ └── RowIntervalTest.java
│ │ │ │ ├── _06_joins/
│ │ │ │ │ ├── _01_regular_joins/
│ │ │ │ │ │ ├── _01_inner_join/
│ │ │ │ │ │ │ ├── ConditionFunction$4.java
│ │ │ │ │ │ │ ├── _01_InnerJoinsTest.java
│ │ │ │ │ │ │ └── _02_InnerJoinsOnNotEqualTest.java
│ │ │ │ │ │ └── _02_outer_join/
│ │ │ │ │ │ ├── _01_LeftJoinsTest.java
│ │ │ │ │ │ ├── _02_RightJoinsTest.java
│ │ │ │ │ │ └── _03_FullJoinsTest.java
│ │ │ │ │ ├── _02_interval_joins/
│ │ │ │ │ │ ├── _01_proctime/
│ │ │ │ │ │ │ ├── Interval_Full_Joins_ProcesingTime_Test.java
│ │ │ │ │ │ │ ├── Interval_Inner_Joins_ProcesingTime_Test.java
│ │ │ │ │ │ │ ├── Interval_Left_Joins_ProcesingTime_Test.java
│ │ │ │ │ │ │ └── Interval_Right_Joins_ProcesingTime_Test.java
│ │ │ │ │ │ └── _02_row_time/
│ │ │ │ │ │ ├── Interval_Full_JoinsOnNotEqual_EventTime_Test.java
│ │ │ │ │ │ ├── Interval_Full_Joins_EventTime_Test.java
│ │ │ │ │ │ ├── Interval_Inner_Joins_EventTime_Test.java
│ │ │ │ │ │ ├── Interval_Left_Joins_EventTime_Test.java
│ │ │ │ │ │ └── Interval_Right_Joins_EventTime_Test.java
│ │ │ │ │ ├── _03_temporal_join/
│ │ │ │ │ │ ├── _01_proctime/
│ │ │ │ │ │ │ └── Temporal_Join_ProcesingTime_Test.java
│ │ │ │ │ │ └── _02_row_time/
│ │ │ │ │ │ └── Temporal_Join_EventTime_Test.java
│ │ │ │ │ ├── _04_lookup_join/
│ │ │ │ │ │ └── _01_redis/
│ │ │ │ │ │ ├── RedisBatchLookupTest2.java
│ │ │ │ │ │ ├── RedisDemo.java
│ │ │ │ │ │ ├── RedisLookupTest.java
│ │ │ │ │ │ ├── RedisLookupTest2.java
│ │ │ │ │ │ └── pipeline/
│ │ │ │ │ │ ├── BatchJoinTableFuncCollector$8.java
│ │ │ │ │ │ ├── BatchLookupFunction$4.java
│ │ │ │ │ │ ├── JoinTableFuncCollector$8.java
│ │ │ │ │ │ ├── JoinTableFuncCollector$9.java
│ │ │ │ │ │ ├── LookupFunction$4.java
│ │ │ │ │ │ ├── LookupFunction$5.java
│ │ │ │ │ │ └── T1.java
│ │ │ │ │ ├── _05_array_expansion/
│ │ │ │ │ │ └── _01_ArrayExpansionTest.java
│ │ │ │ │ └── _06_table_function/
│ │ │ │ │ └── _01_inner_join/
│ │ │ │ │ ├── TableFunctionInnerJoin_Test.java
│ │ │ │ │ └── TableFunctionInnerJoin_WithEmptyTableFunction_Test.java
│ │ │ │ ├── _07_deduplication/
│ │ │ │ │ ├── DeduplicationProcessingTimeTest.java
│ │ │ │ │ ├── DeduplicationProcessingTimeTest1.java
│ │ │ │ │ └── DeduplicationRowTimeTest.java
│ │ │ │ ├── _08_datastream_trans/
│ │ │ │ │ ├── AlertExample.java
│ │ │ │ │ ├── AlertExampleRetract.java
│ │ │ │ │ ├── AlertExampleRetractError.java
│ │ │ │ │ ├── RetractExample.java
│ │ │ │ │ └── Test.java
│ │ │ │ ├── _09_set_operations/
│ │ │ │ │ ├── Except_Test.java
│ │ │ │ │ ├── Exist_Test.java
│ │ │ │ │ ├── In_Test.java
│ │ │ │ │ ├── Intersect_Test.java
│ │ │ │ │ ├── UnionAll_Test.java
│ │ │ │ │ └── Union_Test.java
│ │ │ │ ├── _10_order_by/
│ │ │ │ │ ├── OrderBy_with_time_attr_Test.java
│ │ │ │ │ └── OrderBy_without_time_attr_Test.java
│ │ │ │ ├── _11_limit/
│ │ │ │ │ └── Limit_Test.java
│ │ │ │ ├── _12_topn/
│ │ │ │ │ └── TopN_Test.java
│ │ │ │ ├── _13_window_topn/
│ │ │ │ │ └── WindowTopN_Test.java
│ │ │ │ ├── _14_retract/
│ │ │ │ │ └── Retract_Test.java
│ │ │ │ ├── _15_exec_options/
│ │ │ │ │ ├── Default_Parallelism_Test.java
│ │ │ │ │ ├── Idle_Timeout_Test.java
│ │ │ │ │ └── State_Ttl_Test.java
│ │ │ │ ├── _16_optimizer_options/
│ │ │ │ │ ├── Agg_OnePhase_Strategy_window_Test.java
│ │ │ │ │ ├── Agg_TwoPhase_Strategy_unbounded_Test.java
│ │ │ │ │ ├── Agg_TwoPhase_Strategy_window_Test.java
│ │ │ │ │ ├── DistinctAgg_Split_One_Distinct_Key_Test.java
│ │ │ │ │ └── DistinctAgg_Split_Two_Distinct_Key_Test.java
│ │ │ │ ├── _17_table_options/
│ │ │ │ │ ├── Dml_Syc_False_Test.java
│ │ │ │ │ ├── Dml_Syc_True_Test.java
│ │ │ │ │ └── TimeZone_window_Test.java
│ │ │ │ └── _18_performance_tuning/
│ │ │ │ └── Count_Distinct_Filter_Test.java
│ │ │ ├── _08/
│ │ │ │ └── batch/
│ │ │ │ ├── Utils.java
│ │ │ │ ├── _01_ddl/
│ │ │ │ │ └── HiveDDLTest.java
│ │ │ │ ├── _02_dml/
│ │ │ │ │ ├── HiveDMLBetweenAndTest.java
│ │ │ │ │ ├── HiveDMLTest.java
│ │ │ │ │ ├── HiveTest2.java
│ │ │ │ │ ├── _01_hive_dialect/
│ │ │ │ │ │ └── HiveDMLTest.java
│ │ │ │ │ ├── _02_with_as/
│ │ │ │ │ │ └── HIveWIthAsTest.java
│ │ │ │ │ ├── _03_substr/
│ │ │ │ │ │ └── HiveSubstrTest.java
│ │ │ │ │ ├── _04_tumble_window/
│ │ │ │ │ │ ├── Test.java
│ │ │ │ │ │ ├── Test1.java
│ │ │ │ │ │ ├── Test2_BIGINT_SOURCE.java
│ │ │ │ │ │ ├── Test3.java
│ │ │ │ │ │ └── Test5.java
│ │ │ │ │ ├── _05_batch_to_datastream/
│ │ │ │ │ │ └── Test.java
│ │ │ │ │ └── _06_select_where/
│ │ │ │ │ └── Test.java
│ │ │ │ ├── _03_hive_udf/
│ │ │ │ │ ├── HiveModuleV2.java
│ │ │ │ │ ├── HiveUDFRegistryTest.java
│ │ │ │ │ ├── HiveUDFRegistryUnloadTest.java
│ │ │ │ │ ├── _01_GenericUDAFResolver2/
│ │ │ │ │ │ ├── HiveUDAF_hive_module_registry_Test.java
│ │ │ │ │ │ ├── HiveUDAF_sql_registry_create_function_Test.java
│ │ │ │ │ │ ├── HiveUDAF_sql_registry_create_temporary_function_Test.java
│ │ │ │ │ │ └── TestHiveUDAF.java
│ │ │ │ │ ├── _02_GenericUDTF/
│ │ │ │ │ │ ├── HiveUDTF_hive_module_registry_Test.java
│ │ │ │ │ │ ├── HiveUDTF_sql_registry_create_function_Test.java
│ │ │ │ │ │ ├── HiveUDTF_sql_registry_create_temporary_function_Test.java
│ │ │ │ │ │ └── TestHiveUDTF.java
│ │ │ │ │ ├── _03_built_in_udf/
│ │ │ │ │ │ ├── _01_get_json_object/
│ │ │ │ │ │ │ └── HiveUDF_get_json_object_Test.java
│ │ │ │ │ │ └── _02_rlike/
│ │ │ │ │ │ └── HiveUDF_rlike_Test.java
│ │ │ │ │ └── _04_GenericUDF/
│ │ │ │ │ ├── HiveUDF_hive_module_registry_Test.java
│ │ │ │ │ ├── HiveUDF_sql_registry_create_function_Test.java
│ │ │ │ │ ├── HiveUDF_sql_registry_create_temporary_function_Test.java
│ │ │ │ │ └── TestGenericUDF.java
│ │ │ │ ├── _04_flink_udf/
│ │ │ │ │ ├── FlinkUDAF_Test.java
│ │ │ │ │ ├── FlinkUDF_Test.java
│ │ │ │ │ └── FlinkUDTF_Test.java
│ │ │ │ └── _05_test/
│ │ │ │ └── _01_batch_to_datastream/
│ │ │ │ └── Test.java
│ │ │ ├── _09/
│ │ │ │ └── udf/
│ │ │ │ ├── _01_hive_udf/
│ │ │ │ │ └── _01_GenericUDF/
│ │ │ │ │ ├── HiveUDF_sql_registry_create_function_Test.java
│ │ │ │ │ ├── HiveUDF_sql_registry_create_function_with_hive_catalog_Test.java
│ │ │ │ │ ├── HiveUDF_sql_registry_create_temporary_function_Test.java
│ │ │ │ │ ├── HiveUDF_sql_registry_create_temporary_function_with_hive_catalog_Test.java
│ │ │ │ │ └── TestGenericUDF.java
│ │ │ │ ├── _02_stream_hive_udf/
│ │ │ │ │ ├── HiveUDF_Error_Test.java
│ │ │ │ │ ├── HiveUDF_create_temporary_error_Test.java
│ │ │ │ │ ├── HiveUDF_hive_module_registry_Test.java
│ │ │ │ │ ├── HiveUDF_load_first_Test.java
│ │ │ │ │ ├── HiveUDF_load_second_Test.java
│ │ │ │ │ ├── TestGenericUDF.java
│ │ │ │ │ └── UserDefinedSource.java
│ │ │ │ ├── _03_advanced_type_inference/
│ │ │ │ │ ├── AdvancedFunctionsExample.java
│ │ │ │ │ ├── InternalRowMergerFunction.java
│ │ │ │ │ └── LastDatedValueFunction.java
│ │ │ │ ├── _04_udf/
│ │ │ │ │ └── UDAF_Test.java
│ │ │ │ └── _05_scalar_function/
│ │ │ │ ├── ExplodeUDTF.java
│ │ │ │ ├── ExplodeUDTFV2.java
│ │ │ │ ├── GetMapValue.java
│ │ │ │ ├── GetSetValue.java
│ │ │ │ ├── ScalarFunctionTest.java
│ │ │ │ ├── ScalarFunctionTest2.java
│ │ │ │ ├── SetStringUDF.java
│ │ │ │ └── TableFunctionTest2.java
│ │ │ ├── _10_share/
│ │ │ │ └── A.java
│ │ │ ├── _11_explain/
│ │ │ │ └── Explain_Test.java
│ │ │ └── _12_data_type/
│ │ │ ├── _01_interval/
│ │ │ │ ├── Timestamp3_Interval_To_Test.java
│ │ │ │ └── Timestamp_ltz3_Interval_To_Test.java
│ │ │ ├── _02_user_defined/
│ │ │ │ ├── User.java
│ │ │ │ ├── UserDefinedDataTypes_Test.java
│ │ │ │ ├── UserDefinedDataTypes_Test2.java
│ │ │ │ └── UserScalarFunction.java
│ │ │ └── _03_raw/
│ │ │ ├── RawScalarFunction.java
│ │ │ └── Raw_DataTypes_Test2.java
│ │ ├── javacc/
│ │ │ └── Simple1.jj
│ │ ├── proto/
│ │ │ ├── source.proto
│ │ │ └── test.proto
│ │ ├── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── org.apache.flink.table.factories.Factory
│ │ └── scala/
│ │ └── flink/
│ │ └── examples/
│ │ └── sql/
│ │ └── _04/
│ │ └── type/
│ │ └── TableFunc0.scala
│ └── test/
│ ├── java/
│ │ └── flink/
│ │ └── examples/
│ │ └── sql/
│ │ ├── _05/
│ │ │ └── format/
│ │ │ └── formats/
│ │ │ └── protobuf/
│ │ │ ├── row/
│ │ │ │ ├── ProtobufRowDeserializationSchemaTest.java
│ │ │ │ └── ProtobufRowSerializationSchemaTest.java
│ │ │ └── rowdata/
│ │ │ ├── ProtobufRowDataDeserializationSchemaTest.java
│ │ │ └── ProtobufRowDataSerializationSchemaTest.java
│ │ ├── _06/
│ │ │ └── calcite/
│ │ │ └── CalciteTest.java
│ │ └── _07/
│ │ └── query/
│ │ └── _06_joins/
│ │ └── JaninoCompileTest.java
│ ├── proto/
│ │ └── person.proto
│ └── scala/
│ ├── ScalaEnv.scala
│ └── TableFunc0.scala
├── flink-examples-1.14/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── flink/
│ └── examples/
│ └── sql/
│ └── _08/
│ └── batch/
│ ├── HiveModuleV2.java
│ └── Test.java
├── flink-examples-1.8/
│ ├── .gitignore
│ └── pom.xml
└── pom.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
#**/src/test/**
.idea/
*.iml
*.DS_Store
### IntelliJ IDEA ###
.idea
*.iws
*.ipr
================================================
FILE: README.md
================================================
# 1.友情提示
> 1. 联系我:如要有问题咨询,请联系我(公众号:[`大数据羊说`](#32公众号),备注来自`GitHub`)
> 2. 该仓库会持续更新 flink 教程福利干货,麻烦路过的各位亲给这个项目点个 `star`,太不易了,写了这么多,算是对我坚持下来的一种鼓励吧!


# 2.文章目录
> 以下列出的是作者对原创的一些文章和一些学习资源做了一个汇总,会持续更新!如果帮到了您,请点个star支持一下,谢谢!
## 2.1.flink sql
1. [公众号文章:踩坑记 | flink sql count 还有这种坑!](https://mp.weixin.qq.com/s/5XDkmuEIfHB_WsMHPeinkw),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_01/countdistincterror)
2. [公众号文章:实战 | flink sql 与微博热搜的碰撞!!!](https://mp.weixin.qq.com/s/GHLoWMBZxajA2nXPHhH8WA)
3. [公众号文章:flink sql 知其所以然(一)| source\sink 原理](https://mp.weixin.qq.com/s/xIXh8B_suAlKSp56aO5aEg),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_03/source_sink)
4. [公众号文章:flink sql 知其所以然(二)| 自定义 redis 数据维表(附源码)](https://mp.weixin.qq.com/s/b_zV_tGp5QJQjgnSaxNT_Q),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_03/source_sink)
5. [公众号文章:flink sql 知其所以然(三)| 自定义 redis 数据汇表(附源码)](https://mp.weixin.qq.com/s/7Fwey_AXNJ0jQZWfXvtNmw),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_03/source_sink)
6. [公众号文章:flink sql 知其所以然(四)| sql api 类型系统](https://mp.weixin.qq.com/s/aqDRWgr3Kim7lblx10JvtA),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_04/type)
7. [公众号文章:flink sql 知其所以然(五)| 自定义 protobuf format](https://mp.weixin.qq.com/s/STUC4trW-HA3cnrsqT-N6g),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_05/format/formats)
8. [公众号文章:flink sql 知其所以然(六)| flink sql 约会 calcite(看这篇就够了)](https://mp.weixin.qq.com/s/SxRKp368mYSKVmuduPoXFg),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_06/calcite)
9. [公众号文章:flink sql 知其所以然(七):不会连最适合 flink sql 的 ETL 和 group agg 场景都没见过吧?](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_07/query)
10. [公众号文章:flink sql 知其所以然(八):flink sql tumble window 的奇妙解析之路](https://mp.weixin.qq.com/s/IRmt8dWmxAmbBh696akHdw),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_07/query/_04_window)
11. [公众号文章:flink sql 知其所以然(九):window tvf tumble window 的奇思妙解](https://mp.weixin.qq.com/s/QVuu5_N4lHo5gXlt1tdncw),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_07/query/_04_window_agg/_01_tumble_window)
12. [公众号文章:flink sql 知其所以然(十):大家都用 cumulate window 啦](https://mp.weixin.qq.com/s/IqAzjrQmcGmnxvHm1FAV5g),[源码](https://github.com/yangyichao-mango/flink-study/blob/main/flink-examples-1.13/src/main/java/flink/examples/sql/_07/query/_04_window_agg/_02_cumulate_window/CumulateWindowTest.java)
13. [公众号文章:flink sql 知其所以然(十一):去重不仅仅有 count distinct 还有强大的 deduplication](https://mp.weixin.qq.com/s/VL6egD76B4J7IcpHShTq7Q),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_07/query/_05_over/_01_row_number)
14. [公众号文章:flink sql 知其所以然(十二):流 join 很难嘛???(上)](https://mp.weixin.qq.com/s/Z8QfKfhrX5KEnR-s7gRtsA),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_07/query/_06_joins/_01_regular_joins)
15. [公众号文章:flink sql 知其所以然(十三):流 join 很难嘛???(下)](),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_07/query/_06_joins/_02_interval_joins)
16. [公众号文章:flink sql 知其所以然(十四):维表 join 的性能优化之路(上)附源码](),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_07/query/_06_joins/_04_lookup_join/_01_redis)
17. [公众号文章:flink sql 知其所以然(十五):改了改源码,实现了个 batch lookup join(附源码)](),[源码](https://github.com/yangyichao-mango/flink-study/blob/main/flink-examples-1.13/src/main/java/flink/examples/sql/_07/query/_06_joins/_04_lookup_join/_01_redis/RedisBatchLookupTest2.java)
18. [公众号文章:flink sql 知其所以然(十八):在 flink 中怎么使用 hive udf?附源码](),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_09/udf/_02_stream_hive_udf)
19. [公众号文章:flink sql 知其所以然(十九):Table 与 DataStream 的转转转(附源码)](),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql/_07/query/_08_datastream_trans)
20. [公众号文章:(上)史上最全干货!Flink SQL 成神之路(全文 18 万字、138 个案例、42 张图)](),[源码](https://github.com/yangyichao-mango/flink-study/blob/main/flink-examples-1.13/src/main/java/flink/examples/sql)
21. [公众号文章:(中)史上最全干货!Flink SQL 成神之路(全文 18 万字、138 个案例、42 张图)](),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql)
22. [公众号文章:(下)史上最全干货!Flink SQL 成神之路(全文 18 万字、138 个案例、42 张图)](),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/sql)
## 2.2.flink 实战
1. [公众号文章:揭秘字节跳动埋点数据实时动态处理引擎(附源码)](https://mp.weixin.qq.com/s/PoK0XOA9OHIDJezb1fLOMw),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split)
2. [公众号文章:踩坑记| flink state 序列化 java enum 竟然岔劈了](https://mp.weixin.qq.com/s/YElwTL-wzo2UVVIsIH_9YA),[源码](https://github.com/yangyichao-mango/flink-study/tree/main/flink-examples-1.13/src/main/java/flink/examples/datastream/_03/enums_state)
3. [公众号文章:flink idea 本地调试状态恢复](https://mp.weixin.qq.com/s/rLeKY_49q8rR9C_RmlTmhg),[源码](https://github.com/yangyichao-mango/flink-study/blob/main/flink-examples-1.13/src/main/java/flink/examples/runtime/_04/statebackend/CancelAndRestoreWithCheckpointTest.java)
# 3.联系我
## 3.1.微信
有任何学习上的疑惑都欢迎添加作者的微信,一起学习,一起交流!

## 3.2.公众号
如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号:**大数据羊说**

================================================
FILE: flink-examples-1.10/pom.xml
================================================
flink-study
com.github.antigeneral
1.0-SNAPSHOT
4.0.0
com.github.antigeneral
flink-examples-1.10
kr.motd.maven
os-maven-plugin
${os-maven-plugin.version}
org.apache.maven.plugins
maven-compiler-plugin
8
8
org.xolstice.maven.plugins
protobuf-maven-plugin
${protobuf-maven-plugin.version}
src/test/proto
com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}
grpc-java
io.grpc:protoc-gen-grpc-java:${grpc-plugin.version}:exe:${os.detected.classifier}
compile
compile-custom
1.10.1
1.18.20
2.11
2.4.12.Final
2.12.0
2.1.1
2.5.7
2.2.4
30.1.1-jre
2.0.0
1.2.3
1.8.0-beta2
1.23.1
0.6.1
3.11.0
2.5
1.6.2
================================================
FILE: flink-examples-1.10/src/main/java/flink/examples/sql/_07/query/_06_joins/_02_interval_joins/_01_outer_join/WindowJoinFunction$46.java
================================================
package flink.examples.sql._07.query._06_joins._02_interval_joins._01_outer_join;
public class WindowJoinFunction$46
extends org.apache.flink.api.common.functions.RichFlatJoinFunction {
final org.apache.flink.table.dataformat.JoinedRow joinedRow = new org.apache.flink.table.dataformat.JoinedRow();
public WindowJoinFunction$46(Object[] references) throws Exception {
}
@Override
public void open(org.apache.flink.configuration.Configuration parameters) throws Exception {
}
@Override
public void join(Object _in1, Object _in2, org.apache.flink.util.Collector c) throws Exception {
org.apache.flink.table.dataformat.BaseRow in1 = (org.apache.flink.table.dataformat.BaseRow) _in1;
org.apache.flink.table.dataformat.BaseRow in2 = (org.apache.flink.table.dataformat.BaseRow) _in2;
int result$40;
boolean isNull$40;
int field$41;
boolean isNull$41;
int result$42;
boolean isNull$42;
int field$43;
boolean isNull$43;
boolean isNull$44;
boolean result$45;
result$40 = -1;
isNull$40 = true;
if (in1 != null) {
isNull$41 = in1.isNullAt(0);
field$41 = -1;
if (!isNull$41) {
field$41 = in1.getInt(0);
}
result$40 = field$41;
isNull$40 = isNull$41;
}
result$42 = -1;
isNull$42 = true;
if (in2 != null) {
isNull$43 = in2.isNullAt(0);
field$43 = -1;
if (!isNull$43) {
field$43 = in2.getInt(0);
}
result$42 = field$43;
isNull$42 = isNull$43;
}
isNull$44 = isNull$40 || isNull$42;
result$45 = false;
if (!isNull$44) {
result$45 = result$40 == result$42;
}
if (result$45) {
joinedRow.replace(in1, in2);
c.collect(joinedRow);
}
}
@Override
public void close() throws Exception {
}
}
================================================
FILE: flink-examples-1.10/src/main/java/flink/examples/sql/_07/query/_06_joins/_02_interval_joins/_01_outer_join/_06_Interval_Outer_Joins_EventTime_Test.java
================================================
package flink.examples.sql._07.query._06_joins._02_interval_joins._01_outer_join;
import java.util.concurrent.TimeUnit;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.java.typeutils.ResultTypeQueryable;
import org.apache.flink.api.java.typeutils.RowTypeInfo;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.CheckpointingMode;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.CheckpointConfig;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.java.StreamTableEnvironment;
import org.apache.flink.types.Row;
public class _06_Interval_Outer_Joins_EventTime_Test {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env =
StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
ParameterTool parameterTool = ParameterTool.fromArgs(args);
env.setRestartStrategy(RestartStrategies.failureRateRestart(6, org.apache.flink.api.common.time.Time
.of(10L, TimeUnit.MINUTES), org.apache.flink.api.common.time.Time.of(5L, TimeUnit.SECONDS)));
env.getConfig().setGlobalJobParameters(parameterTool);
env.setParallelism(10);
// ck 设置
env.getCheckpointConfig().setFailOnCheckpointingErrors(false);
env.enableCheckpointing(30 * 1000L, CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(3L);
env.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
EnvironmentSettings settings = EnvironmentSettings
.newInstance()
.useBlinkPlanner()
.inStreamingMode().build();
StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, settings);
tEnv.getConfig().getConfiguration().setString("pipeline.name", "1.10.1 Interval Join 事件时间案例");
DataStream sourceTable = env.addSource(new UserDefinedSource1())
.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor(Time.minutes(0L)) {
@Override
public long extractTimestamp(Row row) {
return (long) row.getField(2);
}
});
tEnv.createTemporaryView("source_table", sourceTable, "user_id, name, timestamp, rowtime.rowtime");
DataStream dimTable = env.addSource(new UserDefinedSource2())
.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor(Time.minutes(0L)) {
@Override
public long extractTimestamp(Row row) {
return (long) row.getField(2);
}
});
tEnv.createTemporaryView("dim_table", dimTable, "user_id, platform, timestamp, rowtime.rowtime");
String sql = "SELECT\n"
+ " s.user_id as user_id,\n"
+ " s.name as name,\n"
+ " d.platform as platform\n"
+ "FROM source_table as s\n"
+ "FULL JOIN dim_table as d ON s.user_id = d.user_id\n"
+ "AND s.rowtime BETWEEN d.rowtime AND d.rowtime + INTERVAL '30' SECOND";
/**
* join 算子:{@link org.apache.flink.table.runtime.operators.join.KeyedCoProcessOperatorWithWatermarkDelay}
* -> {@link org.apache.flink.table.runtime.operators.join.RowTimeBoundedStreamJoin}
*/
Table result = tEnv.sqlQuery(sql);
tEnv.toAppendStream(result, Row.class)
.print();
env.execute("1.10.1 Interval Full Join 事件时间案例");
}
private static class UserDefinedSource1 implements SourceFunction, ResultTypeQueryable {
private volatile boolean isCancel;
@Override
public void run(SourceContext sourceContext) throws Exception {
int i = 0;
while (!this.isCancel) {
Row row = new Row(3);
row.setField(0, i);
row.setField(1, "name");
long timestamp = System.currentTimeMillis();
row.setField(2, timestamp);
sourceContext.collect(row);
Thread.sleep(1000L);
i++;
}
}
@Override
public void cancel() {
this.isCancel = true;
}
@Override
public TypeInformation getProducedType() {
return new RowTypeInfo(BasicTypeInfo.INT_TYPE_INFO, BasicTypeInfo.STRING_TYPE_INFO, BasicTypeInfo.LONG_TYPE_INFO);
}
}
private static class UserDefinedSource2 implements SourceFunction, ResultTypeQueryable {
private volatile boolean isCancel;
@Override
public void run(SourceContext sourceContext) throws Exception {
int i = 10;
while (!this.isCancel) {
Row row = new Row(3);
row.setField(0, i);
row.setField(1, "platform");
long timestamp = System.currentTimeMillis();
row.setField(2, timestamp);
sourceContext.collect(row);
Thread.sleep(1000L);
i++;
}
}
@Override
public void cancel() {
this.isCancel = true;
}
@Override
public TypeInformation getProducedType() {
return new RowTypeInfo(BasicTypeInfo.INT_TYPE_INFO, BasicTypeInfo.STRING_TYPE_INFO, BasicTypeInfo.LONG_TYPE_INFO);
}
}
}
================================================
FILE: flink-examples-1.12/.gitignore
================================================
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
#**/src/test/**
.idea/
*.iml
*.DS_Store
### IntelliJ IDEA ###
.idea
*.iws
*.ipr
================================================
FILE: flink-examples-1.12/pom.xml
================================================
flink-study
com.github.antigeneral
1.0-SNAPSHOT
4.0.0
com.github.antigeneral
flink-examples-1.12
================================================
FILE: flink-examples-1.12/src/main/java/flink/examples/datastream/_07/query/_04_window/_04_TumbleWindowTest.java
================================================
package flink.examples.datastream._07.query._04_window;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple4;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor;
import org.apache.flink.streaming.api.windowing.assigners.TumblingEventTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time;
public class _04_TumbleWindowTest {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env =
StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
env.setParallelism(1);
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
env.addSource(new UserDefinedSource())
.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor>(Time.seconds(0)) {
@Override
public long extractTimestamp(Tuple4 element) {
return element.f3;
}
})
.keyBy(new KeySelector, String>() {
@Override
public String getKey(Tuple4 row) throws Exception {
return row.f0;
}
})
.window(TumblingEventTimeWindows.of(Time.seconds(10)))
.sum(2)
.print();
env.execute("1.12.1 DataStream TUMBLE WINDOW 案例");
}
private static class UserDefinedSource implements SourceFunction> {
private volatile boolean isCancel;
@Override
public void run(SourceContext> sourceContext) throws Exception {
while (!this.isCancel) {
sourceContext.collect(Tuple4.of("a", "b", 1, System.currentTimeMillis()));
Thread.sleep(10L);
}
}
@Override
public void cancel() {
this.isCancel = true;
}
}
}
================================================
FILE: flink-examples-1.12/src/main/java/flink/examples/sql/_07/query/_04_window_agg/_04_TumbleWindowTest.java
================================================
package flink.examples.sql._07.query._04_window_agg;
import java.util.concurrent.TimeUnit;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.CheckpointingMode;
import org.apache.flink.streaming.api.environment.CheckpointConfig;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
public class _04_TumbleWindowTest {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env =
StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
ParameterTool parameterTool = ParameterTool.fromArgs(args);
env.setRestartStrategy(RestartStrategies.failureRateRestart(6, org.apache.flink.api.common.time.Time
.of(10L, TimeUnit.MINUTES), org.apache.flink.api.common.time.Time.of(5L, TimeUnit.SECONDS)));
env.getConfig().setGlobalJobParameters(parameterTool);
env.setParallelism(1);
// ck 设置
env.getCheckpointConfig().setFailOnCheckpointingErrors(false);
env.enableCheckpointing(30 * 1000L, CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(3L);
env.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
EnvironmentSettings settings = EnvironmentSettings
.newInstance()
.useBlinkPlanner()
.inStreamingMode().build();
StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, settings);
String sourceSql = "CREATE TABLE source_table (\n"
+ " dim STRING,\n"
+ " user_id BIGINT,\n"
+ " price BIGINT,\n"
+ " row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),\n"
+ " WATERMARK FOR row_time AS row_time - INTERVAL '5' SECOND\n"
+ ") WITH (\n"
+ " 'connector' = 'datagen',\n"
+ " 'rows-per-second' = '10',\n"
+ " 'fields.dim.length' = '1',\n"
+ " 'fields.user_id.min' = '1',\n"
+ " 'fields.user_id.max' = '100000',\n"
+ " 'fields.price.min' = '1',\n"
+ " 'fields.price.max' = '100000'\n"
+ ")";
String sinkSql = "CREATE TABLE sink_table (\n"
+ " dim STRING,\n"
+ " pv BIGINT,\n"
+ " sum_price BIGINT,\n"
+ " max_price BIGINT,\n"
+ " min_price BIGINT,\n"
+ " uv BIGINT,\n"
+ " window_start bigint\n"
+ ") WITH (\n"
+ " 'connector' = 'print'\n"
+ ")";
String selectWhereSql = "insert into sink_table\n"
+ "select dim,\n"
+ " sum(bucket_pv) as pv,\n"
+ " sum(bucket_sum_price) as sum_price,\n"
+ " max(bucket_max_price) as max_price,\n"
+ " min(bucket_min_price) as min_price,\n"
+ " sum(bucket_uv) as uv,\n"
+ " max(window_start) as window_start\n"
+ "from (\n"
+ " select dim,\n"
+ " count(*) as bucket_pv,\n"
+ " sum(price) as bucket_sum_price,\n"
+ " max(price) as bucket_max_price,\n"
+ " min(price) as bucket_min_price,\n"
+ " count(distinct user_id) as bucket_uv,\n"
+ " cast(tumble_start(row_time, interval '1' minute) as bigint) * 1000 as window_start\n"
+ " from source_table\n"
+ " group by\n"
+ " mod(user_id, 1024),\n"
+ " dim,\n"
+ " tumble(row_time, interval '1' minute)\n"
+ ")\n"
+ "group by dim,\n"
+ " window_start";
tEnv.getConfig().getConfiguration().setString("pipeline.name", "1.12.1 TUMBLE WINDOW 案例");
tEnv.executeSql(sourceSql);
tEnv.executeSql(sinkSql);
tEnv.executeSql(selectWhereSql);
}
}
================================================
FILE: flink-examples-1.12/src/main/java/flink/examples/sql/_07/query/_04_window_agg/_04_TumbleWindowTest_GroupingWindowAggsHandler$59.java
================================================
package flink.examples.sql._07.query._04_window_agg;
public final class _04_TumbleWindowTest_GroupingWindowAggsHandler$59 implements
org.apache.flink.table.runtime.generated.NamespaceAggsHandleFunction {
long agg0_count1;
boolean agg0_count1IsNull;
long agg1_sum;
boolean agg1_sumIsNull;
long agg2_max;
boolean agg2_maxIsNull;
long agg3_min;
boolean agg3_minIsNull;
long agg4_count;
boolean agg4_countIsNull;
private transient org.apache.flink.table.runtime.typeutils.ExternalSerializer externalSerializer$22;
private transient org.apache.flink.table.runtime.typeutils.ExternalSerializer externalSerializer$23;
private org.apache.flink.table.runtime.dataview.StateMapView distinctAcc_0_dataview;
private org.apache.flink.table.data.binary.BinaryRawValueData distinctAcc_0_dataview_raw_value;
private org.apache.flink.table.api.dataview.MapView distinct_view_0;
org.apache.flink.table.data.GenericRowData acc$25 = new org.apache.flink.table.data.GenericRowData(6);
org.apache.flink.table.data.GenericRowData acc$27 = new org.apache.flink.table.data.GenericRowData(6);
org.apache.flink.table.data.GenericRowData aggValue$58 = new org.apache.flink.table.data.GenericRowData(9);
private org.apache.flink.table.runtime.dataview.StateDataViewStore store;
private org.apache.flink.table.runtime.operators.window.TimeWindow namespace;
public _04_TumbleWindowTest_GroupingWindowAggsHandler$59(Object[] references) throws Exception {
externalSerializer$22 = (((org.apache.flink.table.runtime.typeutils.ExternalSerializer) references[0]));
externalSerializer$23 = (((org.apache.flink.table.runtime.typeutils.ExternalSerializer) references[1]));
}
private org.apache.flink.api.common.functions.RuntimeContext getRuntimeContext() {
return store.getRuntimeContext();
}
@Override
public void open(org.apache.flink.table.runtime.dataview.StateDataViewStore store) throws Exception {
this.store = store;
distinctAcc_0_dataview = (org.apache.flink.table.runtime.dataview.StateMapView) store
.getStateMapView("distinctAcc_0", true, externalSerializer$22, externalSerializer$23);
distinctAcc_0_dataview_raw_value =
org.apache.flink.table.data.binary.BinaryRawValueData.fromObject(distinctAcc_0_dataview);
distinct_view_0 = distinctAcc_0_dataview;
}
@Override
public void accumulate(org.apache.flink.table.data.RowData accInput) throws Exception {
boolean isNull$34;
long result$35;
long field$36;
boolean isNull$36;
boolean isNull$37;
long result$38;
boolean isNull$41;
boolean result$42;
boolean isNull$46;
boolean result$47;
long field$51;
boolean isNull$51;
boolean isNull$53;
long result$54;
isNull$51 = accInput.isNullAt(4);
field$51 = -1L;
if (!isNull$51) {
field$51 = accInput.getLong(4);
}
isNull$36 = accInput.isNullAt(3);
field$36 = -1L;
if (!isNull$36) {
field$36 = accInput.getLong(3);
}
isNull$34 = agg0_count1IsNull || false;
result$35 = -1L;
if (!isNull$34) {
result$35 = (long) (agg0_count1 + ((long) 1L));
}
agg0_count1 = result$35;
;
agg0_count1IsNull = isNull$34;
long result$40 = -1L;
boolean isNull$40;
if (isNull$36) {
isNull$40 = agg1_sumIsNull;
if (!isNull$40) {
result$40 = agg1_sum;
}
} else {
long result$39 = -1L;
boolean isNull$39;
if (agg1_sumIsNull) {
isNull$39 = isNull$36;
if (!isNull$39) {
result$39 = field$36;
}
} else {
isNull$37 = agg1_sumIsNull || isNull$36;
result$38 = -1L;
if (!isNull$37) {
result$38 = (long) (agg1_sum + field$36);
}
isNull$39 = isNull$37;
if (!isNull$39) {
result$39 = result$38;
}
}
isNull$40 = isNull$39;
if (!isNull$40) {
result$40 = result$39;
}
}
agg1_sum = result$40;
;
agg1_sumIsNull = isNull$40;
long result$45 = -1L;
boolean isNull$45;
if (isNull$36) {
isNull$45 = agg2_maxIsNull;
if (!isNull$45) {
result$45 = agg2_max;
}
} else {
long result$44 = -1L;
boolean isNull$44;
if (agg2_maxIsNull) {
isNull$44 = isNull$36;
if (!isNull$44) {
result$44 = field$36;
}
} else {
isNull$41 = isNull$36 || agg2_maxIsNull;
result$42 = false;
if (!isNull$41) {
result$42 = field$36 > agg2_max;
}
long result$43 = -1L;
boolean isNull$43;
if (result$42) {
isNull$43 = isNull$36;
if (!isNull$43) {
result$43 = field$36;
}
} else {
isNull$43 = agg2_maxIsNull;
if (!isNull$43) {
result$43 = agg2_max;
}
}
isNull$44 = isNull$43;
if (!isNull$44) {
result$44 = result$43;
}
}
isNull$45 = isNull$44;
if (!isNull$45) {
result$45 = result$44;
}
}
agg2_max = result$45;
;
agg2_maxIsNull = isNull$45;
long result$50 = -1L;
boolean isNull$50;
if (isNull$36) {
isNull$50 = agg3_minIsNull;
if (!isNull$50) {
result$50 = agg3_min;
}
} else {
long result$49 = -1L;
boolean isNull$49;
if (agg3_minIsNull) {
isNull$49 = isNull$36;
if (!isNull$49) {
result$49 = field$36;
}
} else {
isNull$46 = isNull$36 || agg3_minIsNull;
result$47 = false;
if (!isNull$46) {
result$47 = field$36 < agg3_min;
}
long result$48 = -1L;
boolean isNull$48;
if (result$47) {
isNull$48 = isNull$36;
if (!isNull$48) {
result$48 = field$36;
}
} else {
isNull$48 = agg3_minIsNull;
if (!isNull$48) {
result$48 = agg3_min;
}
}
isNull$49 = isNull$48;
if (!isNull$49) {
result$49 = result$48;
}
}
isNull$50 = isNull$49;
if (!isNull$50) {
result$50 = result$49;
}
}
agg3_min = result$50;
;
agg3_minIsNull = isNull$50;
Long distinctKey$52 = (Long) field$51;
if (isNull$51) {
distinctKey$52 = null;
}
Long value$56 = (Long) distinct_view_0.get(distinctKey$52);
if (value$56 == null) {
value$56 = 0L;
}
boolean is_distinct_value_changed_0 = false;
long existed$57 = ((long) value$56) & (1L << 0);
if (existed$57 == 0) { // not existed
value$56 = ((long) value$56) | (1L << 0);
is_distinct_value_changed_0 = true;
long result$55 = -1L;
boolean isNull$55;
if (isNull$51) {
isNull$55 = agg4_countIsNull;
if (!isNull$55) {
result$55 = agg4_count;
}
} else {
isNull$53 = agg4_countIsNull || false;
result$54 = -1L;
if (!isNull$53) {
result$54 = (long) (agg4_count + ((long) 1L));
}
isNull$55 = isNull$53;
if (!isNull$55) {
result$55 = result$54;
}
}
agg4_count = result$55;
;
agg4_countIsNull = isNull$55;
}
if (is_distinct_value_changed_0) {
distinct_view_0.put(distinctKey$52, value$56);
}
}
@Override
public void retract(org.apache.flink.table.data.RowData retractInput) throws Exception {
throw new RuntimeException(
"This function not require retract method, but the retract method is called.");
}
@Override
public void merge(org.apache.flink.table.runtime.operators.window.TimeWindow ns,
org.apache.flink.table.data.RowData otherAcc) throws Exception {
namespace = (org.apache.flink.table.runtime.operators.window.TimeWindow) ns;
throw new RuntimeException("This function not require merge method, but the merge method is called.");
}
@Override
public void setAccumulators(org.apache.flink.table.runtime.operators.window.TimeWindow ns,
org.apache.flink.table.data.RowData acc)
throws Exception {
namespace = (org.apache.flink.table.runtime.operators.window.TimeWindow) ns;
long field$28;
boolean isNull$28;
long field$29;
boolean isNull$29;
long field$30;
boolean isNull$30;
long field$31;
boolean isNull$31;
long field$32;
boolean isNull$32;
org.apache.flink.table.data.binary.BinaryRawValueData field$33;
boolean isNull$33;
isNull$32 = acc.isNullAt(4);
field$32 = -1L;
if (!isNull$32) {
field$32 = acc.getLong(4);
}
isNull$28 = acc.isNullAt(0);
field$28 = -1L;
if (!isNull$28) {
field$28 = acc.getLong(0);
}
isNull$29 = acc.isNullAt(1);
field$29 = -1L;
if (!isNull$29) {
field$29 = acc.getLong(1);
}
isNull$31 = acc.isNullAt(3);
field$31 = -1L;
if (!isNull$31) {
field$31 = acc.getLong(3);
}
// when namespace is null, the dataview is used in heap, no key and namespace set
if (namespace != null) {
distinctAcc_0_dataview.setCurrentNamespace(namespace);
distinct_view_0 = distinctAcc_0_dataview;
} else {
isNull$33 = acc.isNullAt(5);
field$33 = null;
if (!isNull$33) {
field$33 = ((org.apache.flink.table.data.binary.BinaryRawValueData) acc.getRawValue(5));
}
distinct_view_0 = (org.apache.flink.table.api.dataview.MapView) field$33.getJavaObject();
}
isNull$30 = acc.isNullAt(2);
field$30 = -1L;
if (!isNull$30) {
field$30 = acc.getLong(2);
}
agg0_count1 = field$28;
;
agg0_count1IsNull = isNull$28;
agg1_sum = field$29;
;
agg1_sumIsNull = isNull$29;
agg2_max = field$30;
;
agg2_maxIsNull = isNull$30;
agg3_min = field$31;
;
agg3_minIsNull = isNull$31;
agg4_count = field$32;
;
agg4_countIsNull = isNull$32;
}
@Override
public org.apache.flink.table.data.RowData getAccumulators() throws Exception {
acc$27 = new org.apache.flink.table.data.GenericRowData(6);
if (agg0_count1IsNull) {
acc$27.setField(0, null);
} else {
acc$27.setField(0, agg0_count1);
}
if (agg1_sumIsNull) {
acc$27.setField(1, null);
} else {
acc$27.setField(1, agg1_sum);
}
if (agg2_maxIsNull) {
acc$27.setField(2, null);
} else {
acc$27.setField(2, agg2_max);
}
if (agg3_minIsNull) {
acc$27.setField(3, null);
} else {
acc$27.setField(3, agg3_min);
}
if (agg4_countIsNull) {
acc$27.setField(4, null);
} else {
acc$27.setField(4, agg4_count);
}
org.apache.flink.table.data.binary.BinaryRawValueData distinct_acc$26 =
org.apache.flink.table.data.binary.BinaryRawValueData.fromObject(distinct_view_0);
if (false) {
acc$27.setField(5, null);
} else {
acc$27.setField(5, distinct_acc$26);
}
return acc$27;
}
@Override
public org.apache.flink.table.data.RowData createAccumulators() throws Exception {
acc$25 = new org.apache.flink.table.data.GenericRowData(6);
if (false) {
acc$25.setField(0, null);
} else {
acc$25.setField(0, ((long) 0L));
}
if (true) {
acc$25.setField(1, null);
} else {
acc$25.setField(1, ((long) -1L));
}
if (true) {
acc$25.setField(2, null);
} else {
acc$25.setField(2, ((long) -1L));
}
if (true) {
acc$25.setField(3, null);
} else {
acc$25.setField(3, ((long) -1L));
}
if (false) {
acc$25.setField(4, null);
} else {
acc$25.setField(4, ((long) 0L));
}
org.apache.flink.table.api.dataview.MapView mapview$24 = new org.apache.flink.table.api.dataview.MapView();
org.apache.flink.table.data.binary.BinaryRawValueData distinct_acc$24 =
org.apache.flink.table.data.binary.BinaryRawValueData.fromObject(mapview$24);
if (false) {
acc$25.setField(5, null);
} else {
acc$25.setField(5, distinct_acc$24);
}
return acc$25;
}
@Override
public org.apache.flink.table.data.RowData getValue(org.apache.flink.table.runtime.operators.window.TimeWindow ns)
throws Exception {
namespace = (org.apache.flink.table.runtime.operators.window.TimeWindow) ns;
aggValue$58 = new org.apache.flink.table.data.GenericRowData(9);
if (agg0_count1IsNull) {
aggValue$58.setField(0, null);
} else {
aggValue$58.setField(0, agg0_count1);
}
if (agg1_sumIsNull) {
aggValue$58.setField(1, null);
} else {
aggValue$58.setField(1, agg1_sum);
}
if (agg2_maxIsNull) {
aggValue$58.setField(2, null);
} else {
aggValue$58.setField(2, agg2_max);
}
if (agg3_minIsNull) {
aggValue$58.setField(3, null);
} else {
aggValue$58.setField(3, agg3_min);
}
if (agg4_countIsNull) {
aggValue$58.setField(4, null);
} else {
aggValue$58.setField(4, agg4_count);
}
if (false) {
aggValue$58.setField(5, null);
} else {
aggValue$58.setField(5, org.apache.flink.table.data.TimestampData.fromEpochMillis(namespace.getStart()));
}
if (false) {
aggValue$58.setField(6, null);
} else {
aggValue$58.setField(6, org.apache.flink.table.data.TimestampData.fromEpochMillis(namespace.getEnd()));
}
if (false) {
aggValue$58.setField(7, null);
} else {
aggValue$58.setField(7, org.apache.flink.table.data.TimestampData.fromEpochMillis(namespace.getEnd() - 1));
}
if (true) {
aggValue$58.setField(8, null);
} else {
aggValue$58.setField(8, org.apache.flink.table.data.TimestampData.fromEpochMillis(-1L));
}
return aggValue$58;
}
@Override
public void cleanup(org.apache.flink.table.runtime.operators.window.TimeWindow ns) throws Exception {
namespace = (org.apache.flink.table.runtime.operators.window.TimeWindow) ns;
distinctAcc_0_dataview.setCurrentNamespace(namespace);
distinctAcc_0_dataview.clear();
}
@Override
public void close() throws Exception {
}
}
================================================
FILE: flink-examples-1.12/src/main/java/flink/examples/sql/_07/query/_04_window_agg/_04_TumbleWindowTest_KeyProjection$69.java
================================================
package flink.examples.sql._07.query._04_window_agg;
public final class _04_TumbleWindowTest_KeyProjection$69 implements
org.apache.flink.table.runtime.generated.Projection {
org.apache.flink.table.data.binary.BinaryRowData out = new org.apache.flink.table.data.binary.BinaryRowData(2);
org.apache.flink.table.data.writer.BinaryRowWriter outWriter =
new org.apache.flink.table.data.writer.BinaryRowWriter(out);
public _04_TumbleWindowTest_KeyProjection$69(Object[] references) throws Exception {
}
@Override
public org.apache.flink.table.data.binary.BinaryRowData apply(org.apache.flink.table.data.RowData in1) {
int field$70;
boolean isNull$70;
org.apache.flink.table.data.binary.BinaryStringData field$71;
boolean isNull$71;
outWriter.reset();
isNull$70 = in1.isNullAt(0);
field$70 = -1;
if (!isNull$70) {
field$70 = in1.getInt(0);
}
if (isNull$70) {
outWriter.setNullAt(0);
} else {
outWriter.writeInt(0, field$70);
}
isNull$71 = in1.isNullAt(1);
field$71 = org.apache.flink.table.data.binary.BinaryStringData.EMPTY_UTF8;
if (!isNull$71) {
field$71 = ((org.apache.flink.table.data.binary.BinaryStringData) in1.getString(1));
}
if (isNull$71) {
outWriter.setNullAt(1);
} else {
outWriter.writeString(1, field$71);
}
outWriter.complete();
return out;
}
}
================================================
FILE: flink-examples-1.12/src/main/java/flink/examples/sql/_07/query/_04_window_agg/_04_TumbleWindowTest_WatermarkGenerator$6.java
================================================
package flink.examples.sql._07.query._04_window_agg;
public final class _04_TumbleWindowTest_WatermarkGenerator$6
extends org.apache.flink.table.runtime.generated.WatermarkGenerator {
public _04_TumbleWindowTest_WatermarkGenerator$6(Object[] references) throws Exception {
}
@Override
public void open(org.apache.flink.configuration.Configuration parameters) throws Exception {
}
@Override
public Long currentWatermark(org.apache.flink.table.data.RowData row) throws Exception {
org.apache.flink.table.data.TimestampData field$7;
boolean isNull$7;
boolean isNull$8;
org.apache.flink.table.data.TimestampData result$9;
isNull$7 = row.isNullAt(3);
field$7 = null;
if (!isNull$7) {
field$7 = row.getTimestamp(3, 3);
}
isNull$8 = isNull$7 || false;
result$9 = null;
if (!isNull$8) {
result$9 = org.apache.flink.table.data.TimestampData
.fromEpochMillis(field$7.getMillisecond() - ((long) 5000L), field$7.getNanoOfMillisecond());
}
if (isNull$8) {
return null;
} else {
return result$9.getMillisecond();
}
}
@Override
public void close() throws Exception {
}
}
================================================
FILE: flink-examples-1.13/.gitignore
================================================
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
#**/src/test/**
.idea/
*.iml
*.DS_Store
### IntelliJ IDEA ###
.idea
*.iws
*.ipr
================================================
FILE: flink-examples-1.13/pom.xml
================================================
flink-study
com.github.antigeneral
1.0-SNAPSHOT
4.0.0
com.github.antigeneral
flink-examples-1.13
kr.motd.maven
os-maven-plugin
${os-maven-plugin.version}
org.apache.maven.plugins
maven-compiler-plugin
org.xolstice.maven.plugins
protobuf-maven-plugin
com.google.protobuf
protobuf-java
org.apache.flink
flink-connector-hive_2.11
org.apache.hadoop
hadoop-common
3.1.0
compile
slf4j-log4j12
org.slf4j
commons-logging
commmons-logging
servlet-api
javax.servlet
true
org.apache.hive
hive-exec
log4j-slf4j-impl
org.apache.logging.log4j
guava
com.google.guava
org.apache.hadoop
hadoop-mapreduce-client-core
3.1.0
slf4j-log4j12
org.slf4j
jersey-client
com.sun.jersey
jersey-server
com.sun.jersey
jersey-servlet
com.sun.jersey
jersey-core
com.sun.jersey
jersey-json
com.sun.jersey
guava
com.google.guava
com.twitter
chill-protobuf
com.esotericsoftware.kryo
kryo
junit
junit
test
net.java.dev.javacc
javacc
org.apache.httpcomponents
httpclient
4.5.10
compile
org.apache.flink
flink-statebackend-rocksdb_2.11
${flink.version}
joda-time
joda-time
provided
true
com.github.rholder
guava-retrying
guava
com.google.guava
org.projectlombok
lombok
org.apache.flink
flink-java
${flink.version}
org.apache.flink
flink-streaming-java_2.11
${flink.version}
flink-shaded-zookeeper-3
org.apache.flink
flink-shaded-guava
org.apache.flink
org.apache.flink
flink-clients_2.11
${flink.version}
org.mvel
mvel2
redis.clients
jedis
org.apache.curator
curator-framework
org.apache.curator
curator-recipes
org.apache.kafka
kafka-clients
org.codehaus.groovy
groovy
org.codehaus.groovy
groovy-ant
org.codehaus.groovy
groovy-cli-commons
org.codehaus.groovy
groovy-cli-picocli
org.codehaus.groovy
groovy-console
org.codehaus.groovy
groovy-datetime
org.codehaus.groovy
groovy-docgenerator
org.codehaus.groovy
groovy-groovydoc
org.codehaus.groovy
groovy-groovysh
org.codehaus.groovy
groovy-jmx
org.codehaus.groovy
groovy-json
org.codehaus.groovy
groovy-jsr223
org.codehaus.groovy
groovy-macro
org.codehaus.groovy
groovy-nio
org.codehaus.groovy
groovy-servlet
org.codehaus.groovy
groovy-sql
org.codehaus.groovy
groovy-swing
org.codehaus.groovy
groovy-templates
org.codehaus.groovy
groovy-test
org.codehaus.groovy
groovy-test-junit5
org.codehaus.groovy
groovy-testng
org.codehaus.groovy
groovy-xml
org.apache.flink
flink-streaming-scala_2.11
${flink.version}
mysql
mysql-connector-java
${mysql.version}
com.google.code.gson
gson
org.apache.flink
flink-table-common
${flink.version}
compile
org.apache.flink
flink-table-api-java
${flink.version}
compile
org.apache.flink
flink-table-api-java-bridge_2.11
${flink.version}
compile
org.apache.flink
flink-table-planner-blink_2.11
${flink.version}
compile
org.apache.flink
flink-connector-jdbc_2.11
${flink.version}
org.apache.flink
flink-connector-hbase-2.2_2.11
${flink.version}
hbase-shaded-miscellaneous
org.apache.hbase.thirdparty
org.apache.flink
flink-json
${flink.version}
org.apache.bahir
flink-connector-redis_2.10
1.0
org.apache.flink
flink-connector-kafka_2.12
ch.qos.logback
logback-classic
compile
org.slf4j
slf4j-log4j12
org.apache.flink
flink-runtime-web_2.11
${flink.version}
com.fasterxml.jackson.core
jackson-databind
com.fasterxml.jackson.core
jackson-core
com.fasterxml.jackson.core
jackson-annotations
com.fasterxml.jackson.module
jackson-module-kotlin
com.fasterxml.jackson.module
jackson-module-parameter-names
com.fasterxml.jackson.datatype
jackson-datatype-guava
guava
com.google.guava
com.hubspot.jackson
jackson-datatype-protobuf
guava
com.google.guava
org.apache.calcite
calcite-core
guava
com.google.guava
com.google.guava
guava
================================================
FILE: flink-examples-1.13/src/main/java/flink/core/source/JaninoUtils.java
================================================
package flink.core.source;
import org.codehaus.janino.SimpleCompiler;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class JaninoUtils {
private static final SimpleCompiler COMPILER = new SimpleCompiler();
static {
COMPILER.setParentClassLoader(JaninoUtils.class.getClassLoader());
}
public static Class genClass(String className, String code, Class clazz) throws Exception {
COMPILER.cook(code);
System.out.println("生成的代码:\n" + code);
return (Class) COMPILER.getClassLoader().loadClass(className);
}
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/core/source/SourceFactory.java
================================================
package flink.core.source;
import java.io.IOException;
import org.apache.flink.api.common.serialization.DeserializationSchema;
import org.apache.flink.api.common.serialization.SerializationSchema;
import com.google.protobuf.GeneratedMessageV3;
import flink.examples.datastream._04.keyed_co_process.protobuf.Source;
import lombok.SneakyThrows;
public class SourceFactory {
public static SerializationSchema getProtobufSer(Class clazz) {
return new SerializationSchema() {
@Override
public byte[] serialize(Message element) {
return element.toByteArray();
}
};
}
@SneakyThrows
public static DeserializationSchema getProtobufDerse(Class clazz) {
String code = TEMPLATE.replaceAll("\\$\\{ProtobufClassName}", clazz.getName())
.replaceAll("\\$\\{SimpleProtobufName}", clazz.getSimpleName());
String className = clazz.getSimpleName() + "_DeserializationSchema";
Class deClass = JaninoUtils.genClass(className, code, DeserializationSchema.class);
return deClass.newInstance();
}
private static final String TEMPLATE =
"public class ${SimpleProtobufName}_DeserializationSchema extends org.apache.flink.api.common"
+ ".serialization.AbstractDeserializationSchema<${ProtobufClassName}> {\n"
+ "\n"
+ " public ${SimpleProtobufName}_DeserializationSchema() {\n"
+ " super(${ProtobufClassName}.class);\n"
+ " }\n"
+ "\n"
+ " @Override\n"
+ " public ${ProtobufClassName} deserialize(byte[] message) throws java.io.IOException {\n"
+ " return ${ProtobufClassName}.parseFrom(message);\n"
+ " }\n"
+ "}";
public static void main(String[] args) throws IOException {
System.out.println(SourceFactory.class.getName());
System.out.println(SourceFactory.class.getCanonicalName());
System.out.println(SourceFactory.class.getSimpleName());
System.out.println(SourceFactory.class.getTypeName());
DeserializationSchema ds = getProtobufDerse(Source.class);
Source s = Source.newBuilder()
.addNames("antigeneral")
.build();
Source s1 = ds.deserialize(s.toByteArray());
System.out.println();
}
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/FlinkEnvUtils.java
================================================
package flink.examples;
import java.io.IOException;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.contrib.streaming.state.PredefinedOptions;
import org.apache.flink.contrib.streaming.state.RocksDBStateBackend;
import org.apache.flink.runtime.state.StateBackend;
import org.apache.flink.runtime.state.filesystem.FsStateBackend;
import org.apache.flink.runtime.state.memory.MemoryStateBackend;
import org.apache.flink.streaming.api.CheckpointingMode;
import org.apache.flink.streaming.api.environment.CheckpointConfig;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.SqlDialect;
import org.apache.flink.table.api.TableEnvironment;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.table.catalog.hive.HiveCatalog;
import org.apache.flink.table.module.CoreModule;
import flink.examples.sql._08.batch._03_hive_udf.HiveModuleV2;
import lombok.Builder;
import lombok.Data;
public class FlinkEnvUtils {
private static final boolean ENABLE_INCREMENTAL_CHECKPOINT = true;
private static final int NUMBER_OF_TRANSFER_THREADS = 3;
/**
* 设置状态后端为 RocksDBStateBackend
*
* @param env env
*/
public static void setRocksDBStateBackend(StreamExecutionEnvironment env) throws IOException {
setCheckpointConfig(env);
RocksDBStateBackend rocksDBStateBackend = new RocksDBStateBackend(
"file:///Users/flink/checkpoints", ENABLE_INCREMENTAL_CHECKPOINT);
rocksDBStateBackend.setNumberOfTransferThreads(NUMBER_OF_TRANSFER_THREADS);
rocksDBStateBackend.setPredefinedOptions(PredefinedOptions.SPINNING_DISK_OPTIMIZED_HIGH_MEM);
env.setStateBackend((StateBackend) rocksDBStateBackend);
}
/**
* 设置状态后端为 FsStateBackend
*
* @param env env
*/
public static void setFsStateBackend(StreamExecutionEnvironment env) throws IOException {
setCheckpointConfig(env);
FsStateBackend fsStateBackend = new FsStateBackend("file:///Users/flink/checkpoints");
env.setStateBackend((StateBackend) fsStateBackend);
}
/**
* 设置状态后端为 MemoryStateBackend
*
* @param env env
*/
public static void setMemoryStateBackend(StreamExecutionEnvironment env) throws IOException {
setCheckpointConfig(env);
env.setStateBackend((StateBackend) new MemoryStateBackend());
}
/**
* Checkpoint 参数相关配置,but 不设置 StateBackend,即:读取 flink-conf.yaml 文件的配置
*
* @param env env
*/
public static void setCheckpointConfig(StreamExecutionEnvironment env) throws IOException {
env.getCheckpointConfig().setCheckpointTimeout(TimeUnit.MINUTES.toMillis(3));
// ck 设置
env.getCheckpointConfig().setFailOnCheckpointingErrors(false);
env.enableCheckpointing(180 * 1000L, CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(3L);
Configuration configuration = new Configuration();
configuration.setString("state.checkpoints.num-retained", "3");
env.configure(configuration, Thread.currentThread().getContextClassLoader());
env.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
}
public static FlinkEnv getStreamTableEnv(String[] args) throws IOException {
ParameterTool parameterTool = ParameterTool.fromArgs(args);
Configuration configuration = Configuration.fromMap(parameterTool.toMap());
configuration.setString("rest.flamegraph.enabled", "true");
StreamExecutionEnvironment env =
StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(configuration);
String stateBackend = parameterTool.get("state.backend", "rocksdb");
env.setParallelism(1);
if ("rocksdb".equals(stateBackend)) {
setRocksDBStateBackend(env);
} else if ("filesystem".equals(stateBackend)) {
setFsStateBackend(env);
} else if ("jobmanager".equals(stateBackend)) {
setMemoryStateBackend(env);
}
env.setRestartStrategy(RestartStrategies.failureRateRestart(6, org.apache.flink.api.common.time.Time
.of(10L, TimeUnit.MINUTES), org.apache.flink.api.common.time.Time.of(5L, TimeUnit.SECONDS)));
env.getConfig().setGlobalJobParameters(parameterTool);
EnvironmentSettings settings = EnvironmentSettings
.newInstance()
.useBlinkPlanner()
.inStreamingMode()
.build();
StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, settings);
tEnv.getConfig().addConfiguration(configuration);
FlinkEnv flinkEnv = FlinkEnv
.builder()
.streamExecutionEnvironment(env)
.streamTableEnvironment(tEnv)
.build();
initHiveEnv(flinkEnv, parameterTool);
return flinkEnv;
}
/**
* hadoop 启动:/usr/local/Cellar/hadoop/3.2.1/sbin/start-all.sh
* http://localhost:9870/
* http://localhost:8088/cluster
*
* hive 启动:$HIVE_HOME/bin/hive --service metastore &
* hive cli:$HIVE_HOME/bin/hive
*/
private static void initHiveEnv(FlinkEnv flinkEnv, ParameterTool parameterTool) {
String defaultDatabase = "default";
String hiveConfDir = "/usr/local/Cellar/hive/3.1.2/libexec/conf";
boolean enableHiveCatalog = parameterTool.getBoolean("enable.hive.catalog", false);
if (enableHiveCatalog) {
HiveCatalog hive = new HiveCatalog("default", defaultDatabase, hiveConfDir);
Optional.ofNullable(flinkEnv.streamTEnv())
.ifPresent(s -> s.registerCatalog("default", hive));
Optional.ofNullable(flinkEnv.batchTEnv())
.ifPresent(s -> s.registerCatalog("default", hive));
// set the HiveCatalog as the current catalog of the session
Optional.ofNullable(flinkEnv.streamTEnv())
.ifPresent(s -> s.useCatalog("default"));
Optional.ofNullable(flinkEnv.batchTEnv())
.ifPresent(s -> s.useCatalog("default"));
}
boolean enableHiveDialect = parameterTool.getBoolean("enable.hive.dialect", false);
if (enableHiveDialect) {
Optional.ofNullable(flinkEnv.streamTEnv())
.ifPresent(s -> s.getConfig().setSqlDialect(SqlDialect.HIVE));
Optional.ofNullable(flinkEnv.batchTEnv())
.ifPresent(s -> s.getConfig().setSqlDialect(SqlDialect.HIVE));
}
boolean enableHiveModuleV2 = parameterTool.getBoolean("enable.hive.module.v2", true);
if (enableHiveModuleV2) {
String version = "3.1.2";
HiveModuleV2 hiveModuleV2 = new HiveModuleV2(version);
final boolean enableHiveModuleLoadFirst = parameterTool.getBoolean("enable.hive.module.load-first", true);
Optional.ofNullable(flinkEnv.streamTEnv())
.ifPresent(s -> {
if (enableHiveModuleLoadFirst) {
s.unloadModule("core");
s.loadModule("default", hiveModuleV2);
s.loadModule("core", CoreModule.INSTANCE);
} else {
s.loadModule("default", hiveModuleV2);
}
});
Optional.ofNullable(flinkEnv.batchTEnv())
.ifPresent(s -> {
if (enableHiveModuleLoadFirst) {
s.unloadModule("core");
s.loadModule("default", hiveModuleV2);
s.loadModule("core", CoreModule.INSTANCE);
} else {
s.loadModule("default", hiveModuleV2);
}
});
flinkEnv.setHiveModuleV2(hiveModuleV2);
}
}
public static FlinkEnv getBatchTableEnv(String[] args) throws IOException {
StreamExecutionEnvironment env =
StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
ParameterTool parameterTool = ParameterTool.fromArgs(args);
env.setRestartStrategy(RestartStrategies.failureRateRestart(6, org.apache.flink.api.common.time.Time
.of(10L, TimeUnit.MINUTES), org.apache.flink.api.common.time.Time.of(5L, TimeUnit.SECONDS)));
env.getConfig().setGlobalJobParameters(parameterTool);
env.setParallelism(1);
// ck 设置
env.getCheckpointConfig().setFailOnCheckpointingErrors(false);
env.enableCheckpointing(30 * 1000L, CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(3L);
env.getCheckpointConfig()
.enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
EnvironmentSettings settings = EnvironmentSettings
.newInstance()
.useBlinkPlanner()
.inBatchMode()
.build();
TableEnvironment tEnv = TableEnvironment.create(settings);
FlinkEnv flinkEnv = FlinkEnv
.builder()
.streamExecutionEnvironment(env)
.tableEnvironment(tEnv)
.build();
initHiveEnv(flinkEnv, parameterTool);
return flinkEnv;
}
@Builder
@Data
public static class FlinkEnv {
private StreamExecutionEnvironment streamExecutionEnvironment;
private StreamTableEnvironment streamTableEnvironment;
private TableEnvironment tableEnvironment;
private HiveModuleV2 hiveModuleV2;
public StreamTableEnvironment streamTEnv() {
return this.streamTableEnvironment;
}
public TableEnvironment batchTEnv() {
return this.tableEnvironment;
}
public StreamExecutionEnvironment env() {
return this.streamExecutionEnvironment;
}
public HiveModuleV2 hiveModuleV2() {
return this.hiveModuleV2;
}
}
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/JacksonUtils.java
================================================
package flink.examples;
import static com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_COMMENTS;
import static com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS;
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hubspot.jackson.datatype.protobuf.ProtobufModule;
public class JacksonUtils {
private static ObjectMapper mapper = new ObjectMapper();
static {
mapper.registerModule(new ProtobufModule());
mapper.disable(FAIL_ON_UNKNOWN_PROPERTIES);
mapper.enable(ALLOW_UNQUOTED_CONTROL_CHARS);
mapper.enable(ALLOW_COMMENTS);
}
public static String bean2Json(Object data) {
try {
String result = mapper.writeValueAsString(data);
return result;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
public static T json2Bean(String jsonData, Class beanType) {
try {
T result = mapper.readValue(jsonData, beanType);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static List json2List(String jsonData, Class beanType) {
JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, beanType);
try {
List resultList = mapper.readValue(jsonData, javaType);
return resultList;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static Map json2Map(String jsonData, Class keyType, Class valueType) {
JavaType javaType = mapper.getTypeFactory().constructMapType(Map.class, keyType, valueType);
try {
Map resultMap = mapper.readValue(jsonData, javaType);
return resultMap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split/codegen/JaninoUtils.java
================================================
package flink.examples.datastream._01.bytedance.split.codegen;
import org.codehaus.janino.SimpleCompiler;
import flink.examples.datastream._01.bytedance.split.model.Evaluable;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class JaninoUtils {
private static final SimpleCompiler COMPILER = new SimpleCompiler();
static {
COMPILER.setParentClassLoader(JaninoUtils.class.getClassLoader());
}
public static Class genCodeAndGetClazz(Long id, String topic, String condition) throws Exception {
String className = "CodeGen_" + topic + "_" + id;
String code = "import org.apache.commons.lang3.ArrayUtils;\n"
+ "\n"
+ "public class " + className + " implements flink.examples.datastream._01.bytedance.split.model.Evaluable {\n"
+ " \n"
+ " @Override\n"
+ " public boolean eval(flink.examples.datastream._01.bytedance.split.model.ClientLogSource clientLogSource) {\n"
+ " \n"
+ " return " + condition + ";\n"
+ " }\n"
+ "}\n";
COMPILER.cook(code);
System.out.println("生成的代码:\n" + code);
return (Class) COMPILER.getClassLoader().loadClass(className);
}
public static void main(String[] args) throws Exception {
Class c = genCodeAndGetClazz(1L, "topic", "1==1");
System.out.println(1);
}
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split/codegen/benchmark/Benchmark.java
================================================
package flink.examples.datastream._01.bytedance.split.codegen.benchmark;
import org.codehaus.groovy.control.CompilerConfiguration;
import flink.examples.datastream._01.bytedance.split.model.ClientLogSource;
import flink.examples.datastream._01.bytedance.split.model.DynamicProducerRule;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Benchmark {
private static void benchmarkForJava() {
ClientLogSource s = ClientLogSource.builder().id(1).build();
long start2 = System.currentTimeMillis();
for (int i = 0; i < 50000000; i++) {
boolean b = String.valueOf(s.getId()).equals("1");
}
long end2 = System.currentTimeMillis();
System.out.println("java:" + (end2 - start2) + " ms");
}
public static void benchmarkForGroovyClassLoader() {
CompilerConfiguration config = new CompilerConfiguration();
config.setSourceEncoding("UTF-8");
// 设置该GroovyClassLoader的父ClassLoader为当前线程的加载器(默认)
GroovyClassLoader groovyClassLoader =
new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), config);
String groovyCode = "class demo_002 {\n"
+ " boolean eval(flink.examples.datastream._01.bytedance.split.model.SourceModel sourceModel) {\n"
+ " return String.valueOf(sourceModel.getId()).equals(\"1\");\n"
+ " }\n"
+ "}";
try {
// 获得GroovyShell_2加载后的class
Class> groovyClass = groovyClassLoader.parseClass(groovyCode);
// 获得GroovyShell_2的实例
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
ClientLogSource s = ClientLogSource.builder().id(1).build();
long start1 = System.currentTimeMillis();
for (int i = 0; i < 50000000; i++) {
Object methodResult = groovyObject.invokeMethod("eval", s);
}
long end1 = System.currentTimeMillis();
System.out.println("groovy:" + (end1 - start1) + " ms");
} catch (Exception e) {
e.getStackTrace();
}
}
public static void benchmarkForJanino() {
String condition = "String.valueOf(sourceModel.getId()).equals(\"1\")";
DynamicProducerRule dynamicProducerRule = DynamicProducerRule
.builder()
.condition(condition)
.targetTopic("t")
.build();
dynamicProducerRule.init(1L);
ClientLogSource s = ClientLogSource.builder().id(1).build();
long start2 = System.currentTimeMillis();
for (int i = 0; i < 50000000; i++) {
boolean b = dynamicProducerRule.eval(s);
}
long end2 = System.currentTimeMillis();
System.out.println("janino:" + (end2 - start2) + " ms");
}
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
benchmarkForJava();
// janino
benchmarkForJanino();
// groovy classloader
benchmarkForGroovyClassLoader();
System.out.println();
}
}
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split/job/SplitExampleJob.java
================================================
package flink.examples.datastream._01.bytedance.split.job;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;
import org.apache.commons.lang3.RandomUtils;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.CheckpointingMode;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.environment.CheckpointConfig;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.ProcessFunction;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import org.apache.flink.util.Collector;
import flink.examples.datastream._01.bytedance.split.kafka.KafkaProducerCenter;
import flink.examples.datastream._01.bytedance.split.model.ClientLogSink;
import flink.examples.datastream._01.bytedance.split.model.ClientLogSource;
import flink.examples.datastream._01.bytedance.split.model.DynamicProducerRule;
import flink.examples.datastream._01.bytedance.split.zkconfigcenter.ZkBasedConfigCenter;
/**
* zk:https://www.jianshu.com/p/5491d16e6abd
* kafka:https://www.jianshu.com/p/dd2578d47ff6
*/
public class SplitExampleJob {
public static void main(String[] args) throws Exception {
ParameterTool parameters = ParameterTool.fromArgs(args);
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 其他参数设置
env.setRestartStrategy(RestartStrategies.failureRateRestart(6, org.apache.flink.api.common.time.Time
.of(10L, TimeUnit.MINUTES), org.apache.flink.api.common.time.Time.of(5L, TimeUnit.SECONDS)));
env.getConfig().setGlobalJobParameters(parameters);
env.setMaxParallelism(2);
// ck 设置
env.getCheckpointConfig().setFailOnCheckpointingErrors(false);
env.enableCheckpointing(30 * 1000L, CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(3L);
env.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
env.setParallelism(1);
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
env.addSource(new UserDefinedSource())
.process(new ProcessFunction() {
private ZkBasedConfigCenter zkBasedConfigCenter;
private KafkaProducerCenter kafkaProducerCenter;
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
this.zkBasedConfigCenter = ZkBasedConfigCenter.getInstance();
this.kafkaProducerCenter = KafkaProducerCenter.getInstance();
}
@Override
public void processElement(ClientLogSource clientLogSource, Context context, Collector collector)
throws Exception {
this.zkBasedConfigCenter.getMap().forEach(new BiConsumer() {
@Override
public void accept(Long id, DynamicProducerRule dynamicProducerRule) {
if (dynamicProducerRule.eval(clientLogSource)) {
kafkaProducerCenter.send(dynamicProducerRule.getTargetTopic(), clientLogSource.toString());
}
}
});
}
@Override
public void close() throws Exception {
super.close();
this.zkBasedConfigCenter.close();
this.kafkaProducerCenter.close();
}
});
env.execute();
}
private static class UserDefinedSource implements SourceFunction {
private volatile boolean isCancel;
@Override
public void run(SourceContext sourceContext) throws Exception {
while (!this.isCancel) {
sourceContext.collect(
ClientLogSource
.builder()
.id(RandomUtils.nextInt(0, 10))
.price(RandomUtils.nextInt(0, 100))
.timestamp(System.currentTimeMillis())
.date(new Date().toString())
.build()
);
Thread.sleep(1000L);
}
}
@Override
public void cancel() {
this.isCancel = true;
}
}
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split/job/start.sh
================================================
# 1.kafka 初始化
cd /kafka-bin-目录
# 启动 kafka server
./kafka-server-start /usr/local/etc/kafka/server.properties &
# 创建 3 个 topic
kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic tuzisir
kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic tuzisir1
kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic tuzisir2
# 启动一个 console consumer
kafka-console-consumer --bootstrap-server localhost:9092 --topic tuzisir --from-beginning
# 2.zk 初始化
cd /zk-bin-目录
zkServer start
zkCli -server 127.0.0.1:2181
# zkCli 中需要执行的命令
create /kafka-config {"1":{"condition":"1==1","targetTopic":"tuzisir1"},"2":{"condition":"1!=1","targetTopic":"tuzisir2"}}
get /kafka-config
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split/kafka/KafkaProducerCenter.java
================================================
package flink.examples.datastream._01.bytedance.split.kafka;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.function.BiConsumer;
import java.util.function.Function;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import flink.examples.datastream._01.bytedance.split.zkconfigcenter.ZkBasedConfigCenter;
public class KafkaProducerCenter {
private final ConcurrentMap> producerConcurrentMap
= new ConcurrentHashMap<>();
private KafkaProducerCenter() {
ZkBasedConfigCenter.getInstance()
.getMap()
.values()
.forEach(d -> getProducer(d.getTargetTopic()));
}
private static class Factory {
private static final KafkaProducerCenter INSTANCE = new KafkaProducerCenter();
}
public static KafkaProducerCenter getInstance() {
return Factory.INSTANCE;
}
private Producer getProducer(String topicName) {
Producer producer = producerConcurrentMap.get(topicName);
if (null != producer) {
return producer;
}
return producerConcurrentMap.computeIfAbsent(topicName, new Function>() {
@Override
public Producer apply(String topicName) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("acks", "all");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
return new KafkaProducer<>(props);
}
});
}
public void send(String topicName, String message) {
final ProducerRecord record = new ProducerRecord<>(topicName,
"", message);
try {
RecordMetadata metadata = getProducer(topicName).send(record).get();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void close() {
this.producerConcurrentMap.forEach(new BiConsumer>() {
@Override
public void accept(String s, Producer stringStringProducer) {
stringStringProducer.flush();
stringStringProducer.close();
}
});
}
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split/kafka/demo/Application.java
================================================
package flink.examples.datastream._01.bytedance.split.kafka.demo;
public class Application {
private String topicName = "tuzisir";
private String consumerGrp = "consumerGrp";
private String brokerUrl = "localhost:9092";
public static void main(String[] args) throws InterruptedException {
System.out.println(1);
Application application = new Application();
new Thread(new ProducerThread(application), "Producer : ").start();
new Thread(new ConsumerThread(application), "Consumer1 : ").start();
//for multiple consumers in same group, start new consumer threads
//new Thread(new ConsumerThread(application), "Consumer2 : ").start();
}
public String getTopicName() {
return topicName;
}
public String getConsumerGrp() {
return consumerGrp;
}
public String getBrokerUrl() {
return brokerUrl;
}
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split/kafka/demo/ConsumerThread.java
================================================
package flink.examples.datastream._01.bytedance.split.kafka.demo;
import java.time.Duration;
import java.util.Collections;
import java.util.Properties;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
public class ConsumerThread implements Runnable {
private Consumer consumer;
public ConsumerThread(Application application) {
Properties props = new Properties();
props.put("bootstrap.servers", application.getBrokerUrl());
props.put("group.id", application.getConsumerGrp());
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
//props.put("auto.offset.reset", "earliest");
consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singletonList(application.getTopicName()));
}
@Override
public void run() {
String threadName = Thread.currentThread().getName();
int noMessageToFetch = 1;
while (noMessageToFetch < 3) {
System.out.println(threadName + "poll start..");
final ConsumerRecords consumerRecords = consumer.poll(Duration.ofSeconds(1));
System.out.println(threadName + "records polled : " + consumerRecords.count());
if (consumerRecords.count() == 0) {
noMessageToFetch++;
continue;
}
for (ConsumerRecord record : consumerRecords) {
System.out.printf(threadName + "offset = %d, key = %s, value = %s, partition =%d%n",
record.offset(), record.key(), record.value(), record.partition());
}
consumer.commitAsync();
}
}
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split/kafka/demo/ProducerThread.java
================================================
package flink.examples.datastream._01.bytedance.split.kafka.demo;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
public class ProducerThread implements Runnable {
private Producer producer;
private String topicName;
public ProducerThread(Application application) {
this.topicName = application.getTopicName();
Properties props = new Properties();
props.put("bootstrap.servers", application.getBrokerUrl());
props.put("acks", "all");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
producer = new KafkaProducer<>(props);
}
@Override
public void run() {
String threadName = Thread.currentThread().getName();
for (int index = 1; index < 100; index++) {
final ProducerRecord record = new ProducerRecord<>(topicName,
Integer.toString(index), Integer.toString(index));
try {
RecordMetadata metadata = producer.send(record).get();
System.out
.println(threadName + "Record sent with key " + index + " to partition " + metadata.partition()
+ " with offset " + metadata.offset());
} catch (ExecutionException e) {
System.out.println(threadName + "Error in sending record :" + e);
throw new RuntimeException(e);
} catch (InterruptedException e) {
System.out.println(threadName + "Error in sending record : " + e);
throw new RuntimeException(e);
} catch (Exception e) {
System.out.println(threadName + "Error in sending record : " + e);
throw new RuntimeException(e);
}
}
}
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split/model/ClientLogSink.java
================================================
package flink.examples.datastream._01.bytedance.split.model;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class ClientLogSink {
private int id;
private int price;
private long timestamp;
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split/model/ClientLogSource.java
================================================
package flink.examples.datastream._01.bytedance.split.model;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class ClientLogSource {
private int id;
private int price;
private long timestamp;
private String date;
private String page;
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split/model/DynamicProducerRule.java
================================================
package flink.examples.datastream._01.bytedance.split.model;
import flink.examples.datastream._01.bytedance.split.codegen.JaninoUtils;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class DynamicProducerRule implements Evaluable {
private String condition;
private String targetTopic;
private Evaluable evaluable;
public void init(Long id) {
try {
Class clazz = JaninoUtils.genCodeAndGetClazz(id, targetTopic, condition);
this.evaluable = clazz.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public boolean eval(ClientLogSource clientLogSource) {
return this.evaluable.eval(clientLogSource);
}
public static void main(String[] args) throws Exception {
String condition = "String.valueOf(sourceModel.getId())==\"1\"";
DynamicProducerRule dynamicProducerRule = DynamicProducerRule
.builder()
.condition(condition)
.targetTopic("t")
.build();
dynamicProducerRule.init(1L);
boolean b = dynamicProducerRule.eval(ClientLogSource.builder().id(1).build());
System.out.println();
}
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split/model/Evaluable.java
================================================
package flink.examples.datastream._01.bytedance.split.model;
public interface Evaluable {
boolean eval(ClientLogSource clientLogSource);
}
================================================
FILE: flink-examples-1.13/src/main/java/flink/examples/datastream/_01/bytedance/split/zkconfigcenter/ZkBasedConfigCenter.java
================================================
package flink.examples.datastream._01.bytedance.split.zkconfigcenter;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
import org.apache.curator.retry.RetryOneTime;
import com.google.common.collect.Sets;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import flink.examples.datastream._01.bytedance.split.model.DynamicProducerRule;
public class ZkBasedConfigCenter {
private TreeCache treeCache;
private CuratorFramework zkClient;
private static class Factory {
private static final ZkBasedConfigCenter INSTANCE = new ZkBasedConfigCenter();
}
public static ZkBasedConfigCenter getInstance() {
return Factory.INSTANCE;
}
private ZkBasedConfigCenter() {
try {
open();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private ConcurrentMap map = new ConcurrentHashMap<>();
public ConcurrentMap getMap() {
return map;
}
private void setData() throws Exception {
String path = "/kafka-config";
zkClient = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new RetryOneTime(1000));
zkClient.start();
zkClient.setData().forPath(path, ("{\n"
+ " 1: {\n"
+ " \"condition\": \"1==1\",\n"
+ " \"targetTopic\": \"tuzisir1\"\n"
+ " },\n"
+ " 2: {\n"
+ " \"condition\": \"1!=1\",\n"
+ " \"targetTopic\": \"tuzisir2\"\n"
+ " }\n"
+ "}").getBytes());
}
private void open() throws Exception {
String path = "/kafka-config";
zkClient = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new RetryOneTime(1000));
zkClient.start();
// 启动时读取远程配置中心的配置信息
String json = new String(zkClient.getData().forPath(path));
this.update(json);
treeCache = new TreeCache(zkClient, path);
treeCache.start();
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {
switch (treeCacheEvent.getType()) {
case NODE_UPDATED:
// 通知的内容:包含路径和值
byte[] data = treeCacheEvent.getData().getData();
String json = new String(data);
System.out.println("配置变化为了:" + json);
// 更新数据
update(json);
break;
default:
}
}
});
}
public void close() {
this.treeCache.close();
this.zkClient.close();
}
private void update(String json) {
Map
result = getNewMap(json);
Set needAddId = Sets.difference(result.keySet(), map.keySet()).immutableCopy();
Set needDeleteId = Sets.difference(map.keySet(), result.keySet()).immutableCopy();
needAddId.forEach(new Consumer() {
@Override
public void accept(Long id) {
DynamicProducerRule dynamicProducerRule = result.get(id);
dynamicProducerRule.init(id);
map.put(id, dynamicProducerRule);
}
});
needDeleteId.forEach(new Consumer() {
@Override
public void accept(Long id) {
map.remove(id);
}
});
}
private Map getNewMap(String json) {
Gson gson = new Gson();
Map newMap = null;
Type type = new TypeToken