Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Apache Beam£ºÏÂÒ»´úµÄÊý¾Ý´¦Àí±ê×¼
 
×÷Õß:Àî³ÊÏé À´Ô´£º¼«¿ÍÍ·Ìõ ·¢²¼ÓÚ2017-2-7
  3177  次浏览      29
 

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µÄ½øÕ¹ºÍ״̬¡£

   
3177 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ
×îл¼Æ»®
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 12-11[±±¾©]
LLM´óÄ£ÐÍÓëÖÇÄÜÌ忪·¢ÊµÕ½ 12-18[±±¾©]
ǶÈëʽÈí¼þ²âÊÔ 12-25[±±¾©]
AIÔ­ÉúÓ¦ÓõÄ΢·þÎñ¼Ü¹¹ 1-9[±±¾©]
AI´óÄ£Ðͱàд¸ßÖÊÁ¿´úÂë 1-14[±±¾©]
ÐèÇó·ÖÎöÓë¹ÜÀí 1-22[±±¾©]

MySQLË÷Òý±³ºóµÄÊý¾Ý½á¹¹
MySQLÐÔÄܵ÷ÓÅÓë¼Ü¹¹Éè¼Æ
SQL ServerÊý¾Ý¿â±¸·ÝÓë»Ö¸´
ÈÃÊý¾Ý¿â·ÉÆðÀ´ 10´óDB2ÓÅ»¯
oracleµÄÁÙʱ±í¿Õ¼äдÂú´ÅÅÌ
Êý¾Ý¿âµÄ¿çƽ̨Éè¼Æ

²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿â
¸ß¼¶Êý¾Ý¿â¼Ü¹¹Éè¼ÆÊ¦
HadoopÔ­ÀíÓëʵ¼ù
Oracle Êý¾Ý²Ö¿â
Êý¾Ý²Ö¿âºÍÊý¾ÝÍÚ¾ò
OracleÊý¾Ý¿â¿ª·¢Óë¹ÜÀí

GE Çø¿éÁ´¼¼ÊõÓëʵÏÖÅàѵ
º½Ìì¿Æ¹¤Ä³×Ó¹«Ë¾ Nodejs¸ß¼¶Ó¦Óÿª·¢
ÖÐÊ¢Òæ»ª ׿Խ¹ÜÀíÕß±ØÐë¾ß±¸µÄÎåÏîÄÜÁ¦
ijÐÅÏ¢¼¼Êõ¹«Ë¾ PythonÅàѵ
ij²©²ÊITϵͳ³§ÉÌ Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À
ÖйúÓÊ´¢ÒøÐÐ ²âÊÔ³ÉÊì¶ÈÄ£Ðͼ¯³É(TMMI)
ÖÐÎïÔº ²úÆ·¾­ÀíÓë²úÆ·¹ÜÀí