±à¼ÍƼö: |
±¾ÎÄÊ×ÏȽéÉÜÁ÷ʽ¼ÆËãµÄ»ù±¾¸ÅÄ
È»ºó½éÉÜ Flink µÄ¹Ø¼ü¼¼Êõ£¬×îºó½²½² Flink ÔÚ¿ìÊÖÉú²úʵ¼ùÖеÄһЩӦÓ㬰üÀ¨ÊµÊ±Ö¸±ê¼ÆËãºÍ¿ìËÙ
failover¡£
±¾ÎÄÀ´×ÔDBAplusÉçȺ£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
Ò»¡¢Á÷ʽ¼ÆËãµÄ½éÉÜ
Á÷ʽ¼ÆËãÖ÷ÒªÕë¶Ô unbounded data£¨ÎÞ½çÊý¾ÝÁ÷£©½øÐÐʵʱµÄ¼ÆË㣬½«¼ÆËã½á¹û¿ìËÙµÄÊä³ö»òÕßÐÞÕý¡£
Õⲿ·Ö½«·ÖΪÈý¸öС½ÚÀ´½éÉÜ¡£µÚÒ»£¬½éÉÜ´óÊý¾Ýϵͳ·¢Õ¹Ê·£¬°üÀ¨³õʼµÄÅú´¦Àíµ½ÏÖÔڱȽϳÉÊìµÄÁ÷¼ÆË㣻µÚ¶þ£¬Îª´ó¼Ò¼òµ¥¶Ô±ÈÏÂÅú´¦ÀíºÍÁ÷´¦ÀíµÄÇø±ð£»µÚÈý£¬½éÉÜÁ÷ʽ¼ÆËãÀïÃæµÄ¹Ø¼üÎÊÌ⣬ÕâÊÇÿ¸öÓÅÐãµÄÁ÷ʽ¼ÆËãÒýÇæËù±ØÐëÃæÁÙµÄÎÊÌâ¡£
1¡¢´óÊý¾Ýϵͳ·¢Õ¹Ê·

ÉÏͼÊÇ 2003 Äêµ½ 2018 Äê´óÊý¾ÝϵͳµÄ·¢Õ¹Ê·£¬¿´¿´ÊÇÔõôһ²½²½×ßµ½Á÷ʽ¼ÆËãµÄ¡£
2003 Ä꣬Google µÄ MapReduce ºá¿Õ³öÊÀ£¬Í¨¹ý¾µäµÄ Map&Reduce
¶¨ÒåºÍϵͳÈÝ´íµÈ±£ÕÏÀ´·½±ã´¦Àí¸÷ÖÖ´óÊý¾Ý¡£ºÜ¿ì¾Íµ½ÁË Hadoop£¬±»ÈÏΪÊÇ¿ªÔ´°æµÄ MapReduce£¬
´ø¶¯ÁËÕû¸öapache¿ªÔ´ÉçÇøµÄ·±ÈÙ¡£ÔÙÍùºóÊǹȸèµÄ Flume£¬Í¨¹ýËã×ÓÁ¬½ÓµÈ pipeline
µÄ·½Ê½½â¾öÁ˶à¸ö MapReduce ×÷ÒµÁ¬½Ó´¦ÀíµÍЧµÄÎÊÌâ¡£
Á÷ʽϵͳµÄ¿ªÊ¼ÒÔ Storm À´½éÉÜ¡£Storm ÔÚ2011Äê³öÏÖ£¬ ¾ß±¸ÑÓʱ¶Ì¡¢ÐÔÄܸߵÈÌØÐÔ£¬
ÔÚµ±Ê±ÆÄÊÜϲ°®¡£µ«ÊÇ Storm ûÓÐÌṩϵͳ¼¶±ðµÄ failover »úÖÆ£¬ÎÞ·¨±£ÕÏÊý¾ÝÒ»ÖÂÐÔ¡£ÄÇʱµÄÁ÷ʽ¼ÆËãÒýÇæÊDz»¾«È·µÄ£¬lamda
¼Ü¹¹×é×°ÁËÁ÷´¦ÀíµÄʵʱÐÔºÍÅú´¦ÀíµÄ׼ȷÐÔ£¬Ôø¾·çÃÒһʱ£¬ºóÀ´ÒòΪÄÑÒÔά»¤Ò²Öð½¥Ã»Âä¡£
½ÓÏÂÀ´³öÏÖµÄÊÇ Spark Streaming£¬¿ÉÒÔ˵ÊǵÚÒ»¸öÉú²ú¼¶±ðµÄÁ÷ʽ¼ÆËãÒýÇæ¡£Spark
Streaming ÔçÆÚµÄʵÏÖ»ùÓÚ³ÉÊìµÄÅú´¦Àí£¬Í¨¹ý mini batch À´ÊµÏÖÁ÷¼ÆË㣬ÔÚ failover
ʱÄܹ»±£ÕÏÊý¾ÝµÄÒ»ÖÂÐÔ¡£
Google ÔÚÁ÷ʽ¼ÆËã·½ÃæÓкܶà̽Ë÷£¬°üÀ¨ MillWheel¡¢Cloud Dataflow¡¢Beam£¬Ìá³öÁ˺ܶàÁ÷ʽ¼ÆËãµÄÀíÄ¶ÔÆäËûµÄÁ÷ʽ¼ÆËãÒýÇæÓ°ÏìºÜ´ó¡£
ÔÙÀ´¿´ Kafka¡£Kafka ²¢·ÇÁ÷ʽ¼ÆËãÒýÇæ£¬µ«ÊǶÔÁ÷ʽ¼ÆËãÓ°ÏìÌØ±ð´ó¡£Kafka »ùÓÚlog
»úÖÆ¡¢Í¨¹ý partition À´±£´æÊµÊ±Êý¾Ý£¬Í¬Ê±Ò²ÄÜ´æ´¢ºÜ³¤Ê±¼äµÄÀúÊ·Êý¾Ý¡£Á÷ʽ¼ÆËãÒýÇæ¿ÉÒÔÎÞ·ìµØÓëkafka½øÐжԽӣ¬Ò»µ©³öÏÖ
Failover£¬¿ÉÒÔÀûÓà Kafka ½øÐÐÊý¾Ý»ØËÝ£¬±£Ö¤Êý¾Ý²»¶ªÊ§¡£ÁíÍ⣬Kafka ¶Ô table
ºÍ stream µÄ̽Ë÷ÌØ±ð¶à£¬¶ÔÁ÷ʽ¼ÆËãÓ°Ïì¾Þ´ó¡£
Flink µÄ³öÏÖÒ²±È½Ï¾Ã£¬Ò»Ö±µ½ 2016 Äê×óÓҲŻðÆðÀ´µÄ¡£Flink ½è¼øÁ˺ܶà Google
µÄÁ÷ʽ¼ÆËã¸ÅÄʹµÃËüÔÚÊг¡ÉÏÌØ±ð¾ßÓоºÕùÁ¦¡£ºóÃæÎÒ»áÏêϸ½éÉÜ Flink µÄÒ»Ð©ÌØµã¡£
2¡¢Åú´¦ÀíÓëÁ÷¼ÆËãµÄÇø±ð
Åú´¦ÀíºÍÁ÷¼ÆËãÓÐʲôÑùµÄÇø±ð£¬ÕâÊǺܶàͬѧÓÐÒÉÎʵĵط½¡£ÎÒÃÇÖªµÀ MapReduce ÊÇÒ»¸öÅú´¦ÀíÒýÇæ£¬Flink
ÊÇÒ»¸öÁ÷´¦ÀíÒýÇæ¡£ÎÒÃÇ´ÓËĸö·½ÃæÀ´½øÐÐһ϶Աȣº
1£©Ê¹Óó¡¾°
MapReduce ÊÇ´óÅúÁ¿Îļþ´¦Àí£¬ÕâЩÎļþ¶¼ÊÇ bounded data£¬Ò²¾ÍÊÇ˵ÄãÖªµÀÕâ¸öÎļþʲôʱºò»á½áÊø¡£Ïà±È¶øÑÔ£¬Flink
´¦ÀíµÄÊÇʵʱµÄ unbounded data£¬Êý¾ÝÔ´Ô´²»¶Ï£¬¿ÉÄÜÓÀÔ¶¶¼²»»á½áÊø£¬Õâ¾Í¸øÊý¾ÝÍ걸ÐÔºÍ
failover ´øÀ´Á˺ܴóµÄÌôÕ½¡£

2£©ÈÝ´í
MapReduce µÄÈÝ´íÊֶΰüÀ¨Êý¾ÝÂäÅÌ¡¢Öظ´¶ÁÈ¡¡¢×îÖÕ½á¹û¿É¼ûµÈ¡£ÎļþÂäÅÌ¿ÉÒÔÓÐЧ±£´æÖмä½á¹û£¬Ò»µ©
task ¹ÒµôÖØÆô¾Í¿ÉÒÔÖ±½Ó¶ÁÈ¡´ÅÅÌÊý¾Ý£¬Ö»ÓÐ×÷Òµ³É¹¦ÔËÐÐÍêÁË£¬×îÖÕ½á¹û²Å¶ÔÓû§¿É¼û¡£ÕâÖÖÉè¼ÆµÄÕÜÀí¾ÍÊÇÄã¿ÉÒÔͨ¹ýÖØ¸´¶Áȡͬһ·ÝÊý¾ÝÀ´²úÉúͬÑùµÄ½á¹û£¬¿ÉÒԺܺõĴ¦Àí
failover¡£
Flink µÄÈÝ´íÖ÷Ҫͨ¹ý¶¨ÆÚ¿ìÕÕºÍÊý¾Ý»ØËÝ¡£Ã¿¸ôÒ»¶Îʱ¼ä£¬Flink¾Í»á²åÈëһЩ barrier£¬barrier
´Ó source Á÷¶¯µ½ sink£¬Í¨¹ý barrier Á÷¶¯À´¿ØÖÆ¿ìÕÕµÄÉú³É¡£¿ìÕÕÖÆ×÷Íê¾Í¿ÉÒÔ±£´æÔÚ¹²ÏíÒýÇæÀï¡£Ò»µ©×÷Òµ³öÏÖÎÊÌ⣬¾Í¿ÉÒÔ´ÓÉϴοìÕÕ½øÐлָ´£¬Í¨¹ýÊý¾Ý»ØËÝÀ´ÖØÐÂÏû·Ñ¡£
3£©ÐÔÄÜ
MapReduce Ö÷ÒªÌØµãÊǸßÍÌÍ¡¢¸ßÑÓʱ¡£¸ßÍÌÍÂ˵Ã÷´¦ÀíµÄÊý¾ÝÁ¿·Ç³£´ó£»¸ßÑÓʱ¾ÍÊÇÇ°ÃæËµµ½µÄÈÝ´íÎÊÌ⣬Ëü±ØÐë°ÑÕû¸ö×÷Òµ´¦ÀíÍê²Å¶ÔÓû§¿É¼û¡£
Flink Ö÷ÒªÌØµãÊǸßÍÌÍ¡¢µÍÑÓʱ¡£ÔÚÁ÷ʽϵͳÀFlink µÄÍÌÍÂÊǺܸߵġ£Í¬Ê±£¬ËüÒ²¿ÉÒÔ×öµ½ÊµÊ±´¦ÀíºÍÊä³ö£¬ÈÃÓû§¿ìËÙ¿´µ½½á¹û¡£
4£©¼ÆËã¹ý³Ì
MapReduce Ö÷Ҫͨ¹ý Map ºÍ reduce À´¼ÆËã¡£Map ¸ºÔð¶ÁÈ¡Êý¾Ý²¢×÷»ù±¾µÄ´¦Àí£¬
reduce ¸ºÔðÊý¾ÝµÄ¾ÛºÏ¡£Óû§¿ÉÒÔ¸ù¾ÝÕâÁ½ÖÖ»ù±¾Ëã×Ó£¬×éºÏ³ö¸÷ÖÖ¸÷ÑùµÄ¼ÆËãÂß¼¡£
Flink ΪÓû§ÌṩÁË pipeline µÄ API ºÍÅúÁ÷ͳһµÄ SQL¡£Í¨¹ý pipeline
µÄ API£¬ Óû§¿ÉÒÔ·½±ãµØ×éºÏ¸÷ÖÖËã×Ó¹¹½¨¸´ÔÓµÄÓ¦Óã»Flink SQL ÊÇÒ»¸ö¸ü¸ß²ãµÄ API
³éÏ󣬼«´óµØ½µµÍÁËÓû§µÄʹÓÃÃż÷¡£
3¡¢Á÷ʽ¼ÆËãµÄ¹Ø¼üÎÊÌâ
Õⲿ·ÖÖ÷Ҫͨ¹ýËĸöÎÊÌâ¸ø´ó¼Ò½â´ðÁ÷ʽ¼ÆËãµÄ¹Ø¼üÎÊÌ⣬ҲÊÇºÜ¶à¼ÆËãÒýÇæÐèÒª¿¼ÂǵÄÎÊÌâ¡£
1£©What
What ÊÇָͨ¹ýʲôÑùµÄËã×ÓÀ´½øÐмÆËã¡£Ö÷Òª°üº¬Èý¸ö·½ÃæµÄÀàÐÍ£¬element-wise ±íʾһ¶ÔÒ»µÄ¼ÆË㣬aggregating
±íʾ¾ÛºÏ²Ù×÷£¬composite ±íʾ¶à¶Ô¶àµÄ¼ÆËã¡£
2£©Where
aggregating »á½øÐÐһЩ¾ÛºÏµÄ¼ÆË㣬 Ö÷ÒªÊÇÔÚ¸÷ÖÖ window Àï½øÐмÆËã¡£´°¿Ú°üº¬»¬¶¯´°¿Ú¡¢¹ö¶¯´°¿Ú¡¢»á»°´°¿Ú¡£´°¿Ú»á°ÑÎÞ½çµÄÊý¾ÝÇзֳÉÓнçµÄÒ»¸ö¸öÊý¾Ý¿é½øÐд¦Àí£¬ºóÃæÎÒÃÇ»áÏêϸ½éÉÜÕâµã¡£
3£©When
When ¾ÍÊÇʲôʱºò´¥·¢¼ÆËã¡£´°¿ÚÀïÃæÓÐÊý¾Ý£¬ÓÉÓÚÊäÈëÊý¾ÝÊÇÎÞÇîÎÞ¾¡µÄ£¬ºÜÄÑÖªµÀÒ»¸ö´°¿ÚµÄÊý¾ÝÊÇ·ñÈ«²¿µ½´ïÁË¡£Á÷ʽ¼ÆËãÖ÷Ҫͨ¹ý
watermark À´±£ÕÏÊý¾ÝµÄÍ걸ÐÔ£¬Í¨¹ý trigger À´¾ö¶¨ºÎʱ´¥·¢¡£µ±½ÓÊÕµ½ÊýֵΪ X µÄ
Watermark ʱ£¬¿ÉÒÔÈÏΪËùÓÐʱ¼ä´ÁСÓÚµÈÓÚXµÄʼþÈ«²¿µ½´ïÁË¡£Ò»µ© watermark ¿ç¹ý´°¿Ú½áÊøÊ±¼ä£¬¾Í¿ÉÒÔͨ¹ý
trigger À´´¥·¢¼ÆËã²¢Êä³ö½á¹û¡£
4£©How
How Ö÷ÒªÖ¸ÎÒÃÇÈçºÎÖØÐ¶¨Òåͬһ´°¿ÚµÄ¶à´Î´¥·¢½á¹û¡£Ç°ÃæÒ²ËµÁË trigger ÊÇÓÃÀ´´¥·¢´°¿ÚµÄ£¬
Ò»¸ö´°¿Ú¿ÉÄܻᱻ´¥·¢¶à´Î£¬±ÈÈç1·ÖÖӵĴ°¿Úÿ 10 Ãë´¥·¢¼ÆËãÒ»´Î¡£´¦Àí·½Ê½Ö÷Òª°üº¬ÈýÖÖ£º
Discarding£¬¶ªÆú֮ǰµÄ×´Ì¬ÖØÐ¼ÆËã¡£ÕâÖÖ·½Ê½Ã¿´ÎµÄ´¥·¢½á¹û¶¼ÊÇ»¥²»¹ØÁªµÄ£¬¶à´Î´¥·¢½á¹ûµÄ×éºÏ·´Ó³ÁËÈ«²¿µÄ´°¿ÚÄÚÈÝ£¬ÏÂÓÎÒ»°ã»áÔٴξۺϣ»
Accumulating£¬Õâ¸ö¾ÍÊÇÒ»¸ö¾ÛºÏµÄ״̬£¬±ÈÈç˵µÚ¶þ´Î´¥·¢µÄʱºòÊÇÔÚµÚÒ»´ÎµÄ½á¹ûÉϽøÐмÆËãµÄ£¬ÏÂÓÎÖ»ÐèÒª±£´æ×îеĽá¹û¼´¿É£»
Accumulating ºÍ retracting£¬Õâ¸öÖ÷ÒªÔÚ Accumulating µÄ»ù´¡ÉϼÓÁËÒ»¸ö
retracting£¬retracting µÄÒâ˼¾ÍÊdz·Ïú¡£´°¿ÚÔٴδ¥·¢Ê±£¬»á¸æËßÏÂÓγ·ÏúÉÏÒ»´ÎµÄ¼ÆËã½á¹û£¬²¢¸æÖª×îеĽá¹û¡£Flink
SQL µÄ¾ÛºÏ¾ÍʹÓÃÁËÕâÖÖ retractµÄģʽ¡£
¶þ¡¢Flink ¹Ø¼ü¼¼Êõ
1¡¢Flink ¼ò½é
Flink ÊÇÒ»¿î·Ö²¼Ê½¼ÆËãÒýÇæ£¬ ¼È¿ÉÒÔ½øÐÐÁ÷ʽ¼ÆË㣬Ҳ¿ÉÒÔ½øÐÐÅú´¦Àí¡£ÏÂͼÊǹÙÍø¶Ô Flink
µÄ½éÉÜ£º

Flink ¿ÉÒÔÔËÐÐÔÚ k8s¡¢yarn¡¢mesos µÈ×ÊÔ´µ÷¶Èƽ̨ÉÏ£¬ÒÀÀµ hdfs µÈÎļþϵͳ£¬ÊäÈë°üº¬Ê¼þºÍ¸÷ÖÖÆäËûÊý¾Ý£¬¾¹ý
Flink ÒýÇæ¼ÆËãºóÔÙÊä³öµ½ÆäËûÖмä¼þ»òÕßÊý¾Ý¿âµÈ¡£
Flink ÓÐÁ½¸öºËÐĸÅÄ
State£ºFlink ¿ÉÒÔ´¦ÀíÓÐ״̬µÄÊý¾Ý£¬Í¨¹ý×ÔÉíµÄ state »úÖÆÀ´±£ÕÏ×÷ÒµfailoverʱÊý¾Ý²»¶ªÊ§£»
Event Time£ºÔÊÐíÓû§°´ÕÕʼþʱ¼äÀ´´¦ÀíÊý¾Ý£¬Í¨¹ý watermark À´Íƶ¯Ê±¼äǰ½ø£¬Õâ¸öºóÃæ»¹»áÏêϸ½éÉÜ¡£Ö÷ÒªÊÇϵͳµÄʱ¼äºÍʼþµÄʱ¼ä¡£
Flink Ö÷Ҫͨ¹ýÉÏÃæÁ½¸öºËÐļ¼ÊõÀ´±£Ö¤ exactly-once£¬ ±ÈÈç˵×÷Òµ Failover
µÄʱºò״̬²»¶ªÊ§£¬¾ÍºÃÏñû·¢Éú¹ÊÕÏÒ»Ñù¡£
2¡¢¿ìÕÕ»úÖÆ
Flink µÄ¿ìÕÕ»úÖÆÖ÷ÒªÊÇΪÁ˱£ÕÏ×÷Òµ failover ʱ²»¶ªÊ§×´Ì¬¡£Flink ÌṩÁËÒ»ÖÖÇáÁ¿¼¶µÄ¿ìÕÕ»úÖÆ£¬²»ÐèҪֹͣ×÷Òµ¾Í¿ÉÒÔ°ïÖúÓû§³Ö¾Ã»¯ÄÚ´æÖеÄ״̬Êý¾Ý¡£

ÉÏͼÖÐµÄ markers£¨Óë barrier ÓïÒåÏàͬ£©Í¨¹ýÁ÷¶¯À´´¥·¢¿ìÕÕµÄÖÆ×÷£¬Ã¿Ò»¸ö±àºÅ¶¼´ú±íÁËÒ»´Î¿ìÕÕ£¬±ÈÈç±àºÅΪ
n µÄ markers ´Ó×îÉÏÓÎÁ÷¶¯µ½×îÏÂÓξʹú±íÁËÒ»´Î¿ìÕÕµÄÖÆ×÷¹ý³Ì¡£¼òÊöÈçÏ£º
ϵͳ·¢ËͱàºÅΪ n µÄ markers µ½×îÉÏÓεÄËã×Ó£¬markers Ëæ×ÅÊý¾ÝÍùÏÂÓÎÁ÷¶¯£»
µ±ÏÂÓÎËã×ÓÊÕµ½ marker ºó£¬¾Í¿ªÊ¼½«×ÔÉíµÄ״̬±£´æµ½¹²Ïí´æ´¢ÖУ»
µ±ËùÓÐ×îÏÂÓεÄËã×Ó½ÓÊÕµ½ marker ²¢Íê³ÉËã×Ó¿ìÕպ󣬱¾´Î×÷ÒµµÄ¿ìÕÕÖÆ×÷Íê³É¡£
Ò»µ©×÷ҵʧ°Ü£¬ÖØÆôʱ¾Í¿ÉÒÔ´Ó¿ìÕÕ»Ö¸´¡£
ÏÂÃæÎªÒ»¸ö¼òµ¥µÄ demo ˵Ã÷£¨barrier µÈͬÓÚ marker£©¡£

barrier µ½´ï Source£¬½«×´Ì¬ offset=7 ´æ´¢µ½¹²Ïí´æ´¢£»
barrier µ½´ï Task£¬½«×´Ì¬ sum=21 ´æ´¢µ½¹²Ïí´æ´¢£»
barrier µ½´ï Sink£¬commit ±¾´Î¿ìÕÕ£¬±êÖ¾×Å¿ìÕյijɹ¦ÖÆ×÷¡£

ÕâʱºòͻȻ¼ä×÷ÒµÒ²¹Òµô£¬ ÖØÆôʱ Flink »áͨ¹ý¿ìÕÕ»Ö¸´¸÷¸ö״̬¡£Source »á½«×ÔÉíµÄ offset
ÖÃΪ 7£¬Task »á½«×ÔÉíµÄ sum ÖÃΪ 21¡£ÏÖÔÚÎÒÃÇ¿ÉÒÔÈÏΪ 1¡¢2¡¢3¡¢4¡¢5¡¢6 Õâ 6
¸öÊý×ֵļӺͽá¹û²¢Ã»ÓжªÊ§¡£Õâ¸öʱºò£¬offset ´Ó 7 ¿ªÊ¼Ïû·Ñ£¬¸ú×÷ҵʧ°ÜǰÍêÈ«¶Ô½ÓÁËÆðÀ´£¬È·±£ÁË
exactly-once¡£
3¡¢Ê¼þʱ¼ä
ʱ¼äÀàÐÍ·ÖΪÁ½ÖÖ£º
Event time£¨Ê¼þʱ¼ä£©£¬Ö¸Ê¼þ·¢ÉúµÄʱ¼ä£¬±ÈÈç²É¼¯Êý¾ÝʱµÄʱ¼ä£»
Processing time£¨ÏµÍ³Ê±¼ä£©£¬Ö¸ÏµÍ³µÄʱ¼ä£¬±ÈÈç´¦ÀíÊý¾ÝʱµÄʱ¼ä¡£
Èç¹ûÄã¶ÔÊý¾ÝµÄ׼ȷÐÔÒªÇó±È½Ï¸ßµÄ»°£¬²ÉÓà Event time Äܱ£ÕÏ exactly-once¡£Processing
Time Ò»°ãÓÃÓÚʵʱÏû·Ñ¡¢¾«×¼ÐÔÒªÇóÂԵ͵ij¡¾°£¬Ö÷ÒªÊÇÒòΪʱ¼äÉú³É²»ÊÇ deterministic¡£
ÎÒÃÇ¿ÉÒÔ¿´ÏÂÃæµÄ¹ØÏµÍ¼£¬ X ÖáÊÇ Event time£¬Y ÖáÊÇ Processing time¡£ÀíÏëÇé¿öÏÂ
Event time ºÍ Processing time ÊÇÏàͬµÄ£¬¾ÍÊÇ˵ֻҪÓÐÒ»¸öʼþ·¢Éú£¬¾Í¿ÉÒÔÁ¢¿Ì´¦Àí¡£µ«ÊÇʵ¼Ê³¡¾°ÖУ¬Ê¼þ·¢ÉúºóÍùÍù»á¾¹ýÒ»¶¨ÑÓʱ²Å»á±»´¦Àí£¬ÕâÑù¾Í»áµ¼ÖÂÎÒÃÇϵͳµÄʱ¼äÍùÍù»áÖͺóÓÚʼþʱ¼ä¡£ÕâÀïËüÃÇÁ½¸öµÄ²î
Processing-time lag ±íʾÎÒÃÇ´¦ÀíʼþµÄÑÓʱ¡£

ʼþʱ¼ä³£ÓÃÔÚ´°¿ÚÖУ¬Ê¹Óà watermark À´È·±£Êý¾ÝÍ걸ÐÔ£¬±ÈÈç˵ watermarker
Öµ´óÓÚ window ĩβʱ¼äʱ£¬ÎÒÃǾͿÉÒÔÈÏΪ window ´°¿ÚËùÓÐÊý¾Ý¶¼ÒѾµ½´ïÁË£¬¾Í¿ÉÒÔ´¥·¢¼ÆËãÁË¡£

±ÈÈçÉÏÃæ [0-10] µÄ´°¿Ú£¬ÏÖÔÚ watermark ×ßµ½ÁË 10£¬ÒѾµ½´ïÁË´°¿ÚµÄ½áÊø£¬´¥·¢¼ÆËã
SUM=21¡£Èç¹ûÒªÊÇÏë¶Ô³Ùµ½µÄÊý¾ÝÔÙ½øÐд¥·¢£¬¿ÉÒÔÔÙ¶¨ÒåһϺóÃæ late data µÄ´¥·¢£¬±ÈÈç˵ºóÃæÀ´Á˸ö
9£¬ÎÒÃÇµÄ SUM ¾ÍµÈÓÚ 30¡£
4¡¢´°¿Ú»úÖÆ
´°¿Ú»úÖÆ¾ÍÊǰÑÎÞ½çµÄÊý¾Ý·Ö³ÉÊý¾Ý¿éÀ´½øÐмÆË㣬Ö÷ÒªÓÐÈýÖÖ´°¿Ú¡£
¹ö¶¯´°¿Ú£º¹Ì¶¨´óСµÄ´°¿Ú£¬ÏàÁÚ´°¿ÚûÓн»¼¯£»
»¬¶¯´°¿Ú£ºÃ¿¸ö´°¿ÚµÄ´óСÊÇÒ»ÑùµÄ£¬µ«ÊÇÁ½¸ö´°¿ÚÖ®¼ä»áÓÐÖØºÏ£»
»á»°´°¿Ú£º¸ù¾Ý»îԾʱ¼ä¾ÛºÏ¶ø³ÉµÄ´°¿Ú£¬ ±ÈÈç»îԾʱ¼ä³¬¹ý3·ÖÖÓÐÂÆðÒ»¸ö´°¿Ú¡£´°¿ÚÖ®¼äÁôÓÐÒ»¶¨µÄ¼ä¸ô¡£

´°¿Ú»á×Ô¶¯¹ÜÀí״̬ºÍ´¥·¢¼ÆË㣬Flink ÌṩÁ˷ḻµÄ´°¿Úº¯ÊýÀ´½øÐмÆËã¡£Ö÷Òª°üÀ¨ÒÔÏÂÁ½ÖÖ£º
ProcessWindowFunction£¬È«Á¿¼ÆËã»á°ÑËùÓÐÊý¾Ý»º´æµ½×´Ì¬Àһֱµ½´°¿Ú½áÊøÊ±Í³Ò»¼ÆËã¡£Ïà¶ÔÀ´Ëµ£¬×´Ì¬»á±È½Ï´ó£¬¼ÆËãЧÂÊÒ²»áµÍһЩ£»
AggregateFunction£¬ÔöÁ¿¼ÆËã¾ÍÊÇÀ´Ò»ÌõÊý¾Ý¾ÍËãÒ»Ìõ£¬¿ÉÄÜÎÒÃǵÄ״̬¾Í»áÌØ±ðµÄС£¬¼ÆËãЧÂÊÒ²»á±È
ProcessWindowFunction ¸ßºÜ¶à£¬µ«ÊÇÈç¹û״̬´æ´¢ÔÚ´ÅÅÌÆµ·±·ÃÎÊ״̬¿ÉÄÜ»áÓ°ÏìÐÔÄÜ¡£

Èý¡¢¿ìÊÖ Flink ʵ¼ù
1¡¢Ó¦ÓøÅÀ¨
¿ìÊÖÓ¦ÓøÅÀ¨Ö÷ÒªÊÇ·ÖΪÊý¾Ý½ÓÈë¡¢Flink ʵʱ¼ÆËã¡¢Êý¾ÝÓ¦Óá¢Êý¾ÝչʾËĸö²¿·Ö¡£¸÷²ã¸÷˾ÆäÖ°¡¢ÏνÓÁ÷³©£¬ÎªÓû§ÌṩһÌ廯µÄÊý¾Ý·þÎñÁ÷³Ì¡£

2¡¢ÊµÊ±Ö¸±ê¼ÆËã
³£¼ûµÄʵʱָ±ê¼ÆËã°üÀ¨ uv¡¢pv ºÍ sum¡£ÕâÆäÖÐ uv µÄ¼ÆËã×îΪ¸´ÔÓÒ²×îΪ¾µä¡£ÏÂÃæÎÒ½«Öصã½éÉÜ
uv¡£
uv Ö¸µÄÊDz»Í¬Óû§µÄ¸öÊý£¬ÎÒÃÇÕâ±ß¼ÆËãµÄ¾ÍÊDz»Í¬ deviceld µÄ¸öÊý£¬Ö÷ÒªµÄÌôÕ½À´×ÔÈý·½Ã棺
Óû§Êý¶à£¬Êý¾ÝÁ¿´ó¡£»î¶¯ÆÚ¼äµÄ QPS ¾³£ÔÚǧÍò¼¶±ð£¬Êµ¼Ê¼ÆËãÆðÀ´Ìرð¸´ÔÓ£»
ʵʱÐÔÒªÇó¸ß£¬Í¨³£Îª¼¸Ãëµ½·ÖÖÓ½á¹ûµÄÊä³ö£»
Îȶ¨ÐÔÒªÇó¸ß£¬±ÈÈç˵ÎÒÃÇÔÚ×ö´ºÍí»î¶¯Ê±ºòÒªÇó¹ÊÕÏʱ¼äÐèÒªµÍÓÚ2%»ò¸üÉÙ¡£
Õë¶Ô¸÷ÖÖ¸÷ÑùµÄ uv ¼ÆË㣬ÎÒÃÇÌṩÁËÒ»Ì׳ÉÊìµÄ¼ÆËãÁ÷³Ì¡£Ö÷Òª°üº¬ÁËÈý·½Ã棺
×ֵ䷽°¸£º½« string ÀàÐ굀 deviceld ת³É long ÀàÐÍ£¬·½±ãºóÐøµÄ uv ¼ÆË㣻
Çãб´¦Àí£º±ÈÈçijЩ´ó V »áµ¼ÖÂÊý¾ÝÑÏÖØÇãб£¬Õâʱºò¾ÍÐèÒª´òÉ¢´¦Àí£»
ÔöÁ¿¼ÆË㣺±ÈÈç¼ÆËã 1 ÌìµÄ uv£¬Ã¿·ÖÖÓÊä³öÒ»´Î½á¹û¡£
×ֵ䷽°¸ÐèҪȷ±£ÈκÎÁ½¸ö²»Í¬µÄ deviceId ²»ÄÜÓ³Éäµ½ÏàͬµÄ long ÀàÐÍÊý×ÖÉÏ¡£¿ìÊÖÄÚ²¿Ö÷ҪʹÓùýÒÔÏÂÈýÖÖ·½°¸£º

HBase£¬ »ùÓÚ partition ·ÖÇø½¨Á¢ deviceld µ½ id µÄÓ³É䣬 ͨ¹ý»º´æºÍÅúÁ¿·ÃÎÊÀ´¼ÓËÙ£»
Redis£¬ ÕâÖÖ·½°¸ÑϸñÀ´Ëµ²»ÊôÓÚ×ֵ䣬Ö÷Ҫͨ¹ý key-value À´ÅжÏÊý¾ÝÊÇ·ñÊ״γöÏÖ£¬»ùÓÚÊ×´ÎÊý¾ÝÀ´¼ÆËã
uv£¬ÕâÑù¾Í»á°Ñ pv ºÍ uv µÄ¼ÆËã½øÐÐͳһ;
×îºó¾ÍÊÇÒ»¸ö Flink ÄÚ²¿×Ô½¨µÄÈ«¾Ö×ÖµäʵÏÖ deviceld µ½ id µÄת»»£¬Ö®ºó¼ÆËãUV¡£
ÕâÈýÖÖ·½°¸ÀïÃæ£¬Ç°Á½ÖÖÊôÓÚÍⲿ´æ´¢µÄ×ֵ䷽°¸£¬ÓŵãÊÇ¿ÉÒÔ×öµ½¶à¸ö×÷Òµ¹²Ïí 1 ·ÝÊý¾Ý£¬ ȱµãÊÇÍⲿ·ÃÎÊÂý¶øÇÒ²»Ì«Îȶ¨¡£×îºóÒ»ÖÖ
Flink ×ֵ䷽°¸»ùÓÚ state£¬²»ÒÀÀµÍⲿ´æ´¢£¬ ÐÔÄܸߵ«ÊÇÎÞ·¨¶à×÷Òµ¹²Ïí¡£
½ÓÏÂÀ´ÎÒÃÇÖØµã½éÉÜ»ùÓÚFlink×ÔÉíµÄ×ֵ䷽°¸£¬ÏÂͼÖ÷ÒªÊǽ¨Á¢Ò»¸ö deviceld µ½ id µÄÓ³É䣺

Ö÷Òª·Ö³ÉÈý²½×ߣº
1£©½¨Á¢ Partition ·ÖÇø£¬ Ö¸¶¨Ò»¸ö±È½Ï´óµÄ Partition ·ÖÇø¸öÊý£¬¸Ã¸öÊý±È½Ï´ó²¢ÇÒ²»»á±ä£¬¸ù¾Ý
deviceld µÄ¹þÏ£Öµ½«ÆäÓ³Éäµ½Ö¸¶¨ partition¡£
2£©½¨Á¢ id Ó³É䡣ÿ¸ö Partition ¶¼ÓÐ×Ô¼º¸ºÔðµÄ id Çø¼ä£¬È·±£ Partition
Ö®¼äµÄlong ÀàÐ굀 id ²»Öظ´£¬ partition ÄÚ²¿Í¨¹ý×ÔÔö id À´È·±£Ã¿¸ö deviceId
¶ÔÓ¦Ò»¸ö id¡£
3£©Ê¹Óà keyed state ±£´æ id Ó³Éä¡£ÕâÑùÎÒÃǵÄ×÷Òµ³öÏÖ²¢·¢µÄ´ó¸Ä±äʱ£¬¿ÉÒÔ·½±ãµÄ
rescale£¬²»ÐèÒª×öÆäËûµÄ²Ù×÷¡£
³ýÁË id ת»»£¬ºóÃæ¾ÍÊÇÒ»¸öʵʱָ±ê¼ÆËãµÄ³£¼ûÎÊÌ⣬¾ÍÊÇÊý¾ÝÇãб¡£Òµ½ç³£¼ûµÄ½â¾öÊý¾ÝÇãб´¦Àí·½°¸Ö÷ÒªÊÇÁ½ÖÖ£º
´òÉ¢ÔپۺϣºÏȽ«ÇãбµÄÊý¾Ý´òÉ¢¼ÆË㣬ȻºóÔپۺϼÆËã½á¹û£»
Local-aggregate£ºÏÈÔÚ±¾µØ¼ÆËãÔ¤¾ÛºÏ£¬ÕâÑù»á´ó´ó¼õÉÙÏÂÓεÄÊý¾ÝѹÁ¦¡£
¶þÕߵı¾ÖÊÊÇÒ»ÑùµÄ£¬¶¼ÊÇÏÈÔ¤¾ÛºÏÔÙ»ã×Ü£¬´Ó¶ø±ÜÃâµ¥µãÐÔÄÜÎÊÌâ¡£

ÉÏͼΪ¼ÆËã×îСֵµÄÈȵãÎÊÌ⣬ºìÉ«Êý¾ÝΪÈȵãÊý¾Ý¡£Èç¹ûÖ±½Ó½«ËüÃÇ´òµ½Í¬Ò»¸ö·ÖÇø£¬»á³öÏÖÐÔÄÜÎÊÌ⡣ΪÁ˽â¾öÇãбÎÊÌ⣬ÎÒÃÇͨ¹ýhash²ßÂÔ½«Êý¾Ý·Ö³ÉСµÄ
partition À´¼ÆË㣬ÈçÉÏͼµÄÔ¤¼ÆË㣬×îºóÔÙ½«Öмä½á¹û»ã×ܼÆËã¡£
µ±Ò»ÇоÍÐ÷ºó£¬ÎÒÃÇÀ´×öÔöÁ¿µÄ UV ¼ÆË㣬±ÈÈç¼ÆËã 1 Ìì uv£¬Ã¿·ÖÖÓÊä³ö 1 ´Î½á¹û¡£¼ÆË㷽ʽ¼È¿ÉÒÔ²ÉÓÃ
API£¬Ò²¿ÉÒÔ²ÉÓà SQL¡£
Õë¶Ô API£¬ÎÒÃÇÑ¡ÔñÁË global state+bitmap µÄ×éºÏ£¬¼ÈÑϸñ×ñÑÁË Event
Time ÓÖ¼õÉÙÁË state ´óС£º

ÏÂÃæÎª¼ÆËãÁ÷³Ì£¨ÐèҪעÒâÊ±ÇøÎÊÌ⣩£º
¶¨Òå¸ú´¥·¢¼ä¸ôÒ»Ñù´óСµÄ window£¨±ÈÈç 1 ·ÖÖÓ£©£»
Global state ÓÃÀ´±£´æ¿ç´°¿ÚµÄ״̬£¬ÎÒÃDzÉÓà bitmap À´´æ´¢×´Ì¬£»
ÿ¸ôÒ»¸ö window ´¥·¢Ò»´Î£¬Êä³öÆðʼÖÁ½ñµÄ UV£»
µ±Ç°×÷ÓÃÓò£¨±ÈÈç 1 Ì죩½áÊø£¬Çå¿Õ×´Ì¬ÖØÐ¿ªÊ¼¡£
Õë¶Ô SQL£¬ÔöÁ¿¼ÆËãÖ§³ÖµÄ»¹²»ÊÇÄÇôÍêÉÆ£¬µ«ÊÇ¿ÉÒÔÀûÓà early-fire µÄ²ÎÊýÀ´Ìáǰ´¥·¢´°¿Ú¡£
ÅäÖÃÈçÏ£º
table.exec.emit.early-fire.enabled£º
truetable.exec.emit.early-fire.delay£º60 s |
early-fire.delay ¾ÍÊÇÿ·ÖÖÓÊä³öÒ»´Î½á¹ûµÄÒâ˼¡£
SQL ÈçÏ£º
SELECT TUMBLE_ROWTIME(eventTime,
interval ¡®1¡¯ day) AS rowtime, dimension, count(distinct
id) as uv
FROM person
GROUP BY TUMBLE(eventTime, interval '1' day),
dimension |
Èç¹ûÓöµ½Çãб£¬¿ÉÒԲο¼ÉÏÒ»²½À´´¦Àí¡£
3¡¢¿ìËÙ failover
×îºó¿´ÏÂÎÒÃDz¿ÃÅ×î½ü·¢Á¦µÄÒ»¸ö·½Ïò£¬ÈçºÎ¿ìËÙ failover¡£
Flink ×÷Òµ¶¼ÊÇ long-running µÄÔÚÏß×÷Òµ£¬ºÜ¶à¶Ô¿ÉÓÃÐÔµÄÒªÇóÌØ±ð¸ß£¬ÓÈÆäÊǸú¹«Ë¾ºËÐÄÒµÎñÏà¹ØµÄ×÷Òµ£¬SLA
ÒªÇó 4 ¸ö 9 ÉõÖÁ¸ü¸ß¡£
µ±×÷ÒµÓöµ½¹ÊÕÏʱ£¬ÈçºÎ¿ìËÙ»Ö¸´¶ÔÎÒÃÇÀ´ËµÊÇÒ»¸ö¾Þ´óµÄÌôÕ½¡£
ÏÂÃæ·ÖÈý¸ö·½ÃæÀ´Õ¹¿ª£º
Flink µ±Ç°ÒÑÓеĿìËÙ»Ö¸´·½°¸£»
»ùÓÚ container å´µôµÄ¿ìËÙ»Ö¸´£»
»ùÓÚ»úÆ÷å´µôµÄ¿ìËÙ»Ö¸´¡£
1£©Flink µ±Ç°ÒÑÓеĿìËÙ»Ö¸´·½°¸
Flink µ±Ç°ÒÑÓеĿìËÙ»Ö¸´·½°¸Ö÷Òª°üÀ¨ÒÔÏÂÁ½ÖÖ£º
region failover¡£Èç¹ûÁ÷ʽ×÷ÒµµÄ DAG °üº¬¶à¸ö×Óͼ»òÕß pipeline£¬ÄÇô
task ʧ°Üʱֻ»áÓ°ÏìÆäËùÊôµÄ×Óͼ»òÕß pipeline £¬¶ø²»ÓÃÕû¸ö DAG ¶¼ÖØÐÂÆô¶¯£»
local recovery¡£ÔÚ Flink ½«¿ìÕÕͬ²½µ½¹²Ïí´æ´¢µÄͬʱ£¬ÔÚ±¾µØ´ÅÅÌÒ²±£´æÒ»·Ý¿ìÕÕ¡£×÷ҵʧ°Ü»Ö¸´Ê±£¬¿ÉÒÔµ÷¶Èµ½Éϴβ¿ÊðµÄλÖ㬲¢´Ó
local disk ½øÐпìÕÕ»Ö¸´¡£
2£©»ùÓÚ container å´µôµÄ¿ìËÙ»Ö¸´
ʵ¼Ê»·¾³ÖУ¬ container å´µôÔÙÉêÇëÓÐʱ»á³¤´ï¼¸Ê®Ã룬±ÈÈçÒòΪ hdfs Âý¡¢yarn ÂýµÈÔÒò£¬ÑÏÖØÓ°Ïì»Ö¸´ËÙ¶È¡£Îª´Ë£¬ÎÒÃÇ×öÁËÈçÏÂÓÅ»¯£º
ÈßÓà×ÊÔ´¡£Î¬³Ö¹Ì¶¨¸öÊýµÄÈßÓà container£¬Ò»µ© container å´µô£¬ÈßÓà container
Á¢¿Ìºò²¹ÉÏÀ´£¬Ê¡È¥ÁË·±ÔÓµÄ×ÊÔ´ÉêÇëÁ÷³Ì£»
ÌáǰÉêÇë¡£Ò»µ©·¢ÏÖ×÷ÒµÒòΪ container å´µô¶øÊ§°Ü£¬Á¢¿ÌÉêÇëÐ嵀 container ¡£

ÒÔÉÏÓÅ»¯¸²¸ÇÁ˺ܴóÒ»²¿·Ö³¡¾°£¬»Ö¸´Ê±¼ä´Ó 30s-60s ½µµ½ 20s ÒÔÄÚ¡£
3£©»ùÓÚ»úÆ÷å´µôµÄ¿ìËÙ»Ö¸´
»úÆ÷å´µôʱ£¬flink on yarn µÄ»Ö¸´Ê±¼ä³¬¹ý 3 ·ÖÖÓ£¬Õâ¶ÔÖØÒª×÷ÒµÏÔÈ»ÊÇÎÞ·¨ÈÝÈ̵ģ¡ÎªÁË×öµ½¿ìËÙ»Ö¸´£¬ÎÒÃÇÐèÒª×öµ½¿ìËÙ¸ÐÖªºÍ»Ö¸´£º
ÈßÓà×ÊÔ´²¢´òÉ¢·ÖÅ䣬ȷ±£Á½¸öÈßÓà×ÊÔ´²»ÔÚÒ»¸ö container£¬redundantContainerNum=max(containerNumOfHost)
+ 1£»
×÷ҵ崻ú£¬Hawk ¼à²âϵͳ 5 ÃëÄÚ·¢ÏÖ£»
ÈßÓà×ÊÔ´¿ìËÙºò²¹£¬ÃâÈ¥ÉêÇë×ÊÔ´µÄÁ÷³Ì¡£

ͨ¹ýÕâÖÖ·½°¸£¬ÎÒÃÇ¿ÉÒÔÈÝÈÌÈÎÒâһ̨»úÆ÷µÄå´»ú£¬²¢½«å´»ú»Ö¸´Ê±¼äÓÉÔÏȵÄ
3 ·ÖÖÓ½µµÍµ½ 30 ÃëÒÔÄÚ¡£
ËÄ¡¢×ܽá
±¾ÎÄ´Ó´óÊý¾ÝϵͳµÄ·¢Õ¹ÈëÊÖ£¬½ø¶øÑÓÉì³öÁ÷ʽϵͳµÄ¹Ø¼ü¸ÅÄ֮ºó½éÉÜÁË
FlinkµÄ¹Ø¼üÌØÐÔ£¬×îºó½²½âÁË¿ìÊÖÄÚ²¿µÄʵʱָ±ê¼ÆËãºÍ¿ìËÙ failover£¬Ï£Íû¶Ô´ó¼ÒÓÐËù°ïÖú¡£
Îå¡¢Q&A
Q1£º´òËã×öʵʱ¼ÆË㣬¿ÉÒÔÌø¹ý Storm¡¢Spark Ö±½ÓÉÏÊÖ Flink Âð£¿
A£º¿ÉÒÔÖ±½ÓʹÓà Flink¡£Storm ÔÚ failover ʱ»á¶ªÊ§Êý¾Ý£¬ÎÞ·¨×öµ½ exactly-once£»spark
streaming ÊÇ Flink µÄ¾ºÕùÕߣ¬ÊÇÔÚÅú´¦ÀíµÄ»ù´¡ÉÏʵÏÖÁ÷¼ÆË㣬Ïà±È¶øÑÔ£¬Flink µÄµ×²ãÊÇÁ÷´¦Àí£¬¸ü¼ÓÊʺÏÁ÷¼ÆËã¡£
Q2£ºÒ»°ãÔõô´¦Àí taskmanager heartbeat timeout£¿
A£ºÄ¬ÈÏ 10 Ãë»ã±¨Ò»´ÎÐÄÌø£¬ÐÄÌø³¬Ê±Îª 50 Ã룬Õâ¸öʱºò×÷Òµ»áʧ°Ü£¬Èç¹ûÅäÖÃÁ˸߿ÉÓÃÄÇô»áÖØÆô¡£
Q3£ºÈçºÎ±£Ö¤ 2 Ìì´óʱ¼ä¿ç¶ÈÑÓ³ÙÏûÏ¢µÄ´°¿Ú¼ÆË㣿
A£ºÕâÀïÖ÷ÒªµÄÌôÕ½ÔÚÓÚʱ¼ä³¤¡¢×´Ì¬´ó£¬½¨Òé stateBakend ʹÓà Rocksdb£¨¿ÉÒÔÀûÓôÅÅÌ´æ´¢´ó״̬£©£¬´°¿Ú¼ÆË㽨ÒéʹÓÃÔöÁ¿¼ÆËãÀ´¼õÉÙ״̬µÄ´óС¡£
Q4£ºFlink on Yarn£¬Yarn ÖØÆô»á×Ô¶¯ÀÆð Flink ÈÎÎñÂð£¬Ëµ²»ÄÜÀÆðÔõô´¦Àí£¬ÊÖ¶¯Æô¶¯Âð£¿
A£ºÈç¹ûÅäÖÃÁ˸߿ÉÓã¨ÒÀÀµ zookeeper£©£¬×÷ҵʧ°ÜÁ˾ͿÉÒÔ×Ô¶¯ÀÆð¡£
Q5£ºKafka Ŀǰ¶àÓÃ×÷Êý¾ÝÖÐתƽ̨£¬Flink Ï൱ÓÚÌæ´úÁË
Kafka Stream Âð£¿
A£ºKafkaµÄºËÐŦÄÜÊÇÏûÏ¢Öмä¼þ£¬kafka stream ¿ÉÒÔ¸ú kafka ºÜºÃµÄ¼¯³É£¬µ«²¢²»ÊÇÒ»¸öרҵµÄ¼ÆËãÒýÇæ¡£Ïà±È¶øÑÔ£¬flink
ÊÇÒ»¸ö·Ö²¼Ê½µÄÁ÷ʽ¼ÆËãÒýÇæ£¬¹¦ÄÜÉϸü¼ÓÇ¿´ó¡£
Q6£ºÄãÃÇÔõô¿´´ý Apache Beam£¿
A£ºApache Beam ÔÚÉÏ²ã½øÐÐÁ˳éÏ󣬿ÉÒÔÀà±È SQL£¬Ö»¶¨Ò广·¶£¬µ×²ã¿ÉÒÔ½ÓÈë¸÷ÖÖ¼ÆËãÒýÇæ¡£
|