├── .gitignore
├── data-generator
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── kafka
│ │ ├── AvroSchemaRegistryTest.java
│ │ ├── JsonCurrencySender.java
│ │ ├── JsonOrderSender.java
│ │ └── KafkaGenerator.java
│ └── resources
│ ├── avro
│ └── UserAvro.avsc
│ ├── dynamic_index.csv
│ ├── hive_read.csv
│ ├── 1
│ ├── 2
│ ├── 3
│ └── 4
│ ├── src.csv
│ ├── test.csv
│ ├── test.json
│ ├── test1.csv
│ ├── test15.csv
│ ├── test_csv.csv
│ ├── testdata.avro
│ ├── user.avro
│ └── part-6be7eb15-4ec0-4ff8-aa29-59d5ec37dfae-0-0
│ ├── user.csv
│ ├── user19.json
│ ├── user2.csv
│ ├── user3.csv
│ ├── user4.json
│ └── user_part.csv
├── etl-job
├── pom.xml
└── src
│ └── main
│ ├── java
│ ├── Test.java
│ ├── TestGen.java
│ ├── constants
│ │ ├── FlinkSqlConstants.java
│ │ └── UnboundedFlinkSqlConstants.java
│ ├── kafka
│ │ └── UserAvro.java
│ ├── kafka2es
│ │ ├── Kafak2DynamicIndexEs.java
│ │ ├── Kafka2AppendEs.java
│ │ ├── Kafka2UpsertEs.java
│ │ └── Kafka2dynamicEsSQL.java
│ ├── kafka2file
│ │ ├── EventTimeBucketAssigner.java
│ │ ├── ReadHiveDataETL.java
│ │ ├── StreamETLKafka2Hdfs.java
│ │ ├── StreamETLKafka2HdfsSQL.java
│ │ ├── TestCsv2Csv.java
│ │ ├── TestCsv2Csv1.java
│ │ ├── TestCsvError.java
│ │ ├── TestFileSink.scala
│ │ └── Write2Kafka.java
│ ├── kafka2hbase
│ │ ├── KafkaJoinHbaseJoinMysql2Hbase.java
│ │ ├── TestHbase.java
│ │ └── UnboundedKafkaJoinHbase2Hbase.java
│ ├── kafka2jdbc
│ │ ├── KafkaJoinJdbc2Jdbc.java
│ │ ├── KafkaJoinJdbc2JdbcProc.java
│ │ ├── TestJdbc.java
│ │ ├── UnboundedKafkaJoinJdbc2Jdbc.java
│ │ ├── retract2Mysql.java
│ │ └── testNonExistedTable.java
│ ├── kafka2kafka
│ │ ├── ConsumeConfluentAvroTest.java
│ │ ├── KafkaAvro2Kafka.java
│ │ ├── KafkaCsv2Kafka.java
│ │ ├── KafkaJoinJdbc2Kafka.java
│ │ ├── KafkaJoinKafka2Kafka.java
│ │ └── KafkaJson2Kafka.java
│ ├── pge2e
│ │ └── PgCatalogTest.java
│ └── usercase
│ │ ├── TestUserIssue.java
│ │ ├── TestUserIssue10.java
│ │ ├── TestUserIssue11.java
│ │ ├── TestUserIssue12.java
│ │ ├── TestUserIssue13.java
│ │ ├── TestUserIssue14.java
│ │ ├── TestUserIssue15.java
│ │ ├── TestUserIssue16.java
│ │ ├── TestUserIssue17.java
│ │ ├── TestUserIssue18.java
│ │ ├── TestUserIssue19.java
│ │ ├── TestUserIssue2.java
│ │ ├── TestUserIssue20.java
│ │ ├── TestUserIssue21.java
│ │ ├── TestUserIssue22.java
│ │ ├── TestUserIssue3.java
│ │ ├── TestUserIssue4.java
│ │ ├── TestUserIssue5.java
│ │ ├── TestUserIssue6.java
│ │ ├── TestUserIssue7.java
│ │ ├── TestUserIssue8.java
│ │ └── TestUserIssue9.java
│ └── resources
│ ├── job-scripts
│ └── kafak2kafka_etl_run.sh
│ ├── job-sql-1.10
│ ├── kafka2es
│ │ ├── Kafka2AppendEs.sql
│ │ ├── Kafka2DynamicIndexEs.sql
│ │ └── Kafka2UpsertEs.sql
│ ├── kafka2filesystemandhive
│ │ ├── Csv2HivePartition.sql
│ │ ├── Csv2HiveSink.sql
│ │ ├── FileSystem2FileSystem.sql
│ │ └── Kafka2HiveSink.sql
│ ├── kafka2hbase
│ │ ├── KafkaJoinHbaseJoinMysql2Hbase.sql
│ │ └── UnboundedKafkaJoinHbase2Hbase.sql
│ ├── kafka2jdbc
│ │ ├── KafkaJoinJdbc2Jdbc.sql
│ │ └── UnboundedKafkaJoinJdbc2Jdbc.sql
│ └── kafka2kafka
│ │ ├── KafkaAvro2Kafka.sql
│ │ ├── KafkaCsv2Kafka.sql
│ │ ├── KafkaJoinJdbc2Kafka.sql
│ │ └── kafkaJson2kafka.sql
│ ├── job-sql-1.11
│ ├── catalog
│ │ └── PgcatalogE2eTest.sql
│ ├── jdbc
│ │ ├── kafka2mysql.sql
│ │ └── kafkajoinmysql.sql
│ ├── kafka2es
│ │ ├── Kafka2AppendEs.sql
│ │ ├── Kafka2DynamicIndexEs.sql
│ │ └── Kafka2UpsertEs.sql
│ └── kafka2hbase
│ │ ├── KafkaJoinHbaseJoinMysql2Hbase.sql
│ │ ├── UnboundedKafkaJoinHbase2Hbase.sql
│ │ └── hbase_cdc
│ ├── job-sql-1.12
│ ├── hbase2_test.sql
│ ├── hive_latest_dim.sql
│ └── upsert-kafka.sql
│ ├── log4j.properties
│ ├── pictures
│ └── CURRRENT_TIMESTAMP.png
│ └── readme.md
├── flink-demo
├── flink-jdbc-demo
│ ├── README.md
│ ├── docker-compose-flink-demo.yaml
│ ├── flink-demo-udf.jar
│ └── sql-client-defaults.yaml
├── flink-temporal-join-demo
│ ├── README.md
│ ├── register-mysql.json
│ ├── sql-client-defaults.yaml
│ └── temporal-join-versioned-table.yaml
├── pom.xml
└── src
│ └── main
│ └── java
│ └── udf
│ └── Int2DateUDF.java
├── pom.xml
├── sql-avro
├── pom.xml
└── src
│ └── main
│ └── java
│ └── TestUserIssue12.java
└── state-process
├── pom.xml
└── src
└── main
└── java
├── org
└── apache
│ └── flink
│ └── state
│ └── api
│ └── runtime
│ └── metadata
│ └── SavepointMetadata.java
└── state
└── CdcSourceStateAnalysis.java
/.gitignore:
--------------------------------------------------------------------------------
1 | .cache
2 | scalastyle-output.xml
3 | .classpath
4 | .idea
5 | .metadata
6 | .settings
7 | .project
8 | .version.properties
9 | filter.properties
10 | logs.zip
11 | target
12 | tmp
13 | *.class
14 | *.iml
15 | *.swp
16 | *.jar
17 | !flink-demo-udf.jar
18 | *.zip
19 | *.log
20 | *.pyc
21 | .DS_Store
22 | build-target
23 | flink-end-to-end-tests/flink-datastream-allround-test/src/main/java/org/apache/flink/streaming/tests/avro/
24 | flink-formats/flink-avro/src/test/java/org/apache/flink/formats/avro/generated/
25 | flink-formats/flink-parquet/src/test/java/org/apache/flink/formats/parquet/generated/
26 | flink-runtime-web/web-dashboard/node/
27 | flink-runtime-web/web-dashboard/node_modules/
28 | flink-runtime-web/web-dashboard/web/
29 | flink-python/dist/
30 | flink-python/build/
31 | flink-python/pyflink.egg-info/
32 | flink-python/apache_flink.egg-info/
33 | flink-python/docs/_build
34 | flink-python/.tox/
35 | flink-python/dev/download
36 | flink-python/dev/.conda/
37 | flink-python/dev/log/
38 | flink-python/dev/.stage.txt
39 | flink-python/.eggs/
40 | atlassian-ide-plugin.xml
41 | out/
42 | /docs/api
43 | /docs/content
44 | /docs/.bundle
45 | /docs/.rubydeps
46 | /docs/ruby2/.bundle
47 | /docs/ruby2/.rubydeps
48 | /docs/.jekyll-metadata
49 | *.ipr
50 | *.iws
51 | tools/flink
52 | tools/flink-*
53 | tools/releasing/release
54 | tools/japicmp-output
55 |
--------------------------------------------------------------------------------
/data-generator/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | flink-sql-etl
7 | org.example
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | data-generator
13 |
14 |
15 | org.apache.kafka
16 | kafka_2.11
17 | 1.0.0
18 |
19 |
20 | io.confluent
21 | kafka-avro-serializer
22 | 5.3.0
23 |
24 |
25 | org.apache.avro
26 | avro
27 | 1.8.2
28 |
29 |
30 | org.apache.avro
31 | avro-maven-plugin
32 | 1.8.2
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | org.apache.avro
41 | avro-maven-plugin
42 | 1.8.2
43 |
44 |
45 | generate-sources
46 |
47 | schema
48 |
49 |
50 | src/main/resources/avro
51 | ${project.build.directory}/generated-sources
52 | String
53 |
54 |
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/data-generator/src/main/java/kafka/AvroSchemaRegistryTest.java:
--------------------------------------------------------------------------------
1 | //package kafka;
2 | //
3 | //import io.confluent.kafka.serializers.KafkaAvroDeserializer;
4 | //import io.confluent.kafka.serializers.KafkaAvroSerializer;
5 | //import org.apache.kafka.clients.consumer.ConsumerConfig;
6 | //import org.apache.kafka.clients.consumer.ConsumerRecord;
7 | //import org.apache.kafka.clients.consumer.ConsumerRecords;
8 | //import org.apache.kafka.clients.consumer.KafkaConsumer;
9 | //import org.apache.kafka.clients.producer.KafkaProducer;
10 | //import org.apache.kafka.clients.producer.ProducerConfig;
11 | //import org.apache.kafka.clients.producer.ProducerRecord;
12 | //import org.apache.kafka.common.serialization.StringDeserializer;
13 | //import org.apache.kafka.common.serialization.StringSerializer;
14 | //
15 | //import java.io.IOException;
16 | //import java.text.DateFormat;
17 | //import java.text.SimpleDateFormat;
18 | //import java.util.Collections;
19 | //import java.util.Date;
20 | //import java.util.Properties;
21 | //import java.util.Random;
22 | //import java.util.stream.IntStream;
23 | //
24 | //public class AvroSchemaRegistryTest {
25 | // public static final String WIKIPEDIA_FEED = "WikipediaFeed2_filtered";
26 | //
27 | // public static void main(final String[] args) throws IOException {
28 | // produceInputs();
29 | // consumeOutput();
30 | // }
31 | //
32 | // private static void produceInputs() throws IOException {
33 | // final String[] users = {"leonard", "bob", "joe", "damian", "tania", "phil", "sam", "lauren", "joseph"};
34 | // final Properties props = new Properties();
35 | // props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
36 | // props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
37 | // props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer.class);
38 | // props.put("schema.registry.url", "http://localhost:8081");
39 | // final KafkaProducer producer = new KafkaProducer<>(props);
40 | // final Random random = new Random();
41 | //
42 | // IntStream.range(0, 10)
43 | // .mapToObj(value -> new UserAvro(users[random.nextInt(users.length)], true, "content"))
44 | // .forEach(
45 | // record -> {
46 | // System.out.println(record.toString()) ;
47 | // producer.send(new ProducerRecord<>(WIKIPEDIA_FEED, record.getUserName(), record));
48 | // });
49 | //
50 | // producer.flush();
51 | // }
52 | //
53 | // private static void consumeOutput() {
54 | // final Properties consumerProperties = new Properties();
55 | // consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
56 | // consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
57 | // consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, KafkaAvroDeserializer.class);
58 | // consumerProperties.put("schema.registry.url", "http://localhost:8081");
59 | // consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "wikipedia-feed-example-consumer3");
60 | // consumerProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
61 | // final KafkaConsumer consumer = new KafkaConsumer<>(consumerProperties);
62 | // consumer.subscribe(Collections.singleton(WIKIPEDIA_FEED));
63 | // while (true) {
64 | // final ConsumerRecords consumerRecords = consumer.poll(Long.MAX_VALUE);
65 | // for (final ConsumerRecord consumerRecord : consumerRecords) {
66 | //
67 | // System.out.println(consumerRecord.key() + "=" + consumerRecord.value());
68 | // }
69 | // }
70 | // }
71 | //
72 | //}
73 |
--------------------------------------------------------------------------------
/data-generator/src/main/java/kafka/JsonCurrencySender.java:
--------------------------------------------------------------------------------
1 | package kafka;
2 |
3 | import com.fasterxml.jackson.core.JsonProcessingException;
4 | import com.fasterxml.jackson.databind.ObjectMapper;
5 | import org.apache.kafka.clients.producer.Callback;
6 | import org.apache.kafka.clients.producer.KafkaProducer;
7 | import org.apache.kafka.clients.producer.ProducerRecord;
8 | import org.apache.kafka.clients.producer.RecordMetadata;
9 | import org.slf4j.Logger;
10 | import org.slf4j.LoggerFactory;
11 |
12 | import java.text.DateFormat;
13 | import java.text.SimpleDateFormat;
14 | import java.util.Date;
15 | import java.util.HashMap;
16 | import java.util.Map;
17 | import java.util.Properties;
18 |
19 | public class JsonCurrencySender {
20 | private static final Logger logger = LoggerFactory.getLogger(JsonCurrencySender.class);
21 | private static final ObjectMapper objectMapper = new ObjectMapper();
22 | private static final SendCallBack sendCallBack = new SendCallBack();
23 | private static final String topicName = "flink_currency1";
24 | private static final Map currency2rates = initCurrency2rates();
25 | private static final Map country2currency = initCountry2Currency();
26 |
27 | public static void sendMessage(Properties kafkaProperties, int continueMinutes) throws InterruptedException, JsonProcessingException {
28 | KafkaProducer