±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËFlinkµÄ»ù±¾¼Ü¹¹ÒÔ¼°FlinkÖ´ÐеĻù±¾ÔÀí£¬ÖØµã˵Ã÷ÁËFlinkʵÏÖ¸ßÐÔÄܵÄһЩ»ù±¾ÔÀí¡£
±¾ÎÄÀ´×Ôcsdn£¬ÓÉ»ðÁú¹ûÈí¼þLuca±à¼¡¢ÍƼö¡£ |
|
FlinkÊÇеÄstream¼ÆËãÒýÇæ£¬ÓÃjavaʵÏÖ¡£¼È¿ÉÒÔ´¦Àístream
dataÒ²¿ÉÒÔ´¦Àíbatch data£¬¿ÉÒÔͬʱ¼æ¹ËSparkÒÔ¼°Spark streamingµÄ¹¦ÄÜ£¬ÓëSpark²»Í¬µÄÊÇ£¬Flink±¾ÖÊÉÏÖ»ÓÐstreamµÄ¸ÅÄbatch±»ÈÏΪÊÇspecial
stream¡£FlinkÔÚÔËÐÐÖÐÖ÷ÒªÓÐÈý¸ö×é¼þ×é³É£¬JobClient£¬JobManager ºÍ TaskManager¡£Ö÷Òª¹¤×÷ÔÀíÈçÏÂͼ
Óû§Ê×ÏÈÌá½»Flink³ÌÐòµ½JobClient£¬¾¹ýJobClientµÄ´¦Àí¡¢½âÎö¡¢ÓÅ»¯Ìá½»µ½JobManager£¬×îºóÓÉTaskManagerÔËÐÐtask¡£
JobClient
JobClientÊÇFlink³ÌÐòºÍJobManager½»»¥µÄÇÅÁº£¬Ö÷Òª¸ºÔð½ÓÊÕ³ÌÐò¡¢½âÎö³ÌÐòµÄÖ´Ðмƻ®¡¢ÓÅ»¯³ÌÐòµÄÖ´Ðмƻ®£¬È»ºóÌá½»Ö´Ðмƻ®µ½JobManager¡£ÎªÁËÁ˽âFlinkµÄ½âÎö¹ý³Ì£¬ÐèÒª¼òµ¥½éÉÜÒ»ÏÂFlinkµÄOperator£¬ÔÚFlinkÖ÷ÒªÓÐÈýÀàOperator£¬
Source Operator £¬¹ËÃû˼ÒåÕâÀà²Ù×÷Ò»°ãÊÇÊý¾ÝÀ´Ô´²Ù×÷£¬±ÈÈçÎļþ¡¢socket¡¢kafkaµÈ£¬Ò»°ã´æÔÚÓÚ³ÌÐòµÄ×ʼ
Transformation Operator ÕâÀà²Ù×÷Ö÷Òª¸ºÔðÊý¾Ýת»»£¬map£¬flatMap£¬reduceµÈËã×Ó¶¼ÊôÓÚTransformation
Operator£¬
Sink Operator£¬Òâ˼ÊÇϳÁ²Ù×÷£¬ÕâÀà²Ù×÷Ò»°ãÊÇÊý¾ÝÂ䵨£¬Êý¾Ý´æ´¢µÄ¹ý³Ì£¬·ÅÔÚJob×îºó£¬±ÈÈçÊý¾ÝÂ䵨µ½Hdfs¡¢Mysql¡¢KafkaµÈµÈ¡£
Flink»á½«³ÌÐòÖÐÿһ¸öËã¼Æ½âÎö³ÉOperator£¬È»ºó°´ÕÕËã×ÓÖ®¼äµÄ¹ØÏµ£¬½«operator×éºÏÆðÀ´£¬ÐγÉÒ»¸öOperator×éºÏ³ÉµÄGraph¡£ÈçÏÂÃæµÄ´úÂë½âÎöÖ®ºóÐγɵÄÖ´Ðмƻ®£¬
DataStream<String>
data = env.addSource(...);
data.map(x->new Tuple2(x,1)).keyBy(0).timeWindow
(Time.seconds(60)).sum(1).addSink(...) |

