flink使用Event_time處理實時資料
//flink中關於時間的三個概念 //event time:資料產生的時間 //processing time:處理資料的時間 即運算元據的之間 比如一個flink在scala中的map函式處理資料時 //ingest time:攝取資料時間,在一個streaming程式中 一個時間段收集資料的時間 //而evet time在處理實時資料時是比較有用的,例如在由於網路的繁忙的原因,某些資料未能按時到達,假設遲到了30min, //而我們定義的最大延遲不能超過十分鐘,那麼一些資料包含了超時的資料那麼這些資料是不會在這次操作中處理的而是會 //丟棄掉
//kafka生產者程式碼 package kafka.partition.test; import java.util.HashMap; import java.util.Map; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord; public class PartitionProducer { public static void main(String[] args) { Map<String,Object> props = new HashMap<>(); props.put("acks", "1"); props.put("partitioner.class", "org.apache.kafka.clients.producer.internals.DefaultPartitioner"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("bootstrap.servers", "bigdata01:9092"); String topic = "event_time"; KafkaProducer<String, String> producer = new KafkaProducer<>(props); for(int i = 0 ; i <= 20;i++) { //flink的watermarkassginer裡面定義的超時時間是5000毫秒 long mills = System.currentTimeMillis(); if(i%3==0) { //資料的event time放在字串的開頭 以空格分割 //kafka event_time topic的0分割槽超時4000毫秒 String line = (mills-4000)+" "+"partition-0--this is a big +" +i; ProducerRecord< String,String> record = new ProducerRecord<String, String>(topic, new Integer(0), null, i+"", line); producer.send(record); }else if(i%3==1) { //kafka event_time topic的1分割槽超時5000毫秒 String line = (mills-5000)+" "+"partition-1--this is a big +" +i; ProducerRecord< String,String> record = new ProducerRecord<String, String>(topic, new Integer(1), null, i+"", line); producer.send(record); }else if(i%3==2) { //kafka event_time topic的2分割槽超時8000毫秒 String line = (mills-8000)+" "+"partition-2--this is a big +" +i; ProducerRecord< String,String> record = new ProducerRecord<String, String>(topic, new Integer(2), null, i+"", line); producer.send(record); } } producer.close(); } }
//自定義的TimestampsAndWatermarks package flink.streaming import org.apache.flink.streaming.api.functions.AssignerWithPeriodicWatermarks import org.apache.flink.streaming.api.watermark.Watermark class CustomWaterMarks extends AssignerWithPeriodicWatermarks[String]{ //超時時間 val maxOutOrderness = 5000l //flink過一段時間便會調一次該函式獲取水印 def getCurrentWatermark():Watermark ={ val sysMilssecons = System.currentTimeMillis() new Watermark(sysMilssecons-maxOutOrderness) } //每條記錄多會呼叫 來獲得even time 在生產的資料中 even_time放在字串的第一個欄位 用空格分割 def extractTimestamp(element: String,previousElementTimestamp: Long): Long = { ((element.split(" ")).head).toLong } }
package flink.streaming import java.util.Properties import org.apache.flink.streaming.api.scala._ import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer import org.apache.flink.api.common.serialization.SimpleStringSchema import org.apache.flink.streaming.api.windowing.time.Time import org.apache.flink.streaming.api.TimeCharacteristic import org.apache.flink.streaming.api.functions.sink.RichSinkFunction import org.apache.flink.streaming.api.CheckpointingMode import org.apache.flink.streaming.api.functions.AssignerWithPeriodicWatermarks object StreamWithEventTimeAndWaterMarks { def main(args: Array[String]): Unit = { val kafkaProps = new Properties() //kafka的一些屬性 kafkaProps.setProperty("bootstrap.servers", "bigdata01:9092") //所在的消費組 kafkaProps.setProperty("group.id", "group2") //獲取當前的執行環境 val evn = StreamExecutionEnvironment.getExecutionEnvironment //配製處理資料的時候使用event time evn.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) //kafka的consumer,test1是要消費的topic val kafkaSource = new FlinkKafkaConsumer[String]("event_time",new SimpleStringSchema,kafkaProps) //新增自定義的 TimestampsAndWatermarks kafkaSource.assignTimestampsAndWatermarks(new CustomWaterMarks) //設定從最新的offset開始消費 //kafkaSource.setStartFromGroupOffsets() kafkaSource.setStartFromLatest() //自動提交offset kafkaSource.setCommitOffsetsOnCheckpoints(true) //flink的checkpoint的時間間隔 //evn.enableCheckpointing(2000) //新增consumer val stream = evn.addSource(kafkaSource) evn.enableCheckpointing(2000, CheckpointingMode.EXACTLY_ONCE) //stream.setParallelism(3) val text = stream.flatMap{ _.toLowerCase().split(" ").drop(1).filter { _.nonEmpty} } .map{(_,1)} .keyBy(0) .timeWindow(Time.seconds(5)) .sum(1) .map(x=>{(x._1,(new Integer(x._2)))}) text.print() //啟動執行 //text.addSink(new Ssinks()) evn.execute("kafkawd") } }
列印結果 partition-2中的資料因為超時沒有出現 1> (big,14) 4> (is,14) 1> (+0,1) 2> (+1,1) 3> (partition-1--this,7) 4> (+15,1) 3> (+12,1) 1> (partition-0--this,7) 3> (+6,1) 1> (+16,1) 4> (+10,1) 2> (+18,1) 4> (+7,1) 3> (+3,1) 2> (+9,1) 3> (+19,1) 2> (+13,1) 3> (a,14) 2> (+4,1)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31506529/viewspace-2637182/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 實時資料處理:Kafka 和 FlinkKafka
- 使用Kafka和Flink構建實時資料處理系統Kafka
- Flink基礎:實時處理管道與ETL
- 使用Storm、Kafka和ElasticSearch處理實時資料 -javacodegeeksORMKafkaElasticsearchJava
- 開源實時資料處理系統Pulsar:一套搞定Kafka+Flink+DBKafka
- Apache Flink 如何正確處理實時計算場景中的亂序資料Apache
- 基於flink和drools的實時日誌處理
- DoorDash使用 Kafka 和 Flink 構建可擴充套件的實時事件處理Kafka套件事件
- 使用記憶體NewSQL資料平臺來處理實時資料流的三個好處記憶體SQL
- 【Flink】基於 Flink 的流式資料實時去重
- Flink處理函式實戰之四:視窗處理函式
- Flink域名處理
- java大資料處理:如何使用Java技術實現高效的大資料處理Java大資料
- 超3萬億資料實時分析,JCHDB助力海量資料處理
- 優步是如何使用Apache Flink和Kafka實現實時Exactly-Once廣告事件處理?ApacheKafka事件
- Flink處理函式實戰之五:CoProcessFunction(雙流處理)函式Function
- 流式處理新秀Flink原理與實踐
- 時間序列資料的處理
- 使用openpyxl處理表格資料
- 使用Excel高效處理資料Excel
- 使用 .NET Core 構建可擴充套件的實時資料處理系統套件
- 帶你玩轉Flink流批一體分散式實時處理引擎分散式
- 亞信安慧AntDB資料庫——實時流資料處理的先鋒資料庫
- 影像資料不足時的處理方法
- Python使用xlrd處理excel資料PythonExcel
- Java如何使用實時流式計算處理?Java
- Python資料處理(二):處理 Excel 資料PythonExcel
- Flink快照容錯處理
- 卷級實時備份的底層資料處理原理
- 4.Flink實時專案之資料拆分
- Flink處理函式實戰之三:KeyedProcessFunction類函式Function
- Flink處理函式實戰之二:ProcessFunction類函式Function
- 日均處理萬億資料!Flink在快手的應用實踐與技術演進之路
- 日處理資料量超10億:友信金服基於Flink構建實時使用者畫像系統的實踐
- 處理pandas讀取資料為nan時NaN
- 使用 Node-RED 處理 MQTT 資料MQQT
- 第32講:實時處理利器 mitmproxy 的使用MIT
- 資料處理