Apache Beam£¨ÔÃûGoogle DataFlow£©ÊÇGoogleÔÚ2016Äê2Ô·ݹ±Ï׸øApache»ù½ð»áµÄ·õ»¯ÏîÄ¿£¬±»ÈÏΪÊǼÌMapReduce¡¢GFSºÍBigQueryµÈÖ®ºó£¬GoogleÔÚ´óÊý¾Ý´¦ÀíÁìÓò¶Ô¿ªÔ´ÉçÇøµÄÓÖÒ»¹±Ïס£Apache
BeamµÄÖ÷ҪĿ±êÊÇͳһÅú´¦ÀíºÍÁ÷´¦ÀíµÄ±à³Ì·¶Ê½£¬ÎªÎÞÏÞ¡¢ÂÒÐò£¬Web-ScaleµÄÊý¾Ý¼¯´¦ÀíÌṩ¼òµ¥Áé»î¡¢¹¦ÄܷḻÒÔ¼°±í´ïÄÜÁ¦Ê®·ÖÇ¿´óµÄSDK¡£Apache
BeamÏîÄ¿ÖØµãÔÚÓÚÊý¾Ý´¦ÀíµÄ±à³Ì·¶Ê½ºÍ½Ó¿Ú¶¨Ò壬²¢²»Éæ¼°¾ßÌåÖ´ÐÐÒýÇæµÄʵÏÖ¡£±¾ÎÄÖ÷Òª½éÉÜApache
BeamµÄ±à³Ì·¶Ê½¡ª¡ªBeam Model£¬ÒÔ¼°Í¨¹ýBeam SDKÈçºÎ·½±ãÁé»îµØ±àд·Ö²¼Ê½Êý¾Ý´¦ÀíÒµÎñÂß¼£¬Ï£Íû¶ÁÕßÄܹ»Í¨¹ý±¾ÎĶÔApache
BeamÓгõ²½Á˽⣬ͬʱ¶ÔÓÚ·Ö²¼Ê½Êý¾Ý´¦ÀíϵͳÈçºÎ´¦ÀíÂÒÐòÎÞÏÞÊý¾ÝÁ÷µÄÄÜÁ¦Óгõ²½ÈÏʶ¡£
Apache Beam»ù±¾¼Ü¹¹
Ëæ×Å·Ö²¼Ê½Êý¾Ý´¦Àí²»¶Ï·¢Õ¹£¬Òµ½çÓ¿ÏÖ³öÔ½À´Ô½¶àµÄ·Ö²¼Ê½Êý¾Ý´¦Àí¿ò¼Ü£¬´Ó×îÔçµÄHadoop MapReduce£¬µ½Apache
Spark¡¢Apache Storm¡¢ÒÔ¼°¸ü½üµÄApache Flink¡¢Apache ApexµÈ¡£Ðµķֲ¼Ê½´¦Àí¿ò¼Ü¿ÉÄÜ´øÀ´¸ü¸ßÐÔÄÜ£¬¸üÇ¿´ó¹¦ÄÜ£¬¸üµÍÑӳٵȣ¬µ«Óû§Çл»µ½Ð·ֲ¼Ê½´¦Àí¿ò¼ÜµÄ´ú¼ÛÒ²·Ç³£´ó£ºÐèҪѧϰһ¸öеÄÊý¾Ý´¦Àí¿ò¼Ü£¬²¢ÖØÐ´ËùÓÐÒµÎñÂß¼¡£½â¾öÕâ¸öÎÊÌâµÄ˼·°üÀ¨Á½²¿·Ö£¬Ê×ÏÈ£¬ÐèÒªÒ»¸ö±à³Ì·¶Ê½£¬Äܹ»Í³Ò»¹æ·¶·Ö²¼Ê½Êý¾Ý´¦ÀíµÄÐèÇó£¬ÀýÈçͳһÅú´¦ÀíºÍÁ÷´¦ÀíµÄÐèÇ󡣯ä´Î£¬Éú³ÉµÄ·Ö²¼Ê½Êý¾Ý´¦ÀíÈÎÎñÓ¦¸ÃÄܹ»ÔÚ¸÷¸ö·Ö²¼Ê½ÒýÇæÉÏÖ´ÐУ¬Óû§¿ÉÒÔ×ÔÓÉÇл»Ö´ÐÐÒýÇæÓëÖ´Ðл·¾³¡£Apache
BeamÕýÊÇΪÁ˽â¾öÒÔÉÏÎÊÌâ¶øÌá³öµÄ¡£ËüÖ÷ÒªÓÉBeam SDKºÍBeam Runner×é³É£¬Beam
SDK¶¨ÒåÁË¿ª·¢·Ö²¼Ê½Êý¾Ý´¦ÀíÈÎÎñÒµÎñÂß¼µÄAPI½Ó¿Ú£¬Éú³ÉµÄµÄ·Ö²¼Ê½Êý¾Ý´¦ÀíÈÎÎñPipeline½»¸ø¾ßÌåµÄBeam
RunnerÖ´ÐÐÒýÇæ¡£Apache BeamĿǰ֧³ÖµÄAPI½Ó¿ÚÓÉJavaÓïÑÔʵÏÖ£¬Python°æ±¾µÄAPIÕýÔÚ¿ª·¢Ö®ÖС£ËüÖ§³ÖµÄµ×²ãÖ´ÐÐÒýÇæ°üÀ¨Apache
Flink¡¢Apache SparkÒÔ¼°Google Cloud Platform£¬´ËÍâApache
Storm¡¢Apache Hadoop¡¢Apache GearpumpµÈÖ´ÐÐÒýÇæµÄÖ§³ÖÒ²ÔÚÌÖÂÛ»ò¿ª·¢ÖС£Æä»ù±¾¼Ü¹¹Èçͼ1¡£