½âÎöÐγÉÖ´Ðмƻ®Ö®ºó£¬JobClientµÄÈÎÎñ»¹Ã»ÓÐÍ꣬»¹¸ºÔðÖ´Ðмƻ®µÄÓÅ»¯£¬ÕâÀïÖ´ÐеÄÖ÷ÒªÓÅ»¯Êǽ«ÏàÁÚµÄOperatorÈںϣ¬ÐγÉOperatorChain£¬ÒòΪFlinkÊÇ·Ö²¼Ê½ÔËÐе쬳ÌÐòÖÐÿһ¸öËã×Ó£¬ÔÚʵ¼ÊÖ´ÐÐÖб»·Ö¸ôΪ¶à¸öSubTask£¬Êý¾ÝÁ÷ÔÚËã×ÓÖ®¼äµÄÁ÷¶¯£¬¾Í¶ÔÓ¦µ½SubTaskÖ®¼äµÄÊý¾Ý´«µÝ£¬SubTaskÖ®¼ä½øÐÐÊý¾Ý´«µÝģʽÓÐÁ½ÖÖÒ»ÖÖÊÇone-to-oneµÄ£¬Êý¾Ý²»ÐèÒªÖØÐ·ֲ¼£¬Ò²¾ÍÊÇÊý¾Ý²»ÐèÒª¾¹ýIO£¬½Úµã±¾µØ¾ÍÄÜÍê³É£¬±ÈÈçÉÏͼÖеÄsourceµ½map£¬Ò»ÖÖÊÇre-distributed£¬Êý¾ÝÐèҪͨ¹ýshuffle¹ý³ÌÖØÐ·ÖÇø£¬ÐèÒª¾¹ýIO£¬±ÈÈçÉÏͼÖеÄmapµ½keyBy¡£ÏÔÈ»re-distributedÕâÖÖģʽ¸ü¼ÓÀË·Ñʱ¼ä£¬Í¬Ê±Ó°ÏìÕû¸öJobµÄÐÔÄÜ¡£ËùÒÔ£¬FlinkΪÁËÌá¸ßÐÔÄÜ£¬½«one-to-one¹ØÏµµÄǰºóÁ½Ààsubtask£¬ÈÚºÏÐγÉÒ»¸ötask¡£¶øTaskManagerÖÐÒ»¸ötaskÔËÐÐÒ»¸ö¶ÀÁ¢µÄÏß³ÌÖУ¬Í¬Ò»¸öÏß³ÌÖеÄSubTask½øÐÐÊý¾Ý´«µÝ£¬²»ÐèÒª¾¹ýIO£¬²»ÐèÒª¾¹ýÐòÁл¯£¬Ö±½Ó·¢ËÍÊý¾Ý¶ÔÏóµ½ÏÂÒ»¸öSubTask£¬ÐÔÄܵõ½ÌáÉý£¬³ý´ËÖ®Í⣬subTaskµÄÈںϿÉÒÔ¼õÉÙtaskµÄÊýÁ¿£¬Ìá¸ßtaskManagerµÄ×ÊÔ´ÀûÓÃÂÊ¡£Í¼1.0ÖеÄÖ´Ðмƻ®£¬ÓÅ»¯½á¹ûÈçÏÂͼ£¬FlinkµÄsubTaskÈںϹæÔò¿ÉÒԲο¼¹Ù·½Îĵµ¡£
ÖµµÃ×¢ÒâµÄÊÇ£¬²¢²»ÊÇÿһ¸öSubTask¶¼¿ÉÒÔ±»Èںϣ¬¶ÔÓÚ²»ÄÜÈںϵÄSubTask»á¶ÀÁ¢ÐγÉÒ»¸öTaskÔËÐÐÔÚTaskManagerÖС£
¸Ä±äoperatorµÄ²¢Ðжȣ¬¿ÉÄܻᵼÖ²»Í¬µÄÓÅ»¯½á¹û£¬Í¬Ê±ÕâÒ²ÊÇÐÔÄܵ÷ÓŵÄÒ»¸öÖØÒª·½Ê½£¬ÀýÈç²»ÏÔʽÉèÖÃoperatorµÄ²¢ÐжȵÄʱºò£¬Ä¬ÈÏËùÓÐËã×ӵIJ¢ÐжÈÊÇÒ»ÑùµÄ£¬ËùÒÔ»áÓÐÏÂͼÖеÄÓÅ»¯½á¹û¡£

ÎÒÃÇÀ´·ÖÎöÒ»ÏÂĬÈÏÇé¿öÏ¿ÉÄÜ·¢ÉúµÄÎÊÌ⣬¼ÙÈçÉèÖÃ×÷ÒµµÄ²¢ÐжÈΪ10£¬sourceÃ÷ȷΪkafka£¬¶ÔÓ¦topicÖ»ÓÐÒ»¸ötopic£¬ÒòΪsourceĬÈÏ»á¸ù¾ÝtopicµÄ·ÖÇøÊý£¬¾ö¶¨×Ô¼ºµÄ·ÖÇøÊý£¬ÄÇô10¸ösource
subtaskÖ»ÓÐÒ»¸ö»á¹¤×÷£¬¶øÇÒÈÎÎñ±È½ÏÖØ¡£ÕâÑù»áµ¼ÖºóÃæµÄmapʵ¼ÊÒ²ÊÇÓÐÒ»¸ösubTaskÔÚ¹¤×÷£¬´¦ÀíËùÓеÄÊý¾Ý£¬¼ÙÈçmapÖеÄÈÎÎñ±È½ÏÖØ£¬ÄÇô»áµ¼ÖÂÊý¾ÝÇãб£¬ÐÔÄܵÍÏ¡£ÔÚsource²»ÄܸÄÔìµÄÇé¿öÏ£¬ÎÒÃÇÏÔʽ¼õÉÙsourceµÄ²¢Ðжȣ¨ÎªÁ˽ÚÊ¡×ÊÔ´£¬ÉèÖÃ1£©£¬Ìá¸ßmapµÄ²¢Ðжȣ¨Ôö¼Ó´¦ÀíËÙ¶È£¬ÉèΪ20£©¡£µÚÒ»ÑÛ¿´ÉÏÈ¥£¬¸Ð¾õÐÔÄÜÌáÉýÁ˲»ÉÙ£¬µ«ÊÇÔÚʵ¼ÊÇé¿öÖÐÈ´²»Ò»¶¨ÕâÑù¡£ÒòΪµ÷ÕûsourceºÍmapµÄ²¢·¢¶È£¬Ê§È¥ÁËÔÓÐone-to-oneÊý¾Ý´«µÝµÄÓÅÊÆ£¬µ¼ÖÂsubTask²»ÄÜÈںϣ¬Êý¾ÝÐèÒªreblance£¬²úÉú´óÁ¿µÄIO£¬ËùÒÔÐ޸IJ¢ÐжÈÒ²²»Ò»¶¨¿ÉÒÔÌáÉýÐÔÄÜ¡£Ð޸IJ¢ÐжÈÖ®ºó£¬Ö´Ðмƻ®µÄÓÅ»¯½á¹ûÈçÏÂͼ¡£ËùÒÔÔÚʵ¼ÊÓÅ»¯µÄ¹ý³ÌÖУ¬»¹ÊÇҪעÒâ½áºÏÊý¾Ý·Ö²¼ºÍÖ´Ðмƻ®µ÷ÓÅ£¬Àí½âFlinkÖ´Ðмƻ®µÄÉú³É¹ý³ÌºÜÓбØÒª¡£

JobManager
JobManagerÊÇÒ»¸ö½ø³Ì£¬Ö÷Òª¸ºÔðÉêÇë×ÊÔ´£¬Ðµ÷ÒÔ¼°¿ØÖÆÕû¸öjobµÄÖ´Ðйý³Ì£¬¾ßÌå°üÀ¨£¬µ÷¶ÈÈÎÎñ¡¢´¦Àícheckpoint¡¢ÈÝ´íµÈµÈ£¬ÔÚ½ÓÊÕµ½JobClientÌá½»µÄÖ´Ðмƻ®Ö®ºó£¬Õë¶ÔÊÕµ½µÄÖ´Ðмƻ®£¬¼ÌÐø½âÎö£¬ÒòΪJobClientÖ»ÊÇÐγÉÒ»¸öoperaor²ãÃæµÄÖ´Ðмƻ®£¬ËùÒÔJobManager¼ÌÐø½âÎöÖ´Ðмƻ®£¨¸ù¾ÝËã×ӵIJ¢·¢¶È£¬»®·Ötask£©£¬ÐγÉÒ»¸ö¿ÉÒÔ±»Êµ¼Êµ÷¶ÈµÄÓÉtask×é³ÉµÄÍØÆËͼ£¬ÈçÉÏͼ±»½âÎöÖ®ºóÐγÉÏÂͼµÄÖ´Ðмƻ®£¬×îºóÏò¼¯ÈºÉêÇë×ÊÔ´£¬Ò»µ©×ÊÔ´¾ÍÐ÷£¬¾Íµ÷¶Ètaskµ½TaskManager¡£

ΪÁ˱£Ö¤¸ß¿ÉÓã¬Ò»°ã»áÓжà¸öJobManager½ø³Ìͬʱ´æÔÚ£¬ËüÃÇÖ®¼äÒ²ÊDzÉÓÃÖ÷´Óģʽ£¬Ò»¸ö½ø³Ì±»Ñ¡¾ÙΪLeader£¬ÆäËû½ø³ÌΪfollower¡£JobÔËÐÐÆÚ¼ä£¬Ö»ÓÐLeaderÔÚ¹¤×÷£¬followerÔÚÏÐÖã¬Ò»µ©Leader¹Òµô£¬Ëæ¼´Òý·¢Ò»´ÎÑ¡¾Ù£¬²úÉúеÄLeader¼ÌÐø´¦ÀíJob¡£JobManager³ýÁ˵÷¶ÈÈÎÎñ£¬ÁíÍâÒ»¸öÖ÷Òª¹¤×÷¾ÍÊÇÈÝ´í£¬Ö÷ÒªÒÀ¿¿checkpoint½øÐÐÈÝ´í£¬checkpointÆäʵÊÇstreamÒÔ¼°executor£¨TaskManagerÖеÄSlot£©µÄ¿ìÕÕ£¬Ò»°ã½«checkpoint±£´æÔÚ¿É¿¿µÄ´æ´¢ÖУ¨±ÈÈçhdfs£©£¬ÎªÁËÈÝ´íFlink»á³ÖÐø½¨Á¢ÕâÀà¿ìÕÕ¡£µ±Flink×÷ÒµÖØÐÂÆô¶¯µÄʱºò£¬»áѰÕÒ×îпÉÓõÄcheckpointÀ´»Ö¸´Ö´ÐÐ״̬£¬ÒÑ´ïµ½Êý¾Ý²»¶ªÊ§£¬²»Öظ´£¬×¼È·±»´¦ÀíÒ»´ÎµÄÓïÒå¡£Ò»°ãÇé¿öÏ£¬¶¼²»»áÓõ½checkpoint£¬Ö»ÓÐÔÚÊý¾ÝÐèÒª»ýÀÛ»ò´¦ÀíÀúʷ״̬µÄʱºò£¬²ÅÐèÒªÉ趨checkpoint£¬±ÈÈçupdateStateByKeyÕâ¸öËã×Ó£¬Ä¬ÈÏ»áÆôÓÃcheckpoint£¬Èç¹ûûÓÐÅäÖÃcheckpointĿ¼µÄ»°£¬³ÌÐò»áÅ×Òì³£¡£
TaskManager
TaskManagerÊÇÒ»¸ö½ø³Ì£¬¼°Ò»¸öJVM£¨FlinkÓÃjavaʵÏÖ£©¡£Ö÷Òª×÷ÓÃÊǽÓÊÕ²¢Ö´ÐÐJobManager·¢Ë͵Ätask£¬²¢ÇÒÓëJobManagerͨÐÅ£¬·´À¡ÈÎÎñ״̬ÐÅÏ¢£¬±ÈÈçÈÎÎñ·ÖÖ´ÐÐÖУ¬Ö´ÐÐÍêµÈ״̬£¬ÉÏÎÄÌáµ½µÄcheckpointµÄ²¿·ÖÐÅÏ¢Ò²ÊÇTaskManager·´À¡¸øJobManagerµÄ¡£Èç¹û˵JobManagerÊÇmasterµÄ»°£¬ÄÇôTaskManager¾ÍÊÇworkerÖ÷ÒªÓÃÀ´Ö´ÐÐÈÎÎñ¡£ÔÚTaskManagerÄÚ¿ÉÒÔÔËÐжà¸ötask¡£¶à¸ötaskÔËÐÐÔÚÒ»¸öJVMÄÚÓм¸¸öºÃ´¦£¬Ê×ÏÈtask¿ÉÒÔͨ¹ý¶à·¸´Óõķ½Ê½TCPÁ¬½Ó£¬Æä´Îtask¿ÉÒÔ¹²Ïí½ÚµãÖ®¼äµÄÐÄÌøÐÅÏ¢£¬¼õÉÙÁËÍøÂç´«Êä¡£TaskManager²¢²»ÊÇ×îϸÁ£¶ÈµÄ¸ÅÄÿ¸öTaskManagerÏñÒ»¸öÈÝÆ÷Ò»Ñù£¬°üº¬Ò»¸ö¶à»ò¶à¸öSlot£¬Èçͼ1.2¡£

SlotÊÇTaskManager×ÊÔ´Á£¶ÈµÄ»®·Ö£¬Ã¿¸öSlot¶¼ÓÐ×Ô¼º¶ÀÁ¢µÄÄÚ´æ¡£ËùÓÐSlotƽ¾ù·ÖÅäTaskMangerµÄÄڴ棬±ÈÈçTaskManager·ÖÅ䏸SoltµÄÄÚ´æÎª8G£¬Á½¸öSlot£¬Ã¿¸öSlotµÄÄÚ´æÎª4G£¬ËĸöSlot£¬Ã¿¸öSlotµÄÄÚ´æÎª2G£¬ÖµµÃ×¢ÒâµÄÊÇ£¬Slot½ö»®·ÖÄڴ棬²»Éæ¼°cpuµÄ»®·Ö¡£Í¬Ê±SlotÊÇFlinkÖеÄÈÎÎñÖ´ÐÐÆ÷£¨ÀàËÆStormÖÐExecutor£©£¬Ã¿¸öSlot¿ÉÒÔÔËÐжà¸ötask£¬¶øÇÒÒ»¸ötask»áÒÔµ¥¶ÀµÄÏß³ÌÀ´ÔËÐС£SlotÖ÷ÒªµÄºÃ´¦ÓÐÒÔϼ¸µã£º
¿ÉÒÔÆðµ½¸ôÀëÄÚ´æµÄ×÷Ó㬷ÀÖ¹¶à¸ö²»Í¬jobµÄtask¾ºÕùÄÚ´æ¡£
SlotµÄ¸öÊý¾Í´ú±íÁËÒ»¸öFlink³ÌÐòµÄ×î¸ß²¢Ðжȣ¬¼ò»¯ÁËÐÔÄܵ÷ÓŵĹý³Ì
ÔÊÐí¶à¸öTask¹²ÏíSlot£¬ÌáÉýÁË×ÊÔ´ÀûÓÃÂÊ£¬¾ÙÒ»¸öʵ¼ÊµÄÀý×Ó£¬kafkaÓÐ3¸öpartition£¬¶ÔÓ¦flinkµÄsourceÓÐ3¸ötask£¬¶økeyByÎÒÃÇÉèÖõIJ¢ÐжÈΪ20£¬Õâ¸öʱºòÈç¹ûSlot²»Äܹ²ÏíµÄ»°£¬ÐèÒªÕ¼ÓÃ23¸öSlot£¬Èç¹ûÔÊÐí¹²ÏíµÄ»°£¬ÄÇôֻÐèÒª20¸öSlot¼´¿É£¨SlotµÄĬÈϹ²Ïí¹æÔò¼ÆËãΪ20¸ö£©¡£
¹²ÏíSlot£¬ËäÈ»ÔÚflinkÖÐÔÊÐítask¹²ÏíSlotÌáÉý×ÊÔ´ÀûÓÃÂÊ£¬µ«ÊÇÈç¹ûÒ»¸öSlotÖÐÈÝÄɹý¶àtask·´¶ø»áÔì³É×ÊÔ´µÍÏ£¨±ÈÈ缫¶ËÇé¿öÏÂËùÓÐtask¶¼·Ö²¼ÔÚÒ»¸öSlotÄÚ£©£¬ÔÚFlinkÖÐtaskÐèÒª°´ÕÕÒ»¶¨¹æÔò¹²ÏíSlot¡£¹²ÏíSlotµÄ·½Ê½ÓÐÁ½ÖÖ£¬SlotShardingGroupºÍCoLocationGroup£¬CoLocationGroupÕâÖÖ·½Ê½Ä¿Ç°»¹Ã»ÓнӴ¥¹ý£¬Èç¹û¸ÐÐËȤ¿ÉÒÔ²éÔĹٷ½Îĵµ¡£ÏÂÃæÖ÷Òª½éÉÜÒ»ÏÂSlotShardingGroupµÄÓ÷¨£¬ÕâÖÖ¹²ÏíµÄ»ù±¾Ë¼Â·¾ÍÊǸøoperator·Ö×飬ͬһ×éµÄ²»Í¬operatorµÄtask£¬¿ÉÒÔ¹²ÏíÒ»¸öSlot¡£Ä¬ÈÏËùÓеÄoperatorÊôÓÚͬһ¸ö×é¡°default¡±£¬¼°ËùÓÐoperatorµÄtask¿ÉÒÔ¹²ÏíÒ»¸öSlot£¬¿ÉÒÔ¸øoperatorÉèÖò»Í¬µÄgroup£¬·ÀÖ¹²»ºÏÀíµÄ¹²Ïí¡£FlinkÔÚµ÷¶Ètask·ÖÅäSlotµÄʱºòÓÐÁ½¸öÖØÒªÔÔò£º
ͬһ¸öjobÖУ¬Í¬Ò»¸ögroupÖв»Í¬operatorµÄtask¿ÉÒÔ¹²ÏíÒ»¸öSlot
FlinkÊǰ´ÕÕÍØÆË˳Ðò´ÓSourceÒÀ´Îµ÷¶Èµ½SinkµÄ
»¹ÄÃÉÏÊöµÄÀý×ÓÀ´ËµÃ÷Slot¹²ÏíÒÔ¼°taskµ÷¶ÈµÄÔÀí£¬Èçͼ1.3¼ÙÉèÓÐÁ½¸öTaskManager£¨TaskManager1ºÍTaskManager2£©£¬Ã¿¸öTaskManagerÓÐ2¸öSlot£¨Slot1ºÍSlot2£©¡£ÎªÁË·½±ãÀí½âSlot¹²ÏíµÄÁ÷³ÌÐèÒªÌáǰ¶¨ÒåoperatorµÄ²¢·¢¶È£¬À´¾ö¶¨taskµÄµ÷¶È˳Ðò¡£¼ÙÉèsource/mapµÄ²¢·¢¶ÈΪ2£¬keyBy/window/sinkµÄ²¢·¢¶ÈΪ4£¬ÄÇôµ÷¶ÈµÄ˳ÐòÒÀ´ÎΪsource/map[1]
->source/map[2] ->keyBy/window/sink[1]->keyBy/window/sink[2]->keyBy/window/sink[3]->keyBy/window/sink[4]¡£Èçͼ1.3ΪÁ˱ãÓÚ˵Ã÷Á÷³Ì£¬½«source/mapµÄ²¢·¢¶ÈÉèΪ4£¬keyBy/window/sinkµÄ²¢·¢¶ÈÉèΪ4¡£ÄÇôÊ×ÏÈ·ÖÅätask
source/map[1]£¬Õâ¸öʱºòSlotÖл¹Ã»ÓÐtask£¬·ÖÅäµ½TaskManager1ÖУ¬È»ºó·ÖÅäsource/map[2]£¬¸ù¾ÝSlot¹²Ïí¹æÔò£¬source/map[1]ºÍsource/map[2]
ÊôÓÚͬһoperatorµÄ²»Í¬task£¬ËùÒÔsource/map[2]²»Äܹ²ÏíSlot1£¬±»·ÖÅäµ½TaskManager1µÄSlot2£¬source/map[3]ºÍsource/map[4]ͬÑù»áÒÀ´Î·ÖÅ䲻ͬµÄSlot£¬½ÓÏÂÀ´·ÖÅäkeyBy/window/sink[1],¸ù¾ÝSlot¹²Ïí¹æÔò£¬Ëü¿ÉÒÔºÍsource/map[1]£¬¹²Ïíͬһ¸öslot£¬ËùÒÔÒ²±»·ÖÅäµ½TaskManager1µÄSlot1ÖУ¬keyBy/window/sinkµÄÆäËûÈÎÎñÒÀ´Î±»·ÖÅäµ½²»Í¬SlotÖС£Í¼1.4Ϊ²¢ÐжȷֱðÉèÖÃΪ2ºÍ4µÄ·ÖÅä¹ý³Ì£¬ÕâÀï²»ÔÙÕ¹¿ªËµÃ÷¡£
×ܽá
ÉÏÊöÄÚÈÝ£¬Ö÷Òª½éÉÜÁË£¬FlinkµÄ»ù±¾¼Ü¹¹ÒÔ¼°FlinkÖ´ÐеĻù±¾ÔÀí£¬ÖØµã˵Ã÷ÁËFlinkʵÏÖ¸ßÐÔÄܵÄһЩ»ù±¾ÔÀí£¬ÒòΪдµÄ±È½Ï´Ò棬ÈçÓдíÎóÖ®´¦£¬»¶Ó´ó¼ÒÆÀÂÛÖ¸Õý¡£ |