Apache FlinkÊÇÒ»¸öÃæÏò·Ö²¼Ê½Êý¾ÝÁ÷´¦ÀíºÍÅúÁ¿Êý¾Ý´¦ÀíµÄ¿ªÔ´¼ÆËãÆ½Ì¨£¬ËüÄܹ»»ùÓÚͬһ¸öFlinkÔËÐÐʱ£¨Flink Runtime£©£¬Ìṩ֧³ÖÁ÷´¦ÀíºÍÅú´¦ÀíÁ½ÖÖÀàÐÍÓ¦ÓõŦÄÜ¡£ÏÖÓеĿªÔ´¼ÆËã·½°¸£¬»á°ÑÁ÷´¦ÀíºÍÅú´¦Àí×÷ΪÁ½ÖÖ²»Í¬µÄÓ¦ÓÃÀàÐÍ£¬ÒòΪËûÃÇËüÃÇËùÌṩµÄSLAÊÇÍêÈ«²»ÏàͬµÄ£ºÁ÷´¦ÀíÒ»°ãÐèÒªÖ§³ÖµÍÑÓ³Ù¡¢Exactly-once±£Ö¤£¬¶øÅú´¦ÀíÐèÒªÖ§³Ö¸ßÍÌÍ¡¢¸ßЧ´¦Àí£¬ËùÒÔÔÚʵÏÖµÄʱºòͨ³£ÊÇ·Ö±ð¸ø³öÁ½Ì×ʵÏÖ·½·¨£¬»òÕßͨ¹ýÒ»¸ö¶ÀÁ¢µÄ¿ªÔ´¿ò¼ÜÀ´ÊµÏÖÆäÖÐÿһÖÖ´¦Àí·½°¸¡£ÀýÈ磬ʵÏÖÅú´¦ÀíµÄ¿ªÔ´·½°¸ÓÐMapReduce¡¢Tez¡¢Crunch¡¢Spark£¬ÊµÏÖÁ÷´¦ÀíµÄ¿ªÔ´·½°¸ÓÐSamza¡¢Storm¡£
FlinkÔÚʵÏÖÁ÷´¦ÀíºÍÅú´¦Àíʱ£¬Ó봫ͳµÄһЩ·½°¸ÍêÈ«²»Í¬£¬Ëü´ÓÁíÒ»¸öÊӽǿ´´ýÁ÷´¦ÀíºÍÅú´¦Àí£¬½«¶þÕßͳһÆðÀ´£ºFlinkÊÇÍêȫ֧³ÖÁ÷´¦Àí£¬Ò²¾ÍÊÇ˵×÷ΪÁ÷´¦Àí¿´´ýʱÊäÈëÊý¾ÝÁ÷ÊÇÎÞ½çµÄ£»Åú´¦Àí±»×÷ΪһÖÖÌØÊâµÄÁ÷´¦Àí£¬Ö»ÊÇËüµÄÊäÈëÊý¾ÝÁ÷±»¶¨ÒåΪÓнçµÄ¡£»ùÓÚͬһ¸öFlinkÔËÐÐʱ£¨Flink Runtime£©£¬·Ö±ðÌṩÁËÁ÷´¦ÀíºÍÅú´¦ÀíAPI£¬¶øÕâÁ½ÖÖAPIÒ²ÊÇʵÏÖÉϲãÃæÏòÁ÷´¦Àí¡¢Åú´¦ÀíÀàÐÍÓ¦Óÿò¼ÜµÄ»ù´¡¡£
»ù±¾ÌØÐÔ
¹ØÓÚFlinkËùÖ§³ÖµÄÌØÐÔ£¬ÎÒÕâÀïÖ»ÊÇͨ¹ý·ÖÀàµÄ·½Ê½¼òµ¥×öÒ»ÏÂÊáÀí£¬Éæ¼°µ½¾ßÌåµÄһЩ¸ÅÄî¼°ÆäÔÀí»áÔÚºóÃæµÄ²¿·Ö×öÏêϸ˵Ã÷¡£
Á÷´¦ÀíÌØÐÔ
Ö§³Ö¸ßÍÌÍ¡¢µÍÑÓ³Ù¡¢¸ßÐÔÄܵÄÁ÷´¦Àí
Ö§³Ö´øÓÐʼþʱ¼äµÄ´°¿Ú£¨Window£©²Ù×÷
Ö§³ÖÓÐ״̬¼ÆËãµÄExactly-onceÓïÒå
Ö§³Ö¸ß¶ÈÁé»îµÄ´°¿Ú£¨Window£©²Ù×÷£¬Ö§³Ö»ùÓÚtime¡¢count¡¢session£¬ÒÔ¼°data-drivenµÄ´°¿Ú²Ù×÷
Ö§³Ö¾ßÓÐBackpressure¹¦ÄܵijÖÐøÁ÷Ä£ÐÍ
Ö§³Ö»ùÓÚÇáÁ¿¼¶·Ö²¼Ê½¿ìÕÕ£¨Snapshot£©ÊµÏÖµÄÈÝ´í
Ò»¸öÔËÐÐʱͬʱ֧³ÖBatch on Streaming´¦ÀíºÍStreaming´¦Àí
FlinkÔÚJVMÄÚ²¿ÊµÏÖÁË×Ô¼ºµÄÄÚ´æ¹ÜÀí
Ö§³Öµü´ú¼ÆËã
Ö§³Ö³ÌÐò×Ô¶¯ÓÅ»¯£º±ÜÃâÌØ¶¨Çé¿öÏÂShuffle¡¢ÅÅÐòµÈ°º¹ó²Ù×÷£¬Öмä½á¹ûÓбØÒª½øÐлº´æ
APIÖ§³Ö
¶ÔStreamingÊý¾ÝÀàÓ¦Óã¬ÌṩDataStream API
¶ÔÅú´¦ÀíÀàÓ¦Óã¬ÌṩDataSet API£¨Ö§³ÖJava/Scala£©
ibrariesÖ§³Ö
Ö§³Ö»úÆ÷ѧϰ£¨FlinkML£©
Ö§³Öͼ·ÖÎö£¨Gelly£©
Ö§³Ö¹ØÏµÊý¾Ý´¦Àí£¨Table£©
Ö§³Ö¸´ÔÓʼþ´¦Àí£¨CEP£©
ÕûºÏÖ§³Ö
Ö§³ÖFlink on YARN
Ö§³ÖHDFS
Ö§³ÖÀ´×ÔKafkaµÄÊäÈëÊý¾Ý
Ö§³ÖApache HBase
Ö§³ÖHadoop³ÌÐò
Ö§³ÖTachyon
Ö§³ÖElasticSearch
Ö§³ÖRabbitMQ
Ö§³ÖApache Storm
Ö§³ÖS3
Ö§³ÖXtreemFS
»ù±¾¸ÅÄî
Stream & Transformation & Operator
Óû§ÊµÏÖµÄFlink³ÌÐòÊÇÓÉStreamºÍTransformationÕâÁ½¸ö»ù±¾¹¹½¨¿é×é³É£¬ÆäÖÐStreamÊÇÒ»¸öÖмä½á¹ûÊý¾Ý£¬¶øTransformationÊÇÒ»¸ö²Ù×÷£¬Ëü¶ÔÒ»¸ö»ò¶à¸öÊäÈëStream½øÐмÆËã´¦Àí£¬Êä³öÒ»¸ö»ò¶à¸ö½á¹ûStream¡£µ±Ò»¸öFlink³ÌÐò±»Ö´ÐеÄʱºò£¬Ëü»á±»Ó³ÉäΪStreaming Dataflow¡£Ò»¸öStreaming DataflowÊÇÓÉÒ»×éStreamºÍTransformation Operator×é³É£¬ËüÀàËÆÓÚÒ»¸öDAGͼ£¬ÔÚÆô¶¯µÄʱºò´ÓÒ»¸ö»ò¶à¸öSource Operator¿ªÊ¼£¬½áÊøÓÚÒ»¸ö»ò¶à¸öSink Operator¡£
ÏÂÃæÊÇÒ»¸öÓÉFlink³ÌÐòÓ³ÉäΪStreaming DataflowµÄʾÒâͼ£¬ÈçÏÂËùʾ£º

flink-streaming-dataflow-example
ÉÏͼÖУ¬FlinkKafkaConsumerÊÇÒ»¸öSource Operator£¬map¡¢keyBy¡¢timeWindow¡¢applyÊÇTransformation Operator£¬RollingSinkÊÇÒ»¸öSink Operator¡£
Parallel Dataflow
ÔÚFlinkÖУ¬³ÌÐòÌìÉúÊDz¢Ðкͷֲ¼Ê½µÄ£ºÒ»¸öStream¿ÉÒÔ±»·Ö³É¶à¸öStream·ÖÇø£¨Stream Partitions£©£¬Ò»¸öOperator¿ÉÒÔ±»·Ö³É¶à¸öOperator Subtask£¬Ã¿Ò»¸öOperator SubtaskÊÇÔÚ²»Í¬µÄÏß³ÌÖжÀÁ¢Ö´Ðеġ£Ò»¸öOperatorµÄ²¢Ðжȣ¬µÈÓÚOperator SubtaskµÄ¸öÊý£¬Ò»¸öStreamµÄ²¢ÐжÈ×ÜÊǵÈÓÚÉú³ÉËüµÄOperatorµÄ²¢Ðжȡ£
ÓйØParallel DataflowµÄʵÀý£¬ÈçÏÂͼËùʾ£º

flink-parallel-dataflow
ÉÏͼStreaming DataflowµÄ²¢ÐÐÊÓͼÖУ¬Õ¹ÏÖÁËÔÚÁ½¸öOperatorÖ®¼äµÄStreamµÄÁ½ÖÖģʽ£º
One-to-oneģʽ
±ÈÈç´ÓSource[1]µ½map()[1]£¬Ëü±£³ÖÁËSourceµÄ·ÖÇøÌØÐÔ£¨Partitioning£©ºÍ·ÖÇøÄÚÔªËØ´¦ÀíµÄÓÐÐòÐÔ£¬Ò²¾ÍÊÇ˵map()[1]µÄSubtask¿´µ½Êý¾ÝÁ÷ÖмǼµÄ˳Ðò£¬ÓëSource[1]Öп´µ½µÄ¼Ç¼˳ÐòÊÇÒ»Öµġ£
Redistributionģʽ
ÕâÖÖģʽ¸Ä±äÁËÊäÈëÊý¾ÝÁ÷µÄ·ÖÇø£¬±ÈÈç´Ómap()[1]¡¢map()[2]µ½keyBy()/window()/apply()[1]¡¢keyBy()/window()/apply()[2]£¬ÉÏÓεÄSubtaskÏòÏÂÓεĶà¸ö²»Í¬µÄSubtask·¢ËÍÊý¾Ý£¬¸Ä±äÁËÊý¾ÝÁ÷µÄ·ÖÇø£¬ÕâÓëʵ¼ÊÓ¦ÓÃËùÑ¡ÔñµÄOperatorÓйØÏµ¡£
ÁíÍ⣬Source Operator¶ÔÓ¦2¸öSubtask£¬ËùÒÔ²¢ÐжÈΪ2£¬¶øSink OperatorµÄSubtaskÖ»ÓÐ1¸ö£¬¹Ê¶ø²¢ÐжÈΪ1¡£
Task & Operator Chain
ÔÚFlink·Ö²¼Ê½Ö´Ðл·¾³ÖУ¬»á½«¶à¸öOperator Subtask´®ÆðÀ´×é³ÉÒ»¸öOperator Chain£¬Êµ¼ÊÉϾÍÊÇÒ»¸öÖ´ÐÐÁ´£¬Ã¿¸öÖ´ÐÐÁ´»áÔÚTaskManagerÉÏÒ»¸ö¶ÀÁ¢µÄÏß³ÌÖÐÖ´ÐУ¬ÈçÏÂͼËùʾ£º

flink-tasks-chains
ÉÏͼÖÐÉϰ벿·Ö±íʾµÄÊÇÒ»¸öOperator Chain£¬¶à¸öOperatorͨ¹ýStreamÁ¬½Ó£¬¶øÃ¿¸öOperatorÔÚÔËÐÐʱ¶ÔÓ¦Ò»¸öTask£»Í¼ÖÐϰ벿·ÖÊÇÉϰ벿·ÖµÄÒ»¸ö²¢Ðа汾£¬Ò²¾ÍÊǶÔÿһ¸öTask¶¼²¢Ðл¯Îª¶à¸öSubtask¡£
Time & Window
FlinkÖ§³Ö»ùÓÚʱ¼ä´°¿Ú²Ù×÷£¬Ò²Ö§³Ö»ùÓÚÊý¾ÝµÄ´°¿Ú²Ù×÷£¬ÈçÏÂͼËùʾ£º

flink-window
ÉÏͼÖУ¬»ùÓÚʱ¼äµÄ´°¿Ú²Ù×÷£¬ÔÚÿ¸öÏàͬµÄʱ¼ä¼ä¸ô¶ÔStreamÖеļǼ½øÐд¦Àí£¬Í¨³£¸÷¸öʱ¼ä¼ä¸ôÄڵĴ°¿Ú²Ù×÷´¦ÀíµÄ¼Ç¼Êý²»¹Ì¶¨£»¶ø»ùÓÚÊý¾ÝÇý¶¯µÄ´°¿Ú²Ù×÷£¬¿ÉÒÔÔÚStreamÖÐÑ¡Ôñ¹Ì¶¨ÊýÁ¿µÄ¼Ç¼×÷Ϊһ¸ö´°¿Ú£¬¶Ô¸Ã´°¿ÚÖеļǼ½øÐд¦Àí¡£
Óйش°¿Ú²Ù×÷µÄ²»Í¬ÀàÐÍ£¬¿ÉÒÔ·ÖΪÈçϼ¸ÖÖ£ºÇãб´°¿Ú£¨Tumbling Windows£¬¼Ç¼ûÓÐÖØµþ£©¡¢»¬¶¯´°¿Ú£¨Slide Windows£¬¼Ç¼ÓÐÖØµþ£©¡¢»á»°´°¿Ú£¨Session Windows£©£¬¾ßÌå¿ÉÒÔ²éÔÄÏà¹Ø×ÊÁÏ¡£
ÔÚ´¦ÀíStreamÖеļǼʱ£¬¼Ç¼ÖÐͨ³£»á°üº¬¸÷ÖÖµäÐ͵Äʱ¼ä×ֶΣ¬FlinkÖ§³Ö¶àÖÖʱ¼äµÄ´¦Àí£¬ÈçÏÂͼËùʾ£º

flink-event-ingestion-processing-time
ÉÏͼÃèÊöÁËÔÚ»ùÓÚFlinkµÄÁ÷´¦ÀíϵͳÖУ¬¸÷ÖÖ²»Í¬µÄʱ¼äËù´¦µÄλÖúͺ¬Ò壬ÆäÖУ¬Event Time±íʾʼþ´´½¨Ê±¼ä£¬Ingestion Time±íʾʼþ½øÈëµ½Flink DataflowµÄʱ¼ä £¬Processing Time±íʾij¸öOperator¶Ôʼþ½øÐд¦Àíʵı¾µØÏµÍ³Ê±¼ä£¨ÊÇÔÚTaskManager½ÚµãÉÏ£©¡£ÕâÀ̸һÏ»ùÓÚEvent Time½øÐд¦ÀíµÄÎÊÌ⣬ͨ³£¸ù¾ÝEvent Time»á¸øÕû¸öStreamingÓ¦ÓôøÀ´Ò»¶¨µÄÑÓ³ÙÐÔ£¬ÒòΪÔÚÒ»¸ö»ùÓÚʼþµÄ´¦ÀíϵͳÖУ¬½øÈëϵͳµÄʼþ¿ÉÄÜ»á»ùÓÚEvent Time¶ø·¢ÉúÂÒÐòÏÖÏ󣬱ÈÈçʼþÀ´Ô´ÓÚÍⲿµÄ¶à¸öϵͳ£¬ÎªÁËÔöǿʼþ´¦ÀíÍÌÍÂÁ¿»á½«ÊäÈëµÄ¶à¸öStream½øÐÐ×ÔÈ»·ÖÇø£¬Ã¿¸öStream·ÖÇøÄÚ²¿ÓÐÐò£¬µ«ÊÇÒª±£Ö¤È«¾ÖÓÐÐò±ØÐëͬʱ¼æ¹Ë¶à¸öStream·ÖÇøµÄ´¦Àí£¬ÉèÖÃÒ»¶¨µÄʱ¼ä´°¿Ú½øÐÐÔÝ´æÊý¾Ý£¬µ±¶à¸öStream·ÖÇø»ùÓÚEvent TimeÅÅÁÐ¶ÔÆëºó²ÅÄܽøÐÐÑÓ³Ù´¦Àí¡£ËùÒÔ£¬ÉèÖõÄÔÝ´æÊý¾Ý¼Ç¼µÄʱ¼ä´°¿ÚÔ½³¤£¬´¦ÀíÐÔÄÜÔ½²î£¬ÉõÖÁÑÏÖØÓ°ÏìStream´¦ÀíµÄʵʱÐÔ¡£
ÓйػùÓÚʱ¼äµÄStreaming´¦Àí£¬¿ÉÒԲο¼¹Ù·½Îĵµ£¬ÔÚFlinkÖÐ½è¼øÁËGoogleʹÓõÄWaterMarkʵÏÖ·½Ê½£¬¿ÉÒÔ²éÔÄÏà¹Ø×ÊÁÏ¡£
»ù±¾¼Ü¹¹
FlinkϵͳµÄ¼Ü¹¹ÓëSparkÀàËÆ£¬ÊÇÒ»¸ö»ùÓÚMaster-Slave·ç¸ñµÄ¼Ü¹¹£¬ÈçÏÂͼËùʾ£º

flink-system-architecture
Flink¼¯ÈºÆô¶¯Ê±£¬»áÆô¶¯Ò»¸öJobManager½ø³Ì¡¢ÖÁÉÙÒ»¸öTaskManager½ø³Ì¡£ÔÚLocalģʽÏ£¬»áÔÚͬһ¸öJVMÄÚ²¿Æô¶¯Ò»¸öJobManager½ø³ÌºÍTaskManager½ø³Ì¡£µ±Flink³ÌÐòÌá½»ºó£¬»á´´½¨Ò»¸öClientÀ´½øÐÐÔ¤´¦Àí£¬²¢×ª»»ÎªÒ»¸ö²¢ÐÐÊý¾ÝÁ÷£¬ÕâÊǶÔÓ¦×ÅÒ»¸öFlink Job£¬´Ó¶ø¿ÉÒÔ±»JobManagerºÍTaskManagerÖ´ÐС£ÔÚʵÏÖÉÏ£¬Flink»ùÓÚActorʵÏÖÁËJobManagerºÍTaskManager£¬ËùÒÔJobManagerÓëTaskManagerÖ®¼äµÄÐÅÏ¢½»»»£¬¶¼ÊÇͨ¹ýʼþµÄ·½Ê½À´½øÐд¦Àí¡£
ÈçÉÏͼËùʾ£¬FlinkϵͳÖ÷Òª°üº¬ÈçÏÂ3¸öÖ÷ÒªµÄ½ø³Ì£º
JobManager
JobManagerÊÇFlinkϵͳµÄе÷Õߣ¬Ëü¸ºÔð½ÓÊÕFlink Job£¬µ÷¶È×é³ÉJobµÄ¶à¸öTaskµÄÖ´ÐС£Í¬Ê±£¬JobManager»¹¸ºÔðÊÕ¼¯JobµÄ״̬ÐÅÏ¢£¬²¢¹ÜÀíFlink¼¯ÈºÖдӽڵãTaskManager¡£JobManagerËù¸ºÔðµÄ¸÷Ïî¹ÜÀí¹¦ÄÜ£¬Ëü½ÓÊÕµ½²¢´¦ÀíµÄʼþÖ÷Òª°üÀ¨£º
RegisterTaskManager
ÔÚFlink¼¯ÈºÆô¶¯µÄʱºò£¬TaskManager»áÏòJobManager×¢²á£¬Èç¹û×¢²á³É¹¦£¬ÔòJobManager»áÏòTaskManager»Ø¸´ÏûÏ¢AcknowledgeRegistration¡£
SubmitJob
Flink³ÌÐòÄÚ²¿Í¨¹ýClientÏòJobManagerÌá½»Flink Job£¬ÆäÖÐÔÚÏûÏ¢SubmitJobÖÐÒÔJobGraphÐÎʽÃèÊöÁËJobµÄ»ù±¾ÐÅÏ¢¡£
CancelJob
ÇëÇóÈ¡ÏûÒ»¸öFlink JobµÄÖ´ÐУ¬CancelJobÏûÏ¢Öаüº¬ÁËJobµÄID£¬Èç¹û³É¹¦Ôò·µ»ØÏûÏ¢CancellationSuccess£¬Ê§°ÜÔò·µ»ØÏûÏ¢CancellationFailure¡£
UpdateTaskExecutionState
TaskManager»áÏòJobManagerÇëÇó¸üÐÂExecutionGraphÖеÄExecutionVertexµÄ״̬ÐÅÏ¢£¬¸üгɹ¦Ôò·µ»Øtrue¡£
RequestNextInputSplit
ÔËÐÐÔÚTaskManagerÉÏÃæµÄTask£¬ÇëÇó»ñÈ¡ÏÂÒ»¸öÒª´¦ÀíµÄÊäÈëSplit£¬³É¹¦Ôò·µ»ØNextInputSplit¡£
JobStatusChanged
ExecutionGraphÏòJobManager·¢Ë͸ÃÏûÏ¢£¬ÓÃÀ´±íʾFlink JobµÄ״̬·¢ÉúµÄ±ä»¯£¬ÀýÈ磺RUNNING¡¢CANCELING¡¢FINISHEDµÈ¡£
TaskManager
TaskManagerÒ²ÊÇÒ»¸öActor£¬ËüÊÇʵ¼Ê¸ºÔðÖ´ÐмÆËãµÄWorker£¬ÔÚÆäÉÏÖ´ÐÐFlink JobµÄÒ»×éTask¡£Ã¿¸öTaskManager¸ºÔð¹ÜÀíÆäËùÔÚ½ÚµãÉϵÄ×ÊÔ´ÐÅÏ¢£¬ÈçÄÚ´æ¡¢´ÅÅÌ¡¢ÍøÂ磬ÔÚÆô¶¯µÄʱºò½«×ÊÔ´µÄ״̬ÏòJobManager»ã±¨¡£TaskManager¶Ë¿ÉÒÔ·Ö³ÉÁ½¸ö½×¶Î£º
×¢²á½×¶Î
TaskManager»áÏòJobManager×¢²á£¬·¢ËÍRegisterTaskManagerÏûÏ¢£¬µÈ´ýJobManager·µ»ØAcknowledgeRegistration£¬È»ºóTaskManager¾Í¿ÉÒÔ½øÐгõʼ»¯¹ý³Ì¡£
¿É²Ù×÷½×¶Î
¸Ã½×¶ÎTaskManager¿ÉÒÔ½ÓÊÕ²¢´¦ÀíÓëTaskÓйصÄÏûÏ¢£¬ÈçSubmitTask¡¢CancelTask¡¢FailTask¡£Èç¹ûTaskManagerÎÞ·¨Á¬½Óµ½JobManager£¬ÕâÊÇTaskManager¾ÍʧȥÁËÓëJobManagerµÄÁªÏµ£¬»á×Ô¶¯½øÈë¡°×¢²á½×¶Î¡±£¬Ö»ÓÐÍê³É×¢²á²ÅÄܼÌÐø´¦ÀíTaskÏà¹ØµÄÏûÏ¢¡£
Client
µ±Óû§Ìá½»Ò»¸öFlink³ÌÐòʱ£¬»áÊ×ÏÈ´´½¨Ò»¸öClient£¬¸ÃClientÊ×ÏÈ»á¶ÔÓû§Ìá½»µÄFlink³ÌÐò½øÐÐÔ¤´¦Àí£¬²¢Ìá½»µ½Flink¼¯ÈºÖд¦Àí£¬ËùÒÔClientÐèÒª´ÓÓû§Ìá½»µÄFlink³ÌÐòÅäÖÃÖлñÈ¡JobManagerµÄµØÖ·£¬²¢½¨Á¢µ½JobManagerµÄÁ¬½Ó£¬½«Flink JobÌá½»¸øJobManager¡£Client»á½«Óû§Ìá½»µÄFlink³ÌÐò×é×°Ò»¸öJobGraph£¬ ²¢ÇÒÊÇÒÔJobGraphµÄÐÎʽÌá½»µÄ¡£Ò»¸öJobGraphÊÇÒ»¸öFlink Dataflow£¬ËüÓɶà¸öJobVertex×é³ÉµÄDAG¡£ÆäÖУ¬Ò»¸öJobGraph°üº¬ÁËÒ»¸öFlink³ÌÐòµÄÈçÏÂÐÅÏ¢£ºJobID¡¢JobÃû³Æ¡¢ÅäÖÃÐÅÏ¢¡¢Ò»×éJobVertexµÈ¡£
×é¼þÕ»
FlinkÊÇÒ»¸ö·Ö²ã¼Ü¹¹µÄϵͳ£¬Ã¿Ò»²ãËù°üº¬µÄ×é¼þ¶¼ÌṩÁËÌØ¶¨µÄ³éÏó£¬ÓÃÀ´·þÎñÓÚÉϲã×é¼þ¡£Flink·Ö²ãµÄ×é¼þÕ»ÈçÏÂͼËùʾ£º

flink-component-stack
ÏÂÃæ£¬ÎÒÃÇ×Ô϶øÉÏ£¬·Ö±ðÕë¶Ôÿһ²ã½øÐнâÊÍ˵Ã÷£º
Deployment²ã
¸Ã²ãÖ÷񻃾¼°ÁËFlinkµÄ²¿Êðģʽ£¬FlinkÖ§³Ö¶àÖÖ²¿Êðģʽ£º±¾µØ¡¢¼¯Èº£¨Standalone/YARN£©¡¢ÔÆ£¨GCE/EC2£©¡£Standalone²¿ÊðģʽÓëSparkÀàËÆ£¬ÕâÀÎÒÃÇ¿´Ò»ÏÂFlink on YARNµÄ²¿Êðģʽ£¬ÈçÏÂͼËùʾ£º

flink-on-yarn
Á˽âYARNµÄ»°£¬¶ÔÉÏͼµÄÔÀí·Ç³£ÊìϤ£¬Êµ¼ÊFlinkҲʵÏÖÁËÂú×ãÔÚYARN¼¯ÈºÉÏÔËÐеĸ÷¸ö×é¼þ£ºFlink YARN Client¸ºÔðÓëYARN RMͨÐÅÐÉÌ×ÊÔ´ÇëÇó£¬Flink JobManagerºÍFlink TaskManager·Ö±ðÉêÇëµ½ContainerÈ¥ÔËÐи÷×ԵĽø³Ì¡£Í¨¹ýÉÏͼ¿ÉÒÔ¿´µ½£¬YARN AMÓëFlink JobManagerÔÚͬһ¸öContainerÖУ¬ÕâÑùAM¿ÉÒÔÖªµÀFlink JobManagerµÄµØÖ·£¬´Ó¶øAM¿ÉÒÔÉêÇëContainerÈ¥Æô¶¯Flink TaskManager¡£´ýFlink³É¹¦ÔËÐÐÔÚYARN¼¯ÈºÉÏ£¬Flink YARN Client¾Í¿ÉÒÔÌá½»Flink Jobµ½Flink JobManager£¬²¢½øÐкóÐøµÄÓ³Éä¡¢µ÷¶ÈºÍ¼ÆËã´¦Àí¡£
Runtime²ã
Runtime²ãÌṩÁËÖ§³ÖFlink¼ÆËãµÄÈ«²¿ºËÐÄʵÏÖ£¬±ÈÈ磺֧³Ö·Ö²¼Ê½Stream´¦Àí¡¢JobGraphµ½ExecutionGraphµÄÓ³Éä¡¢µ÷¶ÈµÈµÈ£¬ÎªÉϲãAPI²ãÌṩ»ù´¡·þÎñ¡£
API²ã
API²ãÖ÷ҪʵÏÖÁËÃæÏòÎÞ½çStreamµÄÁ÷´¦ÀíºÍÃæÏòBatchµÄÅú´¦ÀíAPI£¬ÆäÖÐÃæÏòÁ÷´¦Àí¶ÔÓ¦DataStream API£¬ÃæÏòÅú´¦Àí¶ÔÓ¦DataSet API¡£
Libraries²ã
¸Ã²ãÒ²¿ÉÒÔ³ÆÎªFlinkÓ¦Óÿò¼Ü²ã£¬¸ù¾ÝAPI²ãµÄ»®·Ö£¬ÔÚAPI²ãÖ®ÉϹ¹½¨µÄÂú×ãÌØ¶¨Ó¦ÓõÄʵÏÖ¼ÆËã¿ò¼Ü£¬Ò²·Ö±ð¶ÔÓ¦ÓÚÃæÏòÁ÷´¦ÀíºÍÃæÏòÅú´¦ÀíÁ½Àà¡£ÃæÏòÁ÷´¦ÀíÖ§³Ö£ºCEP£¨¸´ÔÓʼþ´¦Àí£©¡¢»ùÓÚSQL-likeµÄ²Ù×÷£¨»ùÓÚTableµÄ¹ØÏµ²Ù×÷£©£»ÃæÏòÅú´¦ÀíÖ§³Ö£ºFlinkML£¨»úÆ÷ѧϰ¿â£©¡¢Gelly£¨Í¼´¦Àí£©¡£
ÄÚ²¿ÔÀí
ÈÝ´í»úÖÆ
Flink»ùÓÚCheckpoint»úÖÆÊµÏÖÈÝ´í£¬ËüµÄÔÀíÊDz»¶ÏµØÉú³É·Ö²¼Ê½StreamingÊý¾ÝÁ÷Snapshot¡£ÔÚÁ÷´¦Àíʧ°Üʱ£¬Í¨¹ýÕâЩSnapshot¿ÉÒÔ»Ö¸´Êý¾ÝÁ÷´¦Àí¡£Àí½âFlinkµÄÈÝ´í»úÖÆ£¬Ê×ÏÈÐèÒªÁ˽âÒ»ÏÂBarrierÕâ¸ö¸ÅÄ
Stream BarrierÊÇFlink·Ö²¼Ê½SnapshottingÖеĺËÐÄÔªËØ£¬Ëü»á×÷ΪÊý¾ÝÁ÷µÄ¼Ç¼±»Í¬µÈ¿´´ý£¬±»²åÈëµ½Êý¾ÝÁ÷ÖУ¬½«Êý¾ÝÁ÷ÖмǼµÄ½øÐзÖ×飬²¢ÑØ×ÅÊý¾ÝÁ÷µÄ·½ÏòÏòÇ°ÍÆ½ø¡£Ã¿¸öBarrier»áЯ´øÒ»¸öSnapshot ID£¬ÊôÓÚ¸ÃSnapshotµÄ¼Ç¼»á±»ÍÆÏò¸ÃBarrierµÄǰ·½¡£ÒòΪBarrier·Ç³£ÇáÁ¿£¬ËùÒÔ²¢²»»áÖжÏÊý¾ÝÁ÷¡£´øÓÐBarrierµÄÊý¾ÝÁ÷£¬ÈçÏÂͼËùʾ£º

flink-stream-barriers
»ùÓÚÉÏͼ£¬ÎÒÃÇͨ¹ýÈçÏÂÒªµãÀ´ËµÃ÷£º
³öÏÖÒ»¸öBarrier£¬ÔÚ¸ÃBarrier֮ǰ³öÏֵļǼ¶¼ÊôÓÚ¸ÃBarrier¶ÔÓ¦µÄSnapshot£¬ÔÚ¸ÃBarrierÖ®ºó³öÏֵļǼÊôÓÚÏÂÒ»¸öSnapshot
À´×Ô²»Í¬Snapshot¶à¸öBarrier¿ÉÄÜͬʱ³öÏÖÔÚÊý¾ÝÁ÷ÖУ¬Ò²¾ÍÊÇ˵ͬһ¸öʱ¿Ì¿ÉÄܲ¢·¢Éú³É¶à¸öSnapshot
µ±Ò»¸öÖм䣨Intermediate£©Operator½ÓÊÕµ½Ò»¸öBarrierºó£¬Ëü»á·¢ËÍBarrierµ½ÊôÓÚ¸ÃBarrierµÄSnapshotµÄÊý¾ÝÁ÷ÖУ¬µÈµ½Sink Operator½ÓÊÕµ½¸ÃBarrierºó»áÏòCheckpoint CoordinatorÈ·ÈϸÃSnapshot£¬Ö±µ½ËùÓеÄSink Operator¶¼È·ÈÏÁ˸ÃSnapshot£¬²Å±»ÈÏΪÍê³ÉÁ˸ÃSnapshot
ÕâÀﻹÐèҪǿµ÷µÄÊÇ£¬Snapshot²¢²»½ö½öÊǶÔÊý¾ÝÁ÷×öÁËÒ»¸ö״̬µÄCheckpoint£¬ËüÒ²°üº¬ÁËÒ»¸öOperatorÄÚ²¿Ëù³ÖÓеÄ״̬£¬ÕâÑù²ÅÄܹ»ÔÚ±£Ö¤ÔÚÁ÷´¦Àíϵͳʧ°ÜʱÄܹ»ÕýÈ·µØ»Ö¸´Êý¾ÝÁ÷´¦Àí¡£Ò²¾ÍÊÇ˵£¬Èç¹ûÒ»¸öOperator°üº¬ÈκÎÐÎʽµÄ״̬£¬ÕâÖÖ״̬±ØÐëÊÇSnapshotµÄÒ»²¿·Ö¡£
OperatorµÄ״̬°üº¬Á½ÖÖ£ºÒ»ÖÖÊÇϵͳ״̬£¬Ò»¸öOperator½øÐмÆËã´¦ÀíµÄʱºòÐèÒª¶ÔÊý¾Ý½øÐлº³å£¬ËùÒÔÊý¾Ý»º³åÇøµÄ״̬ÊÇÓëOperatorÏà¹ØÁªµÄ£¬ÒÔ´°¿Ú²Ù×÷µÄ»º³åÇøÎªÀý£¬Flinkϵͳ»áÊÕ¼¯»ò¾ÛºÏ¼Ç¼Êý¾Ý²¢·Åµ½»º³åÇøÖУ¬Ö±µ½¸Ã»º³åÇøÖеÄÊý¾Ý±»´¦ÀíÍê³É£»ÁíÒ»ÖÖÊÇÓû§×Ô¶¨Òå״̬£¨×´Ì¬¿ÉÒÔͨ¹ýת»»º¯Êý½øÐд´½¨ºÍÐ޸ģ©£¬Ëü¿ÉÒÔÊǺ¯ÊýÖеÄJava¶ÔÏóÕâÑùµÄ¼òµ¥±äÁ¿£¬Ò²¿ÉÒÔÊÇÓ뺯ÊýÏà¹ØµÄKey/Value״̬¡£
¶ÔÓÚ¾ßÓÐÇá΢״̬µÄStreamingÓ¦Ó㬻áÉú³É·Ç³£ÇáÁ¿µÄSnapshot¶øÇҷdz£Æµ·±£¬µ«²¢²»»áÓ°ÏìÊý¾ÝÁ÷´¦ÀíÐÔÄÜ¡£StreamingÓ¦ÓõÄ״̬»á±»´æ´¢µ½Ò»¸ö¿ÉÅäÖõĴ洢ϵͳÖУ¬ÀýÈçHDFS¡£ÔÚÒ»¸öCheckpointÖ´Ðйý³ÌÖУ¬´æ´¢µÄ״̬ÐÅÏ¢¼°Æä½»»¥¹ý³Ì£¬ÈçÏÂͼËùʾ£º

flink-checkpointing
ÔÚCheckpoint¹ý³ÌÖУ¬»¹ÓÐÒ»¸ö±È½ÏÖØÒªµÄ²Ù×÷¡ª¡ªStream Aligning¡£µ±Operator½ÓÊÕµ½¶à¸öÊäÈëµÄÊý¾ÝÁ÷ʱ£¬ÐèÒªÔÚSnapshot BarrierÖжÔÊý¾ÝÁ÷½øÐÐÅÅÁÐ¶ÔÆë£¬ÈçÏÂͼËùʾ£º

flink-stream-aligning
¾ßÌåÅÅÁйý³ÌÈçÏ£º
Operator´ÓÒ»¸öincoming Stream½ÓÊÕµ½Snapshot Barrier n£¬È»ºóÔÝÍ£´¦Àí£¬Ö±µ½ÆäËüµÄincoming StreamµÄBarrier n£¨·ñÔòÊôÓÚ2¸öSnapshotµÄ¼Ç¼¾Í»ìÔÚÒ»ÆðÁË£©µ½´ï¸ÃOperator
½ÓÊÕµ½Barrier nµÄStream±»ÁÙʱ¸éÖã¬À´×ÔÕâЩStreamµÄ¼Ç¼²»»á±»´¦Àí£¬¶øÊDZ»·ÅÔÚÒ»¸öBufferÖÐ
Ò»µ©×îºóÒ»¸öStream½ÓÊÕµ½Barrier n£¬Operator»áemitËùÓÐÔÝ´æÔÚBufferÖеļǼ£¬È»ºóÏòCheckpoint Coordinator·¢ËÍSnapshot n
¼ÌÐø´¦ÀíÀ´×Ô¶à¸öStreamµÄ¼Ç¼
»ùÓÚStream Aligning²Ù×÷Äܹ»ÊµÏÖExactly OnceÓïÒ壬µ«ÊÇÒ²»á¸øÁ÷´¦ÀíÓ¦ÓôøÀ´ÑÓ³Ù£¬ÒòΪΪÁËÅÅÁÐ¶ÔÆëBarrier£¬»áÔÝʱ»º´æÒ»²¿·ÖStreamµÄ¼Ç¼µ½BufferÖУ¬ÓÈÆäÊÇÔÚÊý¾ÝÁ÷²¢ÐжȺܸߵij¡¾°Ï¿ÉÄܸü¼ÓÃ÷ÏÔ£¬Í¨³£ÒÔ×î³Ù¶ÔÆëBarrierµÄÒ»¸öStreamΪ´¦ÀíBufferÖлº´æ¼Ç¼µÄʱ¿Ìµã¡£ÔÚFlinkÖУ¬ÌṩÁËÒ»¸ö¿ª¹Ø£¬Ñ¡ÔñÊÇ·ñʹÓÃStream Aligning£¬Èç¹û¹ØµôÔòExactly Once»á±ä³ÉAt least once¡£
µ÷¶È»úÖÆ
ÔÚJobManager¶Ë£¬»á½ÓÊÕµ½ClientÌá½»µÄJobGraphÐÎʽµÄFlink Job£¬JobManager»á½«Ò»¸öJobGraphת»»Ó³ÉäΪһ¸öExecutionGraph£¬ÈçÏÂͼËùʾ£º

flink-job-and-execution-graph
ͨ¹ýÉÏͼ¿ÉÒÔ¿´³ö£º
JobGraphÊÇÒ»¸öJobµÄÓû§Âß¼ÊÓͼ±íʾ£¬½«Ò»¸öÓû§Òª¶ÔÊý¾ÝÁ÷½øÐеĴ¦Àí±íʾΪµ¥¸öDAGͼ£¨¶ÔÓ¦ÓÚJobGraph£©£¬DAGͼÓɶ¥µã£¨JobVertex£©ºÍÖмä½á¹û¼¯£¨IntermediateDataSet£©×é³É£¬ÆäÖÐJobVertex±íʾÁ˶ÔÊý¾ÝÁ÷½øÐеÄת»»²Ù×÷£¬±ÈÈçmap¡¢flatMap¡¢filter¡¢keyByµÈ²Ù×÷£¬¶øIntermediateDataSetÊÇÓÉÉÏÓεÄJobVertexËùÉú³É£¬Í¬Ê±×÷ΪÏÂÓεÄJobVertexµÄÊäÈë¡£
¶øExecutionGraphÊÇJobGraphµÄ²¢Ðбíʾ£¬Ò²¾ÍÊÇʵ¼ÊJobManagerµ÷¶ÈÒ»¸öJobÔÚTaskManagerÉÏÔËÐеÄÂß¼ÊÓͼ£¬ËüÒ²ÊÇÒ»¸öDAGͼ£¬ÊÇÓÉExecutionJobVertex¡¢IntermediateResult£¨»òIntermediateResultPartition£©×é³É£¬ExecutionJobVertexʵ¼Ê¶ÔÓ¦ÓÚJobGraphͼÖеÄJobVertex£¬Ö»²»¹ýÔÚExecutionJobVertexÄÚ²¿ÊÇÒ»ÖÖ²¢Ðбíʾ£¬Óɶà¸ö²¢ÐеÄExecutionVertexËù×é³É¡£ÁíÍ⣬ÕâÀﻹÓÐÒ»¸öÖØÒªµÄ¸ÅÄ¾ÍÊÇExecution£¬ËüÊÇÒ»¸öExecutionVertexµÄÒ»´ÎÔËÐÐAttempt£¬Ò²¾ÍÊÇ˵£¬Ò»¸öExecutionVertex¿ÉÄܶÔÓ¦¶à¸öÔËÐÐ״̬µÄExecution£¬±ÈÈ磬һ¸öExecutionVertexÔËÐвúÉúÁËÒ»¸öʧ°ÜµÄExecution£¬È»ºó»¹»á´´½¨Ò»¸öеÄExecutionÀ´ÔËÐУ¬Õâʱ¾Í¶ÔÓ¦Õâ¸ö2´ÎÔËÐÐAttempt¡£Ã¿¸öExecutionͨ¹ýExecutionAttemptIDÀ´Î¨Ò»±êʶ£¬ÔÚTaskManagerºÍJobManagerÖ®¼ä½øÐÐTask״̬µÄ½»»»¶¼ÊÇͨ¹ýExecutionAttemptIDÀ´ÊµÏֵġ£
ÏÂÃæ¿´Ò»Ï£¬ÔÚÎïÀíÉϽøÐе÷¶È£¬»ùÓÚ×ÊÔ´µÄ·ÖÅäÓëʹÓõÄÒ»¸öÀý×Ó£¬À´×Ô¹ÙÍø£¬ÈçÏÂͼËùʾ£º

flink-scheduled-task-slots
˵Ã÷ÈçÏ£º
×óÉÏ×Óͼ£ºÓÐ2¸öTaskManager£¬Ã¿¸öTaskManagerÓÐ3¸öTask Slot
×óÏÂ×Óͼ£ºÒ»¸öFlink Job£¬Âß¼Éϰüº¬ÁË1¸ödata source¡¢1¸öMapFunction¡¢1¸öReduceFunction£¬¶ÔÓ¦Ò»¸öJobGraph
×óÏÂ×Óͼ£ºÓû§Ìá½»µÄFlink Job¶Ô¸÷¸öOperator½øÐеÄÅäÖ᪡ªdata sourceµÄ²¢ÐжÈÉèÖÃΪ4£¬MapFunctionµÄ²¢ÐжÈҲΪ4£¬ReduceFunctionµÄ²¢ÐжÈΪ3£¬ÔÚJobManager¶Ë¶ÔÓ¦ÓÚExecutionGraph
ÓÒÉÏ×Óͼ£ºTaskManager 1ÉÏ£¬ÓÐ2¸ö²¢ÐеÄExecutionVertex×é³ÉµÄDAGͼ£¬ËüÃǸ÷Õ¼ÓÃÒ»¸öTask Slot
ÓÒÏÂ×Óͼ£ºTaskManager 2ÉÏ£¬Ò²ÓÐ2¸ö²¢ÐеÄExecutionVertex×é³ÉµÄDAGͼ£¬ËüÃÇÒ²¸÷Õ¼ÓÃÒ»¸öTask Slot
ÔÚ2¸öTaskManagerÉÏÔËÐеÄ4¸öExecutionÊDz¢ÐÐÖ´ÐеÄ
µü´ú»úÖÆ
»úÆ÷ѧϰºÍͼ¼ÆËãÓ¦Ó㬶¼»áʹÓõ½µü´ú¼ÆË㣬Flinkͨ¹ýÔÚµü´úOperatorÖж¨ÒåStepº¯ÊýÀ´ÊµÏÖµü´úËã·¨£¬ÕâÖÖµü´úËã·¨°üÀ¨IterateºÍDelta IterateÁ½ÖÖÀàÐÍ£¬ÔÚʵÏÖÉÏËüÃÇ·´¸´µØÔÚµ±Ç°µü´ú״̬Éϵ÷ÓÃStepº¯Êý£¬Ö±µ½Âú×ã¸ø¶¨µÄÌõ¼þ²Å»áÍ£Ö¹µü´ú¡£ÏÂÃæ£¬¶ÔIterateºÍDelta IterateÁ½ÖÖÀàÐ͵ĵü´úËã·¨ÔÀí½øÐÐ˵Ã÷£º
Iterate
Iterate OperatorÊÇÒ»ÖÖ¼òµ¥µÄµü´úÐÎʽ£ºÃ¿Ò»ÂÖµü´ú£¬Stepº¯ÊýµÄÊäÈë»òÕßÊÇÊäÈëµÄÕû¸öÊý¾Ý¼¯£¬»òÕßÊÇÉÏÒ»ÂÖµü´úµÄ½á¹û£¬Í¨¹ý¸ÃÂÖµü´ú¼ÆËã³öÏÂÒ»ÂÖ¼ÆËãËùÐèÒªµÄÊäÈ루Ҳ³ÆÎªNext Partial Solution£©£¬Âú×ãµü´úµÄÖÕÖ¹Ìõ¼þºó£¬»áÊä³ö×îÖÕµü´ú½á¹û£¬¾ßÌåÖ´ÐÐÁ÷³ÌÈçÏÂͼËùʾ£º

flink-iterations-iterate-operator
Stepº¯ÊýÔÚÿһÂÖµü´úÖж¼»á±»Ö´ÐУ¬Ëü¿ÉÒÔÊÇÓÉmap¡¢reduce¡¢joinµÈOperator×é³ÉµÄÊý¾ÝÁ÷¡£ÏÂÃæÍ¨¹ý¹ÙÍø¸ø³öµÄÒ»¸öÀý×ÓÀ´ËµÃ÷Iterate Operator£¬·Ç³£¼òµ¥Ö±¹Û£¬ÈçÏÂͼËùʾ£º

flink-iterations-iterate-operator-example
ÉÏÃæµü´ú¹ý³ÌÖУ¬ÊäÈëÊý¾ÝΪ1µ½5µÄÊý×Ö£¬Stepº¯Êý¾ÍÊÇÒ»¸ö¼òµ¥µÄmapº¯Êý£¬»á¶Ôÿ¸öÊäÈëµÄÊý×Ö½øÐмÓ1´¦Àí£¬¶øNext Partial Solution¶ÔÓ¦ÓÚ¾¹ýmapº¯Êý´¦ÀíºóµÄ½á¹û£¬±ÈÈçµÚÒ»ÂÖµü´ú£¬¶ÔÊäÈëµÄÊý×Ö1¼Ó1ºó½á¹ûΪ2£¬¶ÔÊäÈëµÄÊý×Ö2¼Ó1ºó½á¹ûΪ3£¬Ö±µ½¶ÔÊäÈëÊý×Ö5¼Ó1ºó½á¹ûΪ±äΪ6£¬ÕâЩÐÂÉú³É½á¹ûÊý×Ö2~6»á×÷ΪµÚ¶þÂÖµü´úµÄÊäÈë¡£µü´úÖÕÖ¹Ìõ¼þΪ½øÐÐ10ÂÖµü´ú£¬Ôò×îÖյĽá¹ûΪ11~15¡£
Delta Iterate
Delta Iterate OperatorʵÏÖÁËÔöÁ¿µü´ú£¬ËüµÄʵÏÖÔÀíÈçÏÂͼËùʾ£º

flink-iterations-delta-iterate-operator
»ùÓÚDelta Iterate OperatorʵÏÖÔöÁ¿µü´ú£¬ËüÓÐ2¸öÊäÈ룬ÆäÖÐÒ»¸öÊdzõʼWorkset£¬±íʾÊäÈë´ý´¦ÀíµÄÔöÁ¿StreamÊý¾Ý£¬ÁíÒ»¸öÊdzõʼSolution Set£¬ËüÊǾ¹ýStream·½ÏòÉÏOperator´¦Àí¹ýµÄ½á¹û¡£µÚÒ»ÂÖµü´ú»á½«Stepº¯Êý×÷ÓÃÔÚ³õʼWorksetÉÏ£¬µÃµ½µÄ¼ÆËã½á¹ûWorkset×÷ΪÏÂÒ»ÂÖµü´úµÄÊäÈ룬ͬʱ»¹ÒªÔöÁ¿¸üгõʼSolution Set¡£Èç¹û·´¸´µü´úÖªµÀÂú×ãµü´úÖÕÖ¹Ìõ¼þ£¬×îºó»á¸ù¾ÝSolution SetµÄ½á¹û£¬Êä³ö×îÖÕµü´ú½á¹û¡£
±ÈÈ磬ÎÒÃÇÏÖÔÚÒÑÖªÒ»¸öSolution¼¯ºÏÖб£´æµÄÊÇ£¬ÒÑÓеÄÉÌÆ··ÖÀà´óÀàÖйºÂòÁ¿×î¶àµÄÉÌÆ·£¬¶øWorksetÊäÈëµÄÊÇÀ´×ÔÏßÉÏʵʱ½»Ò×ÖÐ×îдï³É¹ºÂòµÄÉÌÆ·µÄÈËÊý£¬¾¹ý¼ÆËã»áÉú³ÉеÄÉÌÆ··ÖÀà´óÀàÖÐÉÌÆ·¹ºÂòÁ¿×î¶àµÄ½á¹û£¬Èç¹ûijЩ´óÀàÖÐÉÌÆ·¹ºÂòÁ¿Í»È»Ôö³¤£¬ËüÐèÒª¸üÐÂSolution SetÖеĽá¹û£¨ÔÀ´¹ºÂòÁ¿×î¶àµÄÉÌÆ·£¬¾¹ýÔöÁ¿µü´ú¼ÆË㣬¿ÉÄÜÒѾ²»ÊÇ×î¶à£©£¬×îºó»áÊä³ö×îÖÕÉÌÆ··ÖÀà´óÀàÖйºÂòÁ¿×î¶àµÄÉÌÆ·½á¹û¼¯ºÏ¡£¸üÏêϸµÄÀý×Ó£¬¿ÉÒԲο¼¹ÙÍø¸ø³öµÄ¡°Propagate Minimum in Graph¡±£¬ÕâÀï²»ÔÙÀÛÊö¡£
Backpressure¼à¿Ø
BackpressureÔÚÁ÷ʽ¼ÆËãϵͳÖлá±È½ÏÊܵ½¹Ø×¢£¬ÒòΪÔÚÒ»¸öStreamÉϽøÐд¦ÀíµÄ¶à¸öOperatorÖ®¼ä£¬ËüÃÇ´¦ÀíËٶȺͷ½Ê½¿ÉÄܷdz£²»Í¬£¬ËùÒԾʹæÔÚÉÏÓÎOperatorÈç¹û´¦ÀíËٶȹý¿ì£¬ÏÂÓÎOperator´¦¿ÉÄÜ»ú»á¶Ñ»ýStream¼Ç¼£¬ÑÏÖØ»áÔì³É´¦ÀíÑÓ³Ù»òÏÂÓÎOperator¸ºÔعýÖØ¶ø±ÀÀ££¨ÓÐЩϵͳ¿ÉÄܻᶪʧÊý¾Ý£©¡£Òò´Ë£¬¶ÔÏÂÓÎOperator´¦ÀíËٶȸú²»ÉϵÄÇé¿ö£¬Èç¹ûÏÂÓÎOperatorÄܹ»½«×Ô¼º´¦Àí״̬´«²¥¸øÉÏÓÎOperator£¬Ê¹µÃÉÏÓÎOperator´¦ÀíËÙ¶ÈÂýÏÂÀ´¾Í»á»º½âÉÏÊöÎÊÌ⣬±ÈÈçͨ¹ý¸æ¾¯µÄ·½Ê½Í¨ÖªÏÖÓÐÁ÷´¦Àíϵͳ´æÔÚµÄÎÊÌâ¡£
Flink Web½çÃæÉÏÌṩÁ˶ÔÔËÐÐJobµÄBackpressureÐÐΪµÄ¼à¿Ø£¬Ëüͨ¹ýʹÓÃSamplingÏ̶߳ÔÕýÔÚÔËÐеÄTask½øÐжÑÕ»¸ú×Ù²ÉÑùÀ´ÊµÏÖ£¬¾ßÌåʵÏÖ·½Ê½ÈçÏÂͼËùʾ£º

flink-back-pressure-sampling
JobManager»á·´¸´µ÷ÓÃÒ»¸öJobµÄTaskÔËÐÐËùÔÚÏ̵߳ÄThread.getStackTrace()£¬Ä¬ÈÏÇé¿öÏ£¬JobManager»áÿ¼ä¸ô50ms´¥·¢¶ÔÒ»¸öJobµÄÿ¸öTaskÒÀ´Î½øÐÐ100´Î¶ÑÕ»¸ú×Ùµ÷Ó㬸ù¾Ýµ÷Óõ÷Óýá¹ûÀ´È·¶¨Backpressure£¬FlinkÊÇͨ¹ý¼ÆËãµÃµ½Ò»¸ö±ÈÖµ£¨Radio£©À´È·¶¨µ±Ç°ÔËÐÐJobµÄBackpressure״̬¡£ÔÚWeb½çÃæÉÏ¿ÉÒÔ¿´µ½Õâ¸öRadioÖµ£¬Ëü±íʾÔÚÒ»¸öÄÚ²¿·½·¨µ÷ÓÃÖÐ×èÈû£¨Stuck£©µÄ¶ÑÕ»¸ú×Ù´ÎÊý£¬ÀýÈ磬radio=0.01£¬±íʾ100´ÎÖнöÓÐ1´Î·½·¨µ÷ÓÃ×èÈû¡£FlinkĿǰ¶¨ÒåÁËÈçÏÂBackpressure״̬£º
OK: 0 <= Ratio <= 0.10
LOW: 0.10 < Ratio <= 0.5
HIGH: 0.5 < Ratio <= 1
ÁíÍ⣬Flink»¹ÌṩÁË3¸ö²ÎÊýÀ´ÅäÖÃBackpressure¼à¿ØÐÐΪ£º

²ÎÊýÃû³Æ ĬÈÏÖµ ˵Ã÷
jobmanager.web.backpressure.refresh-interval 60000 ĬÈÏ1·ÖÖÓ£¬±íʾ²ÉÑùͳ¼Æ½á¹ûË¢ÐÂʱ¼ä¼ä¸ô
jobmanager.web.backpressure.num-samples 100 ÆÀ¹ÀBackpressure״̬£¬ËùʹÓõĶÑÕ»¸ú×Ùµ÷ÓôÎÊý
jobmanager.web.backpressure.delay-between-samples 50 ĬÈÏ50ºÁÃ룬±íʾ¶ÔÒ»¸öJobµÄÿ¸öTaskÒÀ´Îµ÷ÓõÄʱ¼ä¼ä¸ô
ͨ¹ýÉÏÃæ¸ö¶¨ÒåµÄBackpressure״̬£¬ÒÔ¼°µ÷ÕûÏàÓ¦µÄ²ÎÊý£¬¿ÉÒÔÈ·¶¨µ±Ç°ÔËÐеÄJobµÄ״̬ÊÇ·ñÕý³££¬²¢ÇÒ±£Ö¤²»Ó°ÏìJobManagerÌṩ·þÎñ¡£ |