ÐèҪעÒâµÄÊÇ£¬ËäÈ»Apache BeamÉçÇø·Ç³£Ï£ÍûËùÓеÄBeamÖ´ÐÐÒýÇæ¶¼Äܹ»Ö§³ÖBeam SDK¶¨ÒåµÄ¹¦ÄÜÈ«¼¯£¬µ«ÔÚʵ¼ÊʵÏÖÖпÉÄܲ¢²»Ò»¶¨¡£ÀýÈ磬»ùÓÚMapReduceµÄRunnerÏÔÈ»ºÜÄÑʵÏÖºÍÁ÷´¦ÀíÏà¹ØµÄ¹¦ÄÜÌØÐÔ¡£Ä¿Ç°Google
DataFlow CloudÊǶÔBeam SDK¹¦Äܼ¯Ö§³Ö×îÈ«ÃæµÄÖ´ÐÐÒýÇæ£¬ÔÚ¿ªÔ´Ö´ÐÐÒýÇæÖУ¬Ö§³Ö×îÈ«ÃæµÄÔòÊÇApache
Flink¡£
Beam Model
Beam ModelÖ¸BeamµÄ±à³Ì·¶Ê½£¬¼´Beam SDK±³ºóµÄÉè¼ÆË¼Ïë¡£ÔÚ½éÉÜBeam Modelǰ£¬ÏȽéÉÜÏÂBeam
ModelÒª´¦ÀíµÄÎÊÌâÓòÓë»ù±¾¸ÅÄî¡£
Êý¾Ý¡£Òª´¦ÀíµÄÊý¾ÝÒ»°ã¿ÉÒÔ·ÖΪÁ½À࣬ÓÐÏÞµÄÊý¾Ý¼¯ºÍÎÞÏÞµÄÊý¾ÝÁ÷¡£¶ÔÓÚǰÕߣ¬±ÈÈçÒ»¸öHDFSÖеÄÎļþ£¬Ò»¸öHBase±íµÈ£¬ÌصãÊÇÊý¾ÝÌáǰÒѾ´æÔÚ£¬Ò»°ãÒ²ÒѾ³Ö¾Ã»¯£¬²»»áͻȻÏûʧ¡£¶øÎÞÏÞµÄÊý¾ÝÁ÷£¬±ÈÈçKafkaÖÐÁ÷¹ýÀ´µÄϵͳÈÕÖ¾Á÷£¬»òÊÇ´ÓTwitter
APIÄõ½µÄTwitterÁ÷µÈ£¬ÕâÀàÊý¾ÝµÄÌØµãÊǶ¯Ì¬Á÷È룬ÎÞÇîÎÞ¾¡£¬ÎÞ·¨È«²¿³Ö¾Ã»¯¡£Ò»°ãÀ´Ëµ£¬Åú´¦Àí¿ò¼ÜµÄÉè¼ÆÄ¿±êÊÇÓÃÀ´´¦ÀíÓÐÏÞµÄÊý¾Ý¼¯£¬Á÷´¦Àí¿ò¼ÜµÄÉè¼ÆÄ¿±êÊÇÓÃÀ´´¦ÀíÎÞÏÞµÄÊý¾ÝÁ÷¡£ÓÐÏÞµÄÊý¾Ý¼¯¿ÉÒÔ¿´×öÎÞÏÞÊý¾ÝÁ÷µÄÒ»ÖÖÌØÀý£¬µ«ÊÇ´ÓÊý¾Ý´¦ÀíÂß¼½Ç¶È£¬ÕâÁ½Õß²¢ÎÞ²»Í¬Ö®´¦¡£ÀýÈ磬¼ÙÉè΢²©Êý¾Ý°üº¬Ê±¼ä´ÁºÍת·¢Á¿£¬Óû§Ï£Íû°´ÕÕÿСʱµÄת·¢Á¿Í³¼Æ×ܺͣ¬´ËÒµÎñÂß¼Ó¦¸Ã¿ÉÒÔͬʱÔÚÓÐÏÞÊý¾Ý¼¯ºÍÎÞÏÞÊý¾ÝÁ÷ÉÏÖ´ÐУ¬²¢²»Ó¦¸ÃÒòΪÊý¾ÝÔ´µÄ²»Í¬¶ø¶ÔÒµÎñÂß¼µÄʵÏÖ²úÉúÈκÎÓ°Ïì¡£
ʱ¼ä¡£Process TimeÊÇÖ¸Êý¾Ý½øÈë·Ö²¼Ê½´¦Àí¿ò¼ÜµÄʱ¼ä£¬¶øEvent-TimeÔòÊÇÖ¸Êý¾Ý²úÉúµÄʱ¼ä¡£ÕâÁ½¸öʱ¼äͨ³£ÊDz»Í¬µÄ£¬ÀýÈ磬¶ÔÓÚÒ»¸ö´¦Àí΢²©Êý¾ÝµÄÁ÷¼ÆËãÈÎÎñ£¬Ò»Ìõ2016-06-01-12:00:00·¢±íµÄ΢²©¾¹ýÍøÂç´«ÊäµÈÑÓ³Ù¿ÉÄÜÔÚ2016-06-01-12:01:30²Å½øÈëµ½Á÷´¦ÀíϵͳÖС£Åú´¦ÀíÈÎÎñͨ³£½øÐÐÈ«Á¿µÄÊý¾Ý¼ÆË㣬½ÏÉÙ¹Ø×¢Êý¾ÝµÄʱ¼äÊôÐÔ£¬µ«ÊǶÔÓÚÁ÷´¦ÀíÈÎÎñÀ´Ëµ£¬ÓÉÓÚÊý¾ÝÁ÷ÊÇÎÞÇîÎÞ¾¡µÄ£¬ÎÞ·¨½øÐÐÈ«Á¿¼ÆË㣬ͨ³£ÊǶÔij¸ö´°¿ÚÖеÄÊý¾Ý½øÐмÆËã¡£¶ÔÓڴ󲿷ֵÄÁ÷´¦ÀíÈÎÎñÀ´Ëµ£¬°´ÕÕʱ¼ä½øÐд°¿Ú»®·Ö£¬¿ÉÄÜÊÇ×î³£¼ûµÄÐèÇó¡£
ÂÒÐò¡£¶ÔÓÚÁ÷´¦Àí¿ò¼ÜµÄÊý¾ÝÁ÷À´Ëµ£¬ÆäÊý¾ÝµÄµ½´ï˳Ðò¿ÉÄܲ¢²»Ñϸñ°´ÕÕEvent-TimeµÄʱ¼ä˳Ðò¡£Èç¹û»ùÓÚProcess
Time¶¨Òåʱ¼ä´°¿Ú£¬Êý¾Ýµ½´ïµÄ˳Ðò¾ÍÊÇÊý¾ÝµÄ˳Ðò£¬Òò´Ë²»´æÔÚÂÒÐòÎÊÌâ¡£µ«¶ÔÓÚ»ùÓÚEvent Time¶¨ÒåµÄʱ¼ä´°¿ÚÀ´Ëµ£¬¿ÉÄÜ´æÔÚʱ¼ä¿¿Ç°µÄÏûÏ¢ÔÚʱ¼ä¿¿ºóµÄÏûÏ¢ºóµ½´ïµÄÇé¿ö£¬ÕâÔÚ·Ö²¼Ê½µÄÊý¾ÝÔ´ÖпÉÄܷdz£³£¼û¡£¶ÔÓÚÕâÖÖÇé¿ö£¬ÈçºÎÈ·¶¨³Ùµ½Êý¾Ý£¬ÒÔ¼°¶ÔÓÚ³Ùµ½Êý¾ÝÈçºÎ´¦Àíͨ³£ÊǺܼ¬ÊÖµÄÎÊÌâ¡£
Beam Model´¦ÀíµÄÄ¿±êÊý¾ÝÊÇÎÞÏÞµÄʱ¼äÂÒÐòÊý¾ÝÁ÷£¬²»¿¼ÂÇʱ¼ä˳Ðò»òÊÇÓÐÏÞµÄÊý¾Ý¼¯¿É¿´×öÊÇÎÞÏÞÂÒÐòÊý¾ÝÁ÷µÄÒ»¸öÌØÀý¡£Beam
Model´ÓÏÂÃæËĸöά¶È¹éÄÉÁËÓû§ÔÚ½øÐÐÊý¾Ý´¦ÀíµÄʱºòÐèÒª¿¼ÂǵÄÎÊÌ⣺
What¡£ÈçºÎ¶ÔÊý¾Ý½øÐмÆË㣿ÀýÈ磬Sum¡¢Join»òÊÇ»úÆ÷ѧϰÖÐѵÁ·Ñ§Ï°Ä£Ð͵ȡ£ÔÚBeam
SDKÖÐÓÉPipelineÖеIJÙ×÷·ûÖ¸¶¨¡£
Where¡£Êý¾ÝÔÚʲô·¶Î§ÖмÆË㣿ÀýÈ磬»ùÓÚProcess-TimeµÄʱ¼ä´°¿Ú£¬»ùÓÚEvent-TimeµÄʱ¼ä´°¿Ú¡¢»¬¶¯´°¿ÚµÈ¡£ÔÚBeamSDKÖÐÓÉPipelineÖеĴ°¿ÚÖ¸¶¨¡£
When¡£ºÎʱ½«¼ÆËã½á¹ûÊä³ö£¿ÀýÈ磬ÔÚ1СʱµÄEvent-Timeʱ¼ä´°¿ÚÖУ¬Ã¿¸ô1·ÖÖÓ£¬½«µ±Ç°´°¿Ú¼ÆËã½á¹ûÊä³ö¡£ÔÚBeam
SDKÖÐÓÉPipelineÖеÄWatermarkºÍ´¥·¢Æ÷Ö¸¶¨¡£
How¡£³Ùµ½Êý¾ÝÈçºÎ´¦Àí£¿ÀýÈ磬½«³Ùµ½Êý¾Ý¼ÆËãÔöÁ¿½á¹ûÊä³ö£¬»òÊǽ«³Ùµ½Êý¾Ý¼ÆËã½á¹ûºÍ´°¿ÚÄÚÊý¾Ý¼ÆËã½á¹ûºÏ²¢³ÉÈ«Á¿½á¹ûÊä³ö¡£ÔÚBeam
SDKÖÐÓÉAccumulationÖ¸¶¨¡£
Beam Model½«¡°WWWH¡±Ëĸöά¶È³éÏó³öÀ´×é³ÉÁËBeam SDK£¬Óû§ÔÚ»ùÓÚËü¹¹½¨Êý¾Ý´¦ÀíÒµÎñÂ߼ʱ£¬ÔÚÿһ²½Ö»ÐèÒª¸ù¾ÝÒµÎñÐèÇó°´ÕÕÕâËĸöά¶Èµ÷ÓþßÌåµÄAPI¼´¿ÉÉú³É·Ö²¼Ê½Êý¾Ý´¦ÀíPipeline£¬²¢Ìá½»µ½¾ßÌåÖ´ÐÐÒýÇæÉÏ¡£¡°WWWH¡±Ëĸöά¶ÈµÄ³éÏó½ö¹Ø×¢ÒµÎñÂß¼±¾Éí£¬ºÍ·Ö²¼Ê½ÈÎÎñÈçºÎÖ´ÐÐûÓÐÈκιØÏµ¡£
Beam SDK
²»Í¬ÓÚApache Flink»òÊÇApache Spark£¬Beam SDKʹÓÃͬһÌ×API±íʾÊý¾ÝÔ´¡¢Êä³öÄ¿±êÒÔ¼°²Ù×÷·ûµÈ¡£ÏÂÃæ½éÉÜ4¸ö»ùÓÚBeam
SDKµÄÊý¾Ý´¦ÀíÈÎÎñ£¬Í¨¹ýËüÃÇ£¬¶ÁÕß¿ÉÒÔÁ˽âBeam ModelÊÇÈçºÎͳһÁé»îµØÃèÊöÅú´¦ÀíºÍÁ÷´¦ÀíÈÎÎñµÄ£¬Õâ3¸öÈÎÎñÓÃÀ´´¦ÀíÊÖ»úÓÎÏ·ÁìÓòµÄͳ¼ÆÐèÇ󣬰üÀ¨£º
Óû§·ÖÊý£ºÅú´¦ÀíÈÎÎñ£¬»ùÓÚÓÐÏÞÊý¾Ý¼¯Í³¼ÆÓû§·ÖÊý¡£
ÿСʱÍŶӷÖÊý£ºÅú´¦ÀíÈÎÎñ£¬»ùÓÚÓÐÏÞÊý¾Ý¼¯Í³¼ÆÃ¿Ð¡Ê±£¬Ã¿¸öÍŶӵķÖÊý¡£
ÅÅÐаñ£ºÁ÷´¦ÀíÈÎÎñ£¬2¸öͳ¼ÆÏÿСʱÿ¸öÍŶӵķÖÊýÒÔ¼°Óû§ÊµÊ±µÄÀúÊ·×ܵ÷ÖÊý¡£
ÏÂÃæ»ùÓÚBeam ModelµÄ¡°WWWH¡±Ëĸöά¶È£¬·ÖÎöÒµÎñÂß¼£¬²¢Í¨¹ý´úÂëչʾÈçºÎͨ¹ýBeamSDKʵÏÖ¡°WWWH¡±Ëĸöά¶ÈµÄÒµÎñÂß¼¡£
Óû§·ÖÊý
ͳ¼ÆÃ¿¸öÓû§µÄÀúÊ·×ܵ÷ÖÊýÊÇÒ»¸ö·Ç³£¼òµ¥µÄÈÎÎñ£¬ÔÚÕâÀïÎÒÃǼòµ¥µØÍ¨¹ýÒ»¸öÅú´¦ÀíÈÎÎñʵÏÖ£¬Ã¿´ÎÐèҪеÄÓû§·ÖÊýÊý¾Ý£¬ÖØÐÂÖ´ÐÐÒ»´ÎÕâ¸öÅú´¦ÀíÈÎÎñ¼´¿É¡£¶ÔÓÚÓû§·ÖÊýÈÎÎñ£¬¡°WWWH¡±ËÄά¶È·ÖÎö½á¹ûÈçÏ£º

ͨ¹ý¡°WWWH¡±µÄ·ÖÎö£¬¶ÔÓÚÓû§·ÖÊýÕâ¸öÅú´¦ÀíÈÎÎñ£¬Í¨¹ýBeam Java SDKʵÏֵĴúÂëÈçÏÂËùʾ£º
gameEvents [... input ...] [... parse ...] .apply("ExtractUserScore", new ExtractAndSumScore("user")) [... output ...]; |
ExtractAndSumScoreʵÏÖÁË¡°What¡±ÖÐÃèÊöµÄÂß¼£¬¼´°´Óû§·Ö×éÈ»ºóÀÛ¼Ó·ÖÊý£¬Æä´úÂëÈçÏ£º
gameInfo .apply(MapElements . via((GameActionInfo gInfo) -> KV. of(gInfo.getKey( field ), gInfo.getScore())) .withOutputType( TypeDescriptors. kvs(TypeDescriptors. strings(), TypeDescriptors. integers()))) .apply(Sum.<String> integersPerKey()); |
ͨ¹ýMapElementsÈ·¶¨KeyÓëValue·Ö±ðÊÇÓû§Óë·ÖÊý£¬È»ºóSum¶¨Òå°´key·Ö×飬²¢ÀÛ¼Ó·ÖÊý¡£BeamÖ§³Ö½«¶à¸ö¶ÔÊý¾ÝµÄ²Ù×÷ºÏ²¢³ÉÒ»¸ö²Ù×÷£¬ÕâÑù²»½ö¿ÉÒÔÖ§³Ö¸üÇåÎúµÄÒµÎñÂ߼ʵÏÖ£¬Í¬Ê±Ò²¿ÉÒÔÔÚ¶à´¦ÖØÓúϲ¢ºóµÄ²Ù×÷Âß¼¡£
ÿСʱÍŶӷÖÊý
°´ÕÕСʱͳ¼ÆÃ¿¸öÍŶӵķÖÊý£¬»ñµÃ×î¸ß·ÖÊýµÄÍŶӿÉÄÜ»ñµÃ½±Àø£¬Õâ¸ö·ÖÎöÈÎÎñÔö¼ÓÁ˶Դ°¿ÚµÄÒªÇ󣬲»¹ýÎÒÃÇÒÀÈ»¿ÉÒÔͨ¹ýÒ»¸öÅú´¦ÀíÈÎÎñʵÏÖ£¬¸ÃÈÎÎñµÄ¡°WWWH¡±ËÄά¶È·ÖÎöÈçÏ£º

Ïà¶ÔÓÚµÚÒ»¸öÓû§·ÖÊýÈÎÎñ£¬Ö»ÊÇÔÚWhere²¿·Ö»Ø´ðÁË¡°Êý¾ÝÔÚʲô·¶Î§ÖмÆË㣿¡±µÄÎÊÌ⣬ͬʱÔÚWhat²¿·Ö¡°ÈçºÎ¼ÆËãÊý¾Ý£¿¡±ÖУ¬·Ö×éµÄÌõ¼þÓÉÓû§¸ÄΪÁËÍŶӣ¬ÕâÔÚ´úÂëÖÐÒ²»áÏàÓ¦ÌåÏÖ£º
gameEvents [... input ...] [... parse ...] .apply("AddEventTimestamps", WithTimestamps.of((GameActionInfo i) -> new Instant(i.getTimestamp()))) .apply("FixedWindowsTeam", Window.<GameActionInfo>into( FixedWindows.of(Duration.standardMinutes(windowDuration)))) .apply("ExtractTeamScore", new ExtractAndSumScore("team")) [... output ...]; |
¡°AddEventTimestamps¡±¶¨ÒåÁËÈçºÎ´ÓÔʼÊý¾ÝÖгéÈ¡EventTimeÊý¾Ý£¬¡°FixedWindowsTeam¡±Ôò¶¨ÒåÁË1Сʱ¹Ì¶¨´°¿Ú£¬È»ºóÖØÓÃÁËExtractAndSumScoreÀֻ࣬Êǽ«·Ö×éµÄÁдÓÓû§¸Ä³ÉÁËÍŶӡ£¶ÔÓÚÿСʱÍŶӷÖÊýÈÎÎñ£¬ÒýÈëÁ˹ØÓÚ¡°Where¡±²¿·Ö´°¿Ú¶¨ÒåµÄÐÂÒµÎñÂß¼£¬µ«ÊÇ´Ó´úÂëÖпÉÒÔ¿´µ½£¬¹ØÓÚ¡°Where¡±²¿·ÖµÄʵÏֺ͹ØÓÚ¡°What¡±²¿·ÖµÄʵÏÖÊÇÍêÈ«¶ÀÁ¢µÄ£¬Óû§Ö»ÐèҪмÓÁ½ÐйØÓÚ¡°Where¡±µÄ´úÂ룬·Ç³£¼òµ¥ºÍÇåÎú¡£
ÅÅÐаñ
Ç°ÃæÁ½¸öÈÎÎñ¾ùÊÇ»ùÓÚÓÐÏÞÊý¾Ý¼¯µÄÅú´¦ÀíÈÎÎñ£¬¶ÔÓÚÅÅÐаñÀ´Ëµ£¬ÎÒÃÇͬÑùÐèҪͳ¼ÆÓû§·ÖÊýÒÔ¼°Ã¿Ð¡Ê±ÍŶӷÖÊý£¬µ«ÊÇ´ÓÒµÎñ½Ç¶ÈÏ£ÍûµÃµ½µÄÊÇʵʱÊý¾Ý¡£¶ÔÓÚApache
BeamÀ´Ëµ£¬Ò»¸öÏàͬ´¦ÀíÂß¼µÄÅú´¦ÀíÈÎÎñºÍÁ÷´¦ÀíÈÎÎñµÄΨһ²»Í¬¾ÍÊÇÈÎÎñµÄÊäÈëºÍÊä³ö£¬ÖмäµÄÒµÎñÂß¼PipelineÎÞÐèÈκθı䡣¶ÔÓÚµ±Ç°Ê¾ÀýµÄÅÅÐаñÊý¾Ý·ÖÎöÈÎÎñ£¬ÎÒÃDz»½öÏ£ÍûËûÃÇÂú×ãºÍǰÁ½¸öʾÀýÏàͬµÄÒµÎñÂß¼£¬Í¬Ê±Ò²¿ÉÒÔÂú×ã¸ü¶¨ÖÆ»¯µÄÒµÎñÐèÇó£¬ÀýÈ磺
1.Á÷´¦ÀíÈÎÎñÏà¶ÔÓÚÅú´¦ÀíÈÎÎñ£¬Ò»¸ö·Ç³£ÖØÒªµÄÌØÐÔÊÇ£¬Á÷´¦ÀíÈÎÎñ¿ÉÒÔ¸ü¼ÓʵʱµØ·µ»Ø¼ÆËã½á¹û£¬ÀýÈç¼ÆËãÿСʱÍŶӷÖÊýʱ£¬¶ÔÓÚһСʱµÄʱ¼ä´°¿Ú£¬Ä¬ÈÏÊÇÔÚһСʱµÄÊý¾ÝÈ«²¿µ½´ïºó£¬°Ñ×îÖյļÆËã½á¹ûÊä³ö£¬µ«ÊÇÁ÷´¦ÀíϵͳӦ¸Ãͬʱ֧³ÖÔÚһСʱ´°¿ÚÖ»Óв¿·ÖÊý¾Ýµ½´ïʱ£¬¾Í½«²¿·Ö¼ÆËã½á¹ûÊä³ö£¬´Ó¶øÊ¹µÃÓû§¿ÉÒԵõ½ÊµÊ±µÄ·ÖÎö½á¹û¡£
2.±£Ö¤ºÍÅú´¦ÀíÈÎÎñÒ»ÖµļÆËã½á¹ûÕýÈ·ÐÔ¡£ÓÉÓÚÂÒÐòÊý¾ÝµÄ´æÔÚ£¬¶ÔÓÚijһ¸ö¼ÆËã´°¿Ú£¬ÈçºÎÈ·¶¨ËùÓÐÊý¾ÝÊÇ·ñµ½´ï£¨Watermark£©£¿³Ùµ½Êý¾ÝÈçºÎ´¦Àí£¿´¦Àí½á¹ûÈçºÎÊä³ö¡¢×ÜÁ¿¡¢ÔöÁ¿¡¢²¢ÁУ¿Á÷´¦ÀíϵͳӦ¸ÃÌṩ»úÖÆ±£Ö¤Óû§¿ÉÒÔÔÚÂú×ãµÍÑÓ³ÙÐÔÄܵÄͬʱ´ïµ½×îÖյļÆËã½á¹ûÕýÈ·ÐÔ¡£
ÉÏÊöÁ½¸öÎÊÌâÕýÊÇͨ¹ý»Ø´ð¡°When¡±ºÍ¡°How¡±Á½¸öÎÊÌâÀ´¶¨ÒåÓû§µÄÊý¾Ý·ÖÎöÐèÇ󡣡°When¡±È¡¾öÓÚÓû§Ï£Íû¶à¾ÃµÃµ½¼ÆËã½á¹û£¬Ôڻشð¡°When¡±µÄʱºò£¬»ù±¾ÉÏ¿ÉÒÔ·ÖΪËĸö½×¶Î£º
Early¡£ÔÚ´°¿Ú½áÊøÇ°£¬È·¶¨ºÎʱÊä³öÖмä״̬Êý¾Ý¡£
On-Time¡£ÔÚ´°¿Ú½áÊøÊ±£¬Êä³ö´°¿ÚÊý¾Ý¼ÆËã½á¹û¡£ÓÉÓÚÂÒÐòÊý¾ÝµÄ´æÔÚ£¬ÈçºÎÅжϴ°¿Ú½áÊø¿ÉÄÜÊÇÓû§¸ù¾Ý¶îÍâµÄ֪ʶԤ¹ÀµÄ£¬ÇÒÔÊÐíÔÚÓû§É趨µÄ´°¿Ú½áÊøºó³öÏÖ³Ùµ½µÄÊôÓڸô°¿ÚµÄÊý¾Ý¡£
Late¡£ÔÚ´°¿Ú½áÊøºó£¬Óгٵ½µÄÊý¾Ýµ½´ï£¬ÔÚÕâ¸ö½×¶Î£¬ºÎʱÊä³ö¼ÆËã½á¹û¡£
Final¡£Äܹ»ÈÝÈ̳ٵ½µÄ×î´óÏÞ¶È£¬ÀýÈç1Сʱ¡£µ½´ï×îºóµÄµÈ´ýʱ¼äºó£¬Êä³ö×îÖյļÆËã½á¹û£¬Í¬Ê±²»ÔÙ½ÓÊÜÖ®ºóµÄ³Ùµ½Êý¾Ý£¬ÇåÀí¸Ã´°¿ÚµÄ״̬Êý¾Ý¡£
¶ÔÓÚÿСʱÍŶӵ÷ֵÄÁ÷´¦ÀíÈÎÎñ£¬±¾Ê¾ÀýÏ£ÍûµÄÒµÎñÂ߼Ϊ£¬»ùÓÚEvent
TimeµÄ1Сʱʱ¼ä´°¿Ú£¬°´ÍŶӼÆËã·ÖÊý£¬ÔÚһСʱ´°¿ÚÄÚ£¬Ã¿5·ÖÖÓÊä³öÒ»´Îµ±Ç°µÄÍŶӷÖÊý£¬¶ÔÓÚ³Ùµ½µÄÊý¾Ý£¬Ã¿10·ÖÖÓÊä³öÒ»´Îµ±Ç°µÄÍŶӷÖÊý£¬ÔÚ´°¿Ú½áÊø2Сʱºó³Ùµ½µÄÊý¾ÝÒ»°ã²»¿ÉÄÜ»á³öÏÖ£¬¼ÙÈç³öÏֵϰ£¬Ö±½ÓÅׯú¡£¡°WWWH¡±±í´ïÈçÏ£º

ÔÚ»ùÓÚBeam SDKµÄʵÏÖÖУ¬Óû§»ùÓÚ¡°WWWH¡± Beam Model±íʾµÄÒµÎñÂß¼¿ÉÒÔ¶ÀÁ¢Ö±½ÓµØÊµÏÖ£º
gameEvents [... input ...] .apply("LeaderboardTeamFixedWindows", Window .<GameActionInfo>into(FixedWindows.of( Duration.standardMinutes(Durations.minutes(60)))) .triggering(AfterWatermark.pastEndOfWindow() .withEarlyFirings(AfterProcessingTime.pastFirstElementInPane() .plusDelayOf(Durations.minutes(5))) .withLateFirings(AfterProcessingTime.pastFirstElementInPane() .plusDelayOf(Durations.minutes(10)))) .withAllowedLateness(Duration.standardMinutes(120) .accumulatingFiredPanes()) .apply("ExtractTeamScore", new ExtractAndSumScore("team")) [... output ...] |
LeaderboardTeamFixedWindows¶ÔÓ¦¡°Where¡±¶¨Òå´°¿Ú£¬Trigger¶ÔÓ¦¡°Where¡±¶¨Òå½á¹ûÊä³öÌõ¼þ£¬Accumulation¶ÔÓ¦¡°How¡±¶¨ÒåÊä³ö½á¹ûÄÚÈÝ£¬ExtractTeamScore¶ÔÓ¦¡°What¡±¶¨Ò弯ËãÂß¼¡£
×ܽá
Apache BeamµÄBeam Model¶ÔÎÞÏÞÂÒÐòÊý¾ÝÁ÷µÄÊý¾Ý´¦Àí½øÐÐÁ˷dz£ÓÅÑŵijéÏ󣬡°WWWH¡±Ëĸöά¶È¶ÔÊý¾Ý´¦ÀíµÄÃèÊö£¬Ê®·ÖÇåÎúÓëºÏÀí£¬Beam
ModelÔÚͳһÁ˶ÔÎÞÏÞÊý¾ÝÁ÷ºÍÓÐÏÞÊý¾Ý¼¯µÄ´¦ÀíģʽµÄͬʱ£¬Ò²Ã÷È·Á˶ÔÎÞÏÞÊý¾ÝÁ÷µÄÊý¾Ý´¦Àí·½Ê½µÄ±à³Ì·¶Ê½£¬À©´óÁËÁ÷´¦Àíϵͳ¿ÉÓ¦ÓõÄÒµÎñ·¶Î§¡£Apache
Flink¡¢Apache Spark StreamingµÈÏîÄ¿µÄAPIÉè¼Æ¾ùÔ½À´Ô½¶àµØ½è¼ø»ò²Î¿¼ÁËApache
Beam Model£¬ÇÒ×÷ΪBeam RunnerµÄʵÏÖ£¬ÓëBeam SDKµÄ¼æÈݶÈÒ²Ô½À´Ô½¸ß¡£´ËÍ⣬ÓÉÓÚApache
BeamÒѾ½øÈëApache Incubator·õ»¯£¬¶ÁÕßÒ²¿ÉÒÔͨ¹ý¹ÙÍø»òÊÇÓʼþ×éÁ˽â¸ü¶àApache
BeamµÄ½øÕ¹ºÍ״̬¡£