±à¼ÍƼö: |
±¾ÎĽ«°´ÕÕ¡°·¢ÏÖÎÊÌâ-½â¾öÎÊÌ⡱µÄÏßË÷£¬ÑÐò½¥½øµØÌÖÂÛ
Watermark »úÖÆÔÚ Pravega ÖеÄÉè¼ÆºÍʵÏÖ£¬²¢¶Ô±È Flink
µÄʵÏÖ¡£
±¾ÎÄÀ´×Ô¹«ÖںŠinfoQ£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
ÔÚÁ÷ʽ¼ÆËãµÄÊÀ½çÖУ¬Ê±¼äÎÊÌâÒ»Ö±ÊÇÀ§ÈÅ×ÅÒµ½çµÄÄѵãÓëÍ´µã£ºÈçºÎÄܹ»¸ü¼Ó¾«È·µØ½øÐлùÓÚʼþʱ¼ä´°¿ÚµÄ¼ÆË㣿Watermark
µÄ¸ÅÄîÓ¦Ô˶øÉú¡£Watermark ÊÔͼ½«¸ü¼Ó¾«È·µÄʱ¼ä²Î¿¼ÒýÈëÁ÷ʽ¼ÆË㣬²¢È¡µÃÁËÔ½À´Ô½¶àµÄÁ÷ʽƽ̨µÄÖ§³Ö¡£Pravega
Ò²²»ÀýÍ⣬ÔÚ×î½üµÄ°æ±¾¸üÐÂÖУ¨v0.6£©£¬Pravega ÒѾ¼ÓÈëÁË Watermark µÄÍêÕûÖ§³Ö¡£ÓÉÓÚ
Pravega ÔÉúÖ§³Ö Segment ¼¶±ðµÄÆóÒµ¼¶¶¯Ì¬Ëõ·ÅÌØÐÔ£¬ÔÚ´Ë»ù´¡ÉÏҪʵÏÖ Watermark
²¢·ÇÒ×Ê¡£±¾ÎĽ«°´ÕÕ¡°·¢ÏÖÎÊÌâ-½â¾öÎÊÌ⡱µÄÏßË÷£¬ÑÐò½¥½øµØÌÖÂÛ Watermark »úÖÆÔÚ Pravega
ÖеÄÉè¼ÆºÍʵÏÖ£¬²¢¶Ô±È Flink µÄʵÏÖ¡£±¾ÎÄ×îÔç³ö×Ô Pravega µÄ¹Ù·½²©¿Í¡£
1 ¶¯»ú
Á÷ʽ´¦Àí£¨Stream Processing£©´Ó¹ãÒåÉÏÖ¸µÄÊÇ´ÓÎÞ½çÊý¾ÝÔ´×¢ÈëÊý¾Ý²¢ÔÚ×¢ÈëµÄ¹ý³ÌÖнøÐÐÊý¾Ý´¦ÀíµÄÄÜÁ¦¡£ÕâЩÊý¾Ý¿ÉÒÔÊÇÓû§Éú³ÉµÄÊý¾Ý£¬ÀýÈçÉç½»ÍøÂç»òÆäËüÔÚÏßÓ¦Óã»Ò²¿ÉÒÔÊÇ»úÆ÷Éú³ÉµÄÊý¾Ý£¬ÀýÈçÀ´×ÔÎïÁªÍøºÍ±ßÔµÓ¦ÓõķþÎñÆ÷Ò£²âÊý¾Ý»ò´«¸ÐÆ÷Ñù±¾¡£
µäÐ͵ÄÁ÷ʽÊý¾Ý´¦ÀíÓ¦ÓÃͨ³£°´ÕÕÊý¾Ý²úÉúµÄ˳ÐòÒÀ´Î´¦ÀíÊý¾Ý¡£ÔÚʵ¼ÊÓ¦ÓÃÖУ¬ÓÉÓÚÒÔÏÂÔÒò£¬Ñϸñ°´ÕÕÈ«Ðò´¦ÀíÊý¾Ýͨ³£ÊÇÎÞ·¨ÊµÏֵģº
Êý¾ÝÔ´±¾Éí¾Í²»ÊÇÒ»¸öµ¥Ò»µÄÔªËØ£¬Ëü¿ÉÄÜÓɶà¸öÓû§£¬·þÎñÆ÷»òÕßÍø¹Ø×é³É£»
Ó¦ÓõÄÄÚÔÚÉè¼ÆÒ²¿ÉÄܵ¼Ö²»Í¬Êý¾ÝÏîÄ¿±»ÂÒÐò×¢ÈëºÍ´¦Àí¡£
Òò´Ë£¬ÔÚ Pravega ºÍÆäËüÀàËÆÏµÍ³ÖУ¬Ë³Ðò¶¼Ö¸µÄÊÇÊý¾Ý×¢ÈëµÄ˳Ðò£¬²¢ÇÒÓÉ¡°¼ü¡±È·¶¨¡£¡°¼ü¡±ÕâÒ»¸ÅÄîÁ¬½áÁËÊý¾ÝÁ÷Öеĸ÷¸öÔªËØ¡£
°´Éú³É˳Ðò´¦ÀíÊý¾ÝÊÇÁ÷ʽ´¦Àí×îÓÐÒâ˼µÄÒ»Ãæ£¬ÒòΪÕâʹµÃÓ¦ÓóÌÐò¿ÉÒÔÔÚ²»Í¬Ê¼þÖн¨Á¢ÆðÒ»ÖÖÁÙʱµÄÏà¹Ø¹ØÏµ£¬¾¡¹ÜÕâÖÖ¹ØÏµ±È½ÏËÉÉ¢¡£ÀýÈ磬ij¸öÓ¦ÓóÌÐòÄܹ»Éæ¼°ÕâÑùµÄÌáÎÊ£ºÔÚ¹ýÈ¥µÄһСʱÖÐÓжàÉÙ²»Í¬µÄÓû§µÇ¼ÁË£¬»òÕßÔÚ¹ýÈ¥
µÄÊ®·ÖÖÓÄÚÓжàÉÙ´«¸ÐÆ÷±¨¸æÁËÒì³£¶ÁÊý¡£ÎªÁËʵÏÖ²¢»Ø´ðÕâЩ²éѯ£¬Ó¦ÓóÌÐò±ØÐëÄܹ»ÎªÃ¿Ò»¸ö±¨¸æÖÜÆÚÉú³ÉÏàÓ¦µÄ½á¹û£¨µÚÒ»¸öÀý×ӵı¨¸æÖÜÆÚÊÇһСʱ£¬¶øµÚ¶þ¸öÀý×ӵı¨¸æÖÜÆÚÊÇÊ®·ÖÖÓ£©¡£ÕâЩ±¨¸æÖÜÆÚͨ³£±»³Æ×÷ʱ¼ä´°¿Ú£¨Time
Window£©¡£
ÔÚÊý¾ÝÉú³Éʱ¾Í½øÐÐÊý¾Ý´¦ÀíʹµÃÓ¦ÓóÌÐò¿ÉÒÔÔÚÊý¾ÝÉú³ÉµÄͬʱ¾ÍÊä³ö½á¹û¡£¶ÔÓÚÓнçÊý¾Ý¼¯£¨²»»áÐÂÔöÊý¾Ý£©£¬¿ÉÒÔͨ¹ýʹÓÃ
map-reduce ¶ÔËùÓд°¿Ú²¢ÐеؽøÐд°¿Ú¾ÛºÏ¡£¶øÕâ¶ÔÎÞ½çÊý¾Ý¼¯£¨Á÷£©È´²¢²»¿ÉÐУ¬ÒòΪÊý¾ÝÒ»Ö±ÔÚ¶¯Ì¬³ÖÐøÔö³¤¡£Òò´Ë£¬¶ÔÓÚ³ÖÐøÉú³ÉµÄÊý¾ÝÔ´£¬¿ÉÒÔÑ¡ÔñÓÃ
map-reduce µÄ·½Ê½ÖÜÆÚÐԵش¦ÀíÊý¾Ý¼¯¿ìÕÕ»òÔöÁ¿£¨Õ⽫ÒýÈë¸ü³¤µÄ´¦Àíʱ¼ä£©£¬Ò²¿ÉÒÔÓÃÁ÷µÄ·½Ê½ÔÚÊý¾Ý×¢ÈëµÄͬʱ¾Í½øÐд¦Àí¡£Ïà¶ÔÓÚÖÜÆÚÐԵش¦Àí£¬ºóÕß¿ÉÒÔÌṩ¸üµÍµÄ¶Ëµ½¶ËʱÑÓ¡£
ΪÁ˽øÐÐÖîÈç´°¿Ú¾ÛºÏÖ®ÀàµÄ¼ÆË㣬Ê×ÏȱØÐëÓµÓÐijÖÖʱ¼ä²Î¿¼£¬²¢ÇÒʹµÃÿ¸öÊý¾ÝÔªËØ£¨ÀýÈ磺ÏûÏ¢£¬Ê¼þ£¬¼Ç¼µÈ£©¶¼ÓëÒ»¸öʱ¼äÖµÏà¹ØÁª¡£Èç¹ûûÓÐÒ»¸öʱ¼ä²Î¿¼£¬Ó¦ÓóÌÐò¾ÍÎÞ·¨È·¶¨Ò»¸öÊý¾ÝÔªËØ¾¿¾¹ÊôÓÚÄĸöʱ¼ä´°¿Ú¡£µäÐ͵ÄÓÃÓÚÌÖÂÛʱ¼ä²Î¿¼µÄʱÓò°üÀ¨Ê¼þʱ¼ä£¨Event
Time£©ºÍ´¦Àíʱ¼ä£¨Processing Time£©¡£Ê¼þʱ¼äÖ¸µÄÊÇÊý¾ÝÔ´¸³ÓèʼþµÄʱ¼ä£¬Í¨³£ÓõÄÊÇʼþÉú³ÉʱµÄ¹ÒÖÓʱ¼ä¡£´¦Àíʱ¼äÓõÄÊÇʼþ±»½øÐÐÊý¾Ý´¦ÀíʱµÄʱ¼ä×÷²Î¿¼¡£Ä³¸öʼþËù¹ØÁªµÄʱ¼äҪôÊÇÔÚÓ¦ÓóÌÐò´Ó
Pravega ¶ÁÈ¡Êý¾ÝµÄʱºò±»È·¶¨£¬ÒªÃ´ÊÇÔÚʼþ±»´¦ÀíµÄʱºòÈ·¶¨¡£´ËÍ⣬ÎÒÃÇ»¹¿¼ÂÇ×¢Èëʱ¼ä£¨Ingestion
Time£©£¬¼´½øÐÐ×¢ÈëµÄÓ¦ÓóÌÐòÊÕµ½Ê¼þµÄʼþ¡£ÀýÈ磬ÔÚij¸öÀûÓà Pravega ½øÐÐÁ÷ʽÊý¾Ý´æ´¢µÄÓ¦ÓóÌÐòÖУ¬×¢Èëʱ¼ä¾ÍÊÇʼþ±»Ð´Èë
Pravega Stream µÄʱ¼ä¡£Í¼ 1 չʾÁËÉÏÊöÈý¸öʱÓò¡£

ͼ 1 Pravega ÖеÄʱ¼ä
ÓÉÓÚÕâÈýÖÖʱÓò¸÷×Ô½«Ê¼þÉúÃüÖÜÆÚÖеIJ»Í¬Ê±¼äµãÓëÒ»¸öʼþÏà¹ØÁª£¬ËüÃDZØÈ»´æÔÚ²îÒì¡£µ±Êý¾ÝÔ´ÔÚʼþÉú³ÉµÄͬʱ¾ÍÁ¢¿Ì½øÐз¢ËÍʱ£¬Ê¼þʱ¼äºÍ×¢Èëʱ¼äÖ®¼äµÄ²îÒìͨ³£½ÏС¡£µ«ÊÇÓÉÓÚÍøÂçÁ¬½ÓÔÒò£¬Ò²¿ÉÄܳöÏÖһЩ¾ßÓÐÏÔÖøÆ«²îµÄÀëȺµã¡£×¢Èëʱ¼äºÍ´¦Àíʱ¼äÖ®¼äµÄ²îÒìÈ¡¾öÓÚ×¢Èë¹ý³ÌºÍ´¦Àí¹ý³ÌµÄʵ¼Ê·¢Éúʱ¼ä¡£ÊÂʵÉÏ£¬¶ÔÓÚ
Pravega À´Ëµ£¬ÕâÒ»²îÖµ¿ÉÄÜ»áÏ൱´ó£¬ÒòΪ Pravega ÊÇÒ»¸ö´æ´¢ÏµÍ³£¬Êý¾ÝÔÚ±»×¢ÈëÖ®ºó¿ÉÄÜÔÚÈÎÒâʱ¼äÖ®ºó²Å±»Ó¦ÓóÌÐò´¦Àí¡£ÔÚ
Pravega ÖУ¬ÎÒÃǽ«ÕâÖÖÔÚÈÎÒⳤʱ¼ä֮ǰ¾ÍÒѾעÈëµÄÀÏÊý¾Ý³ÆÎªÀúÊ·Êý¾Ý£¨Historical
Data£©¡£
Äܹ»Ê¹ÓÃÎÒÃÇÉÏÊöÌÖÂÛ¹ýµÄʱÓòÖ®Ò»½«Ò»¸öʱ¼äÖµ¹ØÁªµ½Ò»¸öʼþÉÏ»¹Ô¶Ô¶²»¹»¡£Ó¦ÓóÌÐòµÄÈ·¿ÉÒÔ´ÓÒ»¸öʱ¼ä´ÁÍÆ¶Ï³öij¸öʼþÊôÓÚÄĸöʱ¼ä´°¿Ú£¬µ«ËüÈçºÎÄÜÖªµÀËüÒѾÊÕµ½ÁËij¸öʱ¼ä´°¿ÚÄÚµÄËùÓÐʼþ²¢ÇÒ¿ÉÒԹرյ±Ç°´°¿ÚÁËÄØ£¿ÔÚ´¦Àíʱ¼äÊÇÁ¬ÐøµÝÔöµÄ¼ÙÉèÏ£¬¹Ø±ÕÒ»¸ö»ùÓÚ´¦Àíʱ¼äµÄ´°¿Ú·Ç³£¼òµ¥£¬µ«¶ÔÓÚʼþʱ¼äºÍ×¢Èëʱ¼ä¾ÍÍêÈ«²»Í¬ÁË¡£¶ÔÓÚʼþºÍ´¦Àíʱ¼ä£¬½øÐÐÊý¾Ý´¦ÀíµÄÓ¦ÓóÌÐòÐèÒªÖªµÀËüºÎʱ£¨¼´±ãÖ»ÊǹÀ¼Æ£©Äܹ»¹Ø±ÕÒ»¸ö¸ø¶¨µÄ´°¿Ú²¢±¨¸æ¼ÆËã½á¹û¡£µ±È»£¬Ó¦ÓóÌÐòÒ²¿ÉÒÔÑ¡ÔñÓÀÔ¶²»¹Ø±Õʱ¼ä´°¿Ú²¢ÇÒ³ÖÐøÖØ¸´´¦Àí´°¿ÚÄÚÊý¾Ý¡£µ«ÊÇ£¬ÔÚij¸öʱ¼äµã£¬Ó¦ÓóÌÐò×ÜÊÇÐèÒªµ÷ÓúÍʹÓÃ×îÖյļÆËã½á¹û£¬È»ºóÏòÇ°ÍÆ½ø£¬ÕâÒѾµÈ¼ÛÓڹرյ±Ç°Ê±¼ä´°¿ÚÁË¡£
ΪÁËÈÃÓ¦ÓóÌÐòÄܹ»¶Ôʱ¼ä´°¿Ú½áÊø½øÐжÏÑÔ£¬ÎÒÃÇÐèÒªÖªµÀʼþ¹ØÁªÊ±¼äµÄϽ磬¶øÕâЩϽç¾Í±»³Æ×÷ Watermark¡£Watermark
w ±£Ö¤ËùÓÐʱ¼ä´ÁСÓÚ w µÄʼþ¶¼ÒѾ±»¶ÁÈ¡»òÕß´¦ÀíÁË£¨¾¿¾¹ÊǶÁÈ¡»¹ÊÇ´¦ÀíµÄÓïÒåÔòÒªÒÀÀµÉÏÏÂÎÄÈ·¶¨£©¡£È»¶ø£¬³Ùµ½µÄʼþ£¨Late
Event£©×ÜÊÇÓм¸ÂÊ·¢Éú¡£ÈçºÎ´¦ÀíºÍ×îС»¯³Ùµ½Ê¼þÔòÒÀÀµ¾ßÌåµÄÓ¦ÓóÌÐòʵÏÖ¡£Í¼ 2 չʾÁË Watermark
µÄ¸ÅÄî¡£

ͼ 2 ʱ¼äºÍ Watermark
ΪÁ˼ÆËã»ùÓÚʱ¼ä´°¿ÚµÄ¾ÛºÏ£¬ÎÒÃÇÐèÒªÄܹ»½«Ê¼þÓ³Éäµ½´°¿Ú²¢ÇÒÖªÏþºÎʱÄܹ»¹Ø±Õ´°¿Ú£¨¼ÆË㵱ǰ´°¿ÚÄڵľۺϣ©¡£¼´±ãÎÒÃǼÙÉèÖ»Óе¥Ò»µÄʼþÐòÁУ¬Ë³Ðò¸³ÖµµÄ·½·¨Ò²ÊÇÐв»Í¨µÄ£¬ÒòΪʼþ¿ÉÒÔÂÒÐò³öÏÖ¡£Í¼ÖУ¬Ê¼þ
7 ºÍʼþ 8 ¾Í³öÏÖÁËÕâÖÖÂÒÐò¡£Òò´Ë£¬¶ÔÓÚÿһ¸öʼþÎÒÃǶ¼ÐèÒªÒ»¸öʱ¼ä²Î¿¼£¬ÒÔ±ãÈ·¶¨½«Ëü·ÖÅäµ½Äĸöʱ¼ä´°¿Ú¡£ÎÒÃÇ»¹ÐèÒªÖªµÀºÎʱÄܹ»¹Ø±ÕÒ»¸öʱ¼ä´°¿Ú£¬¶ø
Watermark ÕýÊÇÕâÑùÒ»ÖÖ³éÏó£ºÍ¨¹ýÌṩʱ¼äϽçÔÊÐí´°¿ÚÕýÈ·¹Ø±Õ¡£ÏÖʵÖУ¬ÒªÌṩÑϸñµÄ Watermark
±£Ö¤ÊǼ«ÆäÀ§Äѵġ£·Ö²¼Ê½ÏµÍ³µÄÒì²½±¾ÖÊʹµÃΪ³Ùµ½Ê¼þÌṩǿ±£Ö¤±äµÃ·Ç³£¸´ÔÓ¡£ÁíÍ⣬´Ó½ø¶ÈËù¹Ø×¢µÄ½Ç¶È¿´£¬Ìáǰ¹Ø±Õʱ¼ä´°¿Ú²¢ÔÊÐíһС²¿·Ö³Ùµ½Ê¼þÍùÍùÊÇÒ»ÖֽϺõÄÑ¡Ôñ¡£ÕâÖÖÑ¡Ôñͨ³£ÊÇÒÀÀµ¾ßÌåÓ¦ÓóÌÐòµÄ¡£
ÔÚÕâÆªÎÄÕÂÖУ¬ÎÒÃǽ«»áÌÖÂÛ Pravega ÐÂÔöµÄ¶Ôʼþʱ¼äºÍ×¢Èëʱ¼äµÄÖ§³Ö¡£ÎÒÃDZØÐë¿Ë·þµÄ¹Ø¼üÄѵãÖ®Ò»¾ÍÊÇÈçºÎÔÚÁ÷ʽÊý¾ÝµÄ
Segment ¼¯ºÏ»áÒò×Ô¶¯Ëõ·Å»úÖÆ¶ø¶¯Ì¬±ä»¯µÄÇé¿öÏÂÌṩ Watermark µÄÖ§³Ö¡£ÎÒÃÇ¶Ô Pravega
µÄ Reader Group ¼ÓÈëÁËÄÚ²¿Ö§³Ö£¬ÒÔ±ã¼ò»¯ÓëÁ÷ʽ´¦ÀíÆ÷µÄ¹ØÁª£¬ÀýÈç Apache Flink¡£ÎÒÃÇÓÃ
Apache Flink ×÷Ϊ»ùÓÚ Watermark µÄÁ÷ʽ´¦ÀíÆ÷µÄÒ»¸öµäÐÍÀý×Ó£¬ÌÖÂÛ Flink
¶Ô Watermark µÄÖ§³ÖÒÔ¼°Óë Pravega µÄ Flink Á¬½ÓÆ÷£¨Connector£©µÄ¼¯³ÉÎÊÌâ¡£ÎÒÃÇ»¹»á¶ÔÈçºÎÓëÈÎÒâÓ¦ÓóÌÐò¼¯³É½øÐÐ×ܽᣬ²¢¸ù¾ÝÎÒÃǶԸÃÌØÐÔÏÖÓеľÑ鏸³ö½¨Òé¡£
2 ʾÀý£ºApache Flink
Apache Flink ÊÇÒ»¸öΪÁ÷ʽºÍÅúʽÊý¾Ý¶øÉè¼ÆµÄ¿ªÔ´Æ½Ì¨£¬¶øÎÒÃDZàдÁËÒ»¸öÁ¬½ÓÆ÷ÔÊÐíÓ¦ÓóÌÐò¿ÉÒÔʹÓÃ
Flink ´¦Àí Pravega µÄÁ÷ʽÊý¾Ý¡£Flink ÓÉÒ»¸öÔÊÐíÓ¦ÓóÌÐò±àд×÷Òµ£¨Job£©µÄ±à³ÌÄ£ÐͺÍÒ»¸öÖ´ÐÐ
Flink ³ÌÐòµÄ·Ö²¼Ê½ÔËÐÐʱ»·¾³¹¹³É¡£ÔÚÔËÐÐʱ£¬Flink »·¾³°ÑÒ»¸ö³ÌÐòÓ³Éä³ÉÒ»¸öÊý¾ÝÁ÷£¬¶øÕâ¸öÊý¾ÝÁ÷ÓÉÒ»¸ö»ò¶à¸öÔ´£¨Source£©£¬Ò»ÏµÁб任Ëã×Ó£¨Operator£©ÒÔ¼°Ò»¸ö»ò¶à¸ö»ã£¨Sink£©×é³É¡£ÔÚ±¾ÎĹØÓÚ
Watermark µÄÌÖÂÛÖУ¬Ô´ÊÇ×îÓÐÒâ˼µÄÔªËØ£¬ÒòΪÕýÊÇÓÉËüÀûÓà Pravega µÄʱ¼äÐÅÏ¢²úÉú
Watermark¡£
Watermark ÊÇ Apache Flink ÖеĺËÐĸÅÄî¡£ËüÔÊÐíһϵÁлùÓÚʱ¼äµÄ¼ÆË㣬ÀýÈ粻ͬʱÓòϵÄʱ¼ä´°¿Ú£ºÊ¼þʱ¼ä£¬×¢Èëʱ¼äºÍ´¦Àíʱ¼ä¡£ÔÚ
Flink ÖУ¬ËüÃDZ»³Æ×÷ʱ¼äÌØÕ÷£¨Time Characteristics£©¡£Ê¼þʱ¼äºÍ×¢Èëʱ¼äÔÚ
Flink ÖÐÓÐ×Ų»Í¬µÄ¶¨Òå¡£ÔÚ Flink ÖУ¬×¢Èëʱ¼ä´ú±íʼþ½øÈë Flink Êý¾ÝÁ÷ʱµÄʱ¼ä£¬¶ø²»ÊÇָʼþ±»×¢ÈëÊý¾Ý¹ÜµÀ£¨ÀýÈçдÈë
Pravega£©µÄʱ¼ä¡£Ê¼þʱ¼ä´ú±íÓ¦ÓóÌÐò¸³ÓèµÄʱ¼äÖµ£¬Ëüº¸ÇÁËÓÉÓ¦ÓóÌÐòÈ·¶¨µÄÈÎÒâÐÎʽµÄʱ¼äºÍ
Watermark£¬°üÀ¨ÔÚÔ´¶Ë½øÐеĻùÓÚ Pravega ´«²¥µÄʱ¼äÐÅÏ¢µÄ¸³Öµ¡£Òò´Ë£¬Ê¼þʱ¼äÊÇ Flink
µÄʱ¼äÌØÕ÷£¬°üº¬ÁË Pravega ËùÌṩµÄʼþʱ¼äºÍ×¢Èëʱ¼ä¡£Í¼ 3 չʾÁËÕâЩ²»Í¬µÄʱ¼äÌØÕ÷ÒÔ¼°Óë
Pravega µÄÇø±ð¡£

ͼ 3 Flink ºÍ Pravega ÖеÄʱ¼ä
ΪÁËÈ·¶¨ÔÚÒ»¸ö×÷Òµ¾¿¾¹Ê¹ÓúÎÖÖʱ¼äÌØÕ÷£¬Flink ÐèÒª³ÌÐòÔÚÖ´Ðл·¾³ÖÐÉèÖãº
final StreamExecutionEnvironment
env = StreamExecutionEnvironment .getExecutionEnvironment();
env.setStreamTimeCharacteristic (TimeCharacteristic.EventTime);
|
µ±ÔÚ Flink ÖÐʹÓÃʼþʱ¼äʱ£¬±ØÐë¶Ôʼþ½øÐÐʱ¼ä´Á¸³Öµ£¬²¢ÇÒϵͳÐèÒª Watermark ×÷Ϊʼþʱ¼äµÄ½ø¶ÈÖ¸±êÁ¿¡£ÕâÓÐÁ½ÖÖʵÏÖ·½·¨£ºÍ¨¹ýÔ´Ö±½Ó½øÐлòÕßͨ¹ýʱ¼ä´Á¸³ÖµÆ÷£¨Í¬Ê±¸ºÔð²úÉú
Watermark£©¡£Ê±¼ä´Á¸³ÖµÆ÷ÊÇ×÷Òµ¹æ¸ñ£¨Job Specification£©µÄÒ»²¿·Ö£¬Ëü±ØÐëÔÚµÚÒ»¸öʹÓÃʱ¼äµÄ²Ù×÷·¢Éú֮ǰ±»Ö¸Ã÷£¨Í¨³£ÔÚÔ´Ö®ºó£©¡£Ê±¼ä´Á¸³ÖµÆ÷½«¸²Ð´Ô´Ö±½ÓÉú³ÉµÄʱ¼ä´ÁºÍ
Watermark¡£
Óë Pravega ×îÏà¹ØµÄÑ¡Ïî¾ÍÊÇÈÃÔ´¸³ÖµÊ±¼ä´Á²¢ÇÒ²úÉú Watermark¡£µ±Ê¹ÓÃÕâһѡÏîʱ£¬ÎÒÃÇ¿ÉÒÔʹÓñ¾ÎÄËùÃèÊöµÄ·½·¨£¬ÔÚ
Pravega Á¬½ÓÆ÷ÖмÓÈëʱ¼ä´Á¸³ÖµºÍ Watermark Éú³ÉµÄÖ§³Ö¡£Ö§³Öʼþʱ¼äµÄ Flink
Ô´ÐèÒªµ÷ÓÃÈçÏ·½·¨£º
SourceContext#collectWithTimestamp(T element, long
timestamp): ´ÓÔ´ÖвúÉúÒ»¸öʼþ£¬²¢¸³ÖµÊ±¼ä´Á¡£
SourceContext#emitWatermark(Watermark mark): ²úÉú Watermark¡£
ÔÚ½ÓÏÂÀ´Á½¸öС½Ú£¬ÎÒÃǽ«¸ø³öÎÒÃǵÄÉè¼Æ£¬ÔÚ Pravega ÖÐÖ§³Ö Watermark¡£ÔÚÎÒÃÇÌÖÂÛÍêÉè¼ÆÓëʵÏÖÖ®ºó£¬ÎÒÃǽ«»ØÍ·Õ¹Ê¾¸ü¶àÓëÁ¬½ÓÆ÷¼¯³ÉµÄϸ½Ú¡£
3 Äѵã
¼ÙÉèÏÖÔÚÎÒÃÇÓÐÒ»¸ö¼òµ¥µÄÓ¦ÓóÌÐòºÍÒ»×é²úÉúʼþµÄ´«¸ÐÆ÷£¬Ò»¸ö Pravega Á÷£¬ÒÔ¼°Ò»¸ö Flink
×÷Òµ¡£¾ÍĿǰµÄÌÖÂÛ¶øÑÔ£¬¾¿¾¹Õâ¸ö×÷ÒµÔÚ½øÐÐÔõÑùµÄ²Ù×÷²¢²»ÖØÒª£¬µ«ÎÒÃǼÙÉèËüÕý»ùÓÚ Pravega µÄÁ÷½øÐÐijÖÖÐÎʽµÄʱ¼ä´°¿Ú¾ÛºÏ£¬²¢ÇÒËüÐèÒªÖªµÀʱ¼ä´°¿ÚµÄ±ß½ç¡£
Èç¹û´«¸ÐÆ÷±¾ÉíÄܹ»½øÐÐʱ¼ä´Á¸³Öµ£¬ÕâÑùдÈë Pravega µÄʼþ¶¼¸½¼Ó×Åʱ¼ä´ÁÐÅÏ¢£¬ÄÇô Flink
µÄ×÷ÒµÔ´¾Í¿ÉÒÔÌáÈ¡ÕâЩʱ¼ä´Á²¢¾ßÓÐijÖÖʱ¼ä½ø¶ÈµÄ¸ÅÄî¡£¾¡¹ÜÕâÊÇÒ»¸öºÏ·¨µÄ·½·¨£¬µ«Õâô×öÓÐÁ½¸öÑÏÖØµÄȱµã£º
¶ÔÓÚÒ»¸ö¸ø¶¨µÄʱ¼ä´Á£¬ÎÒÃDz¢²»ÖªµÀÊÇ·ñ»¹ÓÐÒ»¸ö¾ßÓÐÏàͬʱ¼ä´ÁµÄʼþ£¬Òò´ËÎÒÃÇÎÞ·¨Íƽø Watermark¡£
Èç¹û Flink ԴûÓÐÊÕµ½Ê¼þ£¬Ëü¾Í²»ÖªµÀ¾¿¾¹ÊÇʼþʱ¼äÈÔÔÚÏòÇ°ÍÆ½ø¶ø½ö½öÖ»ÊÇûÓÐÐÂʼþ²úÉú£¬»¹ÊÇϵͳÕýÔÚ¾ÀúÒì²½¹ý³Ì£¨ÀýÈçʼþ±»ÈÎÒâÑÓ³Ù£©¡£
ͨ³£ËµÀ´£¬³Ùµ½Ê¼þ²»¿ÉÄÜÍêÈ«±ÜÃ⣬ÒòΪÓÐÌ«¶àÇé¿ö¿ÉÄܵ¼Ö³ٵ½Ê¼þ£¬ÀýÈçÁ¬½Ó»òÕ߽ڵ㲻¿ÉÓᣵ«ÊÇ£¬Ô´ºÍÓ¦ÓóÌÐòÒ»°ã¶¼ÓÐʼþʱ¼äµÄÏà¹ØÐÅÏ¢£¨ÀýÈç×ÔÉíµÄʱÖÓ£©£¬²¢ÇÒÔÚÀíÏëÇé¿öÏÂÎÒÃÇÓ¦µ±´«²¥ÕâЩÐÅÏ¢ÒÔ±ã
Flink Ô´¿ÉÒÔ¸ü¼Ó¾«È·µØÍƽøÊ¼þʱ¼ä¡£
ÏÖÔÚÎÒÃÇ¿´Ò»ÏÂÈçºÎÓà Pravega ʵÏÖÕâЩ¡£¼ÙÉèÎÒÃÇÖÜÆÚÐÔµØÏò Pravega Á÷µÄ×Ö½ÚÐòÁÐÀïдÈë±ê¼ÇÀ´±íÕ÷ʱ¼ä½ø¶È¡£ÕâЩ±ê¼ÇÖ¸Ã÷ËùÓÐʼþʱ¼äÔçÓÚÕâ¸ö±ê¼ÇµÄËùÓÐʼþ¶¼ÒѾдÈëÁË¡£Õâô×ö»á´øÀ´Èý¸öÎÊÌ⣺
¾ßÓжà¸ö Writer µÄ Pravega Á÷ÐèҪе÷±ê¼ÇµÄдÈ룬±£Ö¤ËüÃÇ·´Ó³³öËùÓÐ Writer
µÄ״̬¡£
Pravega Á÷ͨ³£¶¼²»ÊÇÒ»¸ö¼òµ¥µÄ×Ö½ÚÐòÁУ¬ËüÒ»°ãÓɶà¸ö²¢ÐÐµÄ Segment ¹¹³É¡£
Segment µÄÄÚ²¿ÊµÏÖÊÇÒ»×é×Ö½ÚÐòÁУ¬Òò´Ë½«±ê¼ÇÕâÖÖ¿ØÖÆÊý¾ÝÓëÓ¦ÓóÌÐòÊý¾Ý»ìºÏ´æ´¢ÔÚÒ»Æð²¢²»ÊÇÒ»¸öºÃ·½·¨¡£
ΪÁ˽â¾öÎÊÌâ 1£¬ÎÒÃÇÐèҪijÖÖ»úÖÆÀ´²Î¿¼ËùÓÐÒÑÖªµÄ Writer£¬¶øÎÊÌâ 2 ÒªÇó±ê¼ÇÄܹ»·´Ó³¿ç
Segment µÄλÖ᣶ÔÓÚÎÊÌâ 3£¬ÎÒÃÇÐèÒªÔÚÍⲿά»¤±ê¼Ç¡£Í¼ 4 չʾÁËÒ»¸öÍù Pravega
×¢Èëʼþ²¢½øÐд¦ÀíµÄÓ¦ÓóÌÐòµÄʱ¼äÁ÷¡£

ͼ 4 Pravega ÖеÄʱ¼äÁ÷
²Î¿¼ËùÓÐ Writer ²¢²»ÊÇÒ»¼þ¼òµ¥µÄÊ£¬ÒòΪ Writer ¿ÉÒÔÔÚÏßÒ²¿ÉÒÔÀëÏß¡£ÎÒÃÇÑ¡ÔñµÄÈκλúÖÆ¶¼±ØÐ뿼ÂÇ
Writer ¼¯ºÏµÄÕâÖÖ¶¯Ì¬ÐÔ¡£ÔÚÍⲿ±£´æ±ê¼ÇµÄͬʱ»¹ÒªÄܹ»½«ËüÃÇÓ³Éäµ½¿ç Segment µÄλÖã¬ÎÒÃÇÐèҪijÖÖÊý¾Ý½á¹¹À´Î¬»¤ÕâÖÖ
Segment µ½Æ«ÒÆÁ¿µÄÓ³Éä¹ØÏµ£¬²¢ÇÒÎÒÃÇÐèÒªÔÚÁ÷Êý¾ÝÖ®Íâά»¤ÕâЩ±ê¼Ç£¬ÀýÈçÔÚÒ»¸öµ¥¶ÀµÄ Segment
ÖС£
ÏÖÔÚ£¬»¹ÓÐÒ»¸öÎÊÌâÐèÒª½â¾ö£º¿ÕÏÐ Reader¡£Reader Group е÷¶Ô×éÄÚ Reader
µÄ Segment ·ÖÅä¡£¼ÙÉèÒ»¸ö¸ø¶¨µÄ Reader ûÓб»·ÖÅäµ½ Segment¡£ÕâÖÖ³¡¾°ÊÇ¿ÉÄÜ´æÔڵģ¬ÀýÈ磬µ±×éÄÚ
Reader µÄÊýÁ¿´óÓÚ Segment ÊýÁ¿µÄʱºò¡£ÔÚÕâÖÖÇé¿öÏ£¬Ò»¸öûÓб»·ÖÅäµ½ Segment
µÄ Reader ÈçºÎÄܹ»ÖªµÀʼþʱ¼äÔÚÏòÇ°ÍÆ½ø£¿ÎªÁËÈÿÕÏÐ Reader ÔÚûÓб»·ÖÅäµ½ Segment
µÄʱºòÒ²Äܹ»²úÉú Watermark£¬ÎÒÃÇͨ¹ý Reader Group µÄ״̬ͬ²½Æ÷£¨State
Synchronizer£©À´Ðµ÷ʼþʱ¼äµÄÍÆ½ø¡£ÕâÖÖе÷ʹµÃËùÓÐ Reader ¿ÉÒÔ²»ÒÀÀµ Segment
µÄ·ÖÅä¶øÍÆ½øÊ¼þʱ¼ä¡£
µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÃÇÒ»Ö±ÔÚÌÖÂÛʱ¼äȴʼÖÕûÓÐ˵Ã÷ʱ¼ä²Î¿¼¾¿¾¹´ÓºÎ¶øÀ´¡£ÕâÊÇÓÐÒâ¶øÎªÖ®£ºÎÒÃDz»ÏëÏÞÖÆÓ¦ÓóÌÐòʹÓÃÌØ¶¨µÄʱ¼ä²Î¿¼£¬»òÕßÏÞ¶¨ÕâÖÖʱ¼ä²Î¿¼ºÎʱ¿ªÊ¼´æÔÚ¡£ÕâÖÖʱ¼ä²Î¿¼¿ÉÒÔÊǹÒÖÓʱ¼ä£¬·Ç³£½Ó½üÊý¾ÝÉú³ÉʱµÄµ±Ç°Ê±¼ä£¬Ò²¿ÉÒÔÊÇ´ÓÎļþ¶ÁȡʼþʱµÄÈÎÒâ¹ýȥʱ¼äµã¡£ÎÒÃDz»ÏëÊÔͼ¹æ¶¨»òÇ¿ÖÆÈκζÔʱ¼ä¸³ÖµµÄ·½·¨£¬ÓÈÆäÊǶÔÓÚʼþʱ¼ä£¬ÎÒÃÇÏ£ÍûÓ¦ÓóÌÐò¿ÉÒÔ¸ù¾Ý×ÔÉíµÄÉè¼ÆÊ¹ÓÃÈκÎÓÐÒâÒåµÄ·½·¨ÉèÖÃÕâ¸öÖµ¡£
ÔÚ½ÓÏÂÀ´µÄ¼¸¸öС½ÚÖУ¬ÎÒÃÇ»áÏêÊöÎÒÃǵÄÉè¼ÆºÍʵÏÖ¡£Ðí¶àÎÒÃÇÒѾÌÖÂÛ¹ýµÄ³éÏó¸ÅÄî¶¼»áÔÚÓàϵÄÕ½ÚÖоßÏÖ»¯¡£
4 Pravega ¶Ô Watermark µÄÖ§³Ö
Pravega µÄ Watermark »úÖÆÓÉÈý¸öÖ÷Òª²¿·Ö×é³É£¬ÈçÌá°¸ÎĵµËùÊö£º»ñȡʱ¼ä£¬Ê±¼ä´Á¾ÛºÏÒÔ¼°Ê±¼ä´°¿ÚµÄ»ñÈ¡¡£
4.1 »ñȡʱ¼ä
Ê×ÏÈÊÇ EventStreamWriter ÉϵÄÒ»¸ö API£¬ÓÃÓڼǼʱ¼ä¡£ÕâÔÊÐíÒ»¸ö½øÐÐÊý¾ÝдÈëµÄÓ¦ÓóÌÐòÏò
Pravega ±íÃ÷µ±Ç°ÕýÔÚдÈëµÄÊý¾ÝËù¶ÔÓ¦µÄʱ¼ä¡£
EventStreamWriter<EventType>
writer = clientFactory.createEventWriter(stream,
serializer, EventWriterConfig.builder().build());
//... write events ...
writer.noteTime(currentTime); |
ÕâÀ¡°noteTime ¡±API ¿ÉÒÔ±»ÖÜÆÚÐԵص÷Óã¬Ö¸Ã÷ËùÓÐÒѾдÈëµÄʼþ¶¼·¢ÉúÔÚij¸öʱ¼ä֮ǰ¡£
Õâ¸ö API µÄ½á¹¹Ê¹µÃÄÇЩ²»¹ØÐÄ Watermark µÄÓ¦ÓóÌÐò²»±Ø¶îÍâ×öÈκÎÊÂÇé¡£´ËÍ⣬Ëü»¹ÔÊÐíÓ¦ÓóÌÐò¶¨Òå×Ô¼ºµÄʱ¼ä¸ÅÄî¡£
ÀàËÆµØ£¬¶ÔÓÚÊÂÎñÐÔ Writer£¬ÔÚÊÂÎñµÄ commit()·½·¨ÉÏÓÐÒ»¸ö¿ÉÑ¡²ÎÊý£¬ÔÊÐíÓ¦ÓóÌÐòÖ¸Ã÷µ±Ç°ÊÂÎñËùдÈëʼþµÄʱ¼ä¡£
Transaction<EventType>
txn = writer.beginTxn();
//... write events to transaction.
txn.commit(txnTimestamp); |
noteTime()·½·¨ºÍ commit()·½·¨¶¼½ÓÊÜÒ»¸öʱ¼ä´Á²ÎÊý£¬¶ø²¢·ÇÖ±½Ó²éѯϵͳʱÖÓ¡£ÕâÔÊÐíÓÃʼþʱ¼äµÄ·½Ê½¶¨Òåʱ¼ä¡£
Èç¹ûÕýÔÚ½øÐÐʼþдÈëµÄ½ø³Ì²¢²»ÊÇʼþµÄÕæÕýÉú²úÕߣ¬ÀýÈçʼþÀ´×Ô Web ǰ¶Ë£¬Òƶ¯ App£¬»òÕßǶÈëʽϵͳ£¬ÄÇôʼþµÄ·¢ÉúÓëдÈëÖ®¼äÒ»¶¨´æÔÚʱ¼ä²î¡£ÕâͬÑùÊÊÓÃÓÚʼþ±¾Éí¾ÍÊÇ´Óij¸öÉÏÓÎÔ´Í·µ¼³öµÄ³¡¾°¡£ÀýÈ磬´Óij¸öÁ÷¶ÁÈ¡Êý¾Ý£¬ÓÃijÖÖ·½Ê½½øÐÐÊý¾Ý´¦Àí£¨±ÈÈç¾ÛºÏ£©£¬È»ºóÔÙ½«ÆäдÈëÁíÒ»¸öÁ÷£¬ÕâÊǷdz£³£¼ûµÄÓ¦Óá£
Èç¹ûÄãµÄÓ¦ÓóÌÐò²»ÐèÒª¶¨Òåʱ¼ä£¬ÄÇô¿ÉÒÔÖ±½ÓʹÓÃ×¢Èëʱ¼ä£ºÓÐÒ»¸öÃûΪ automaticallyNoteTime
ÅäÖòÎÊý¿ÉÒÔÌṩÕâÒ»ÐÐΪ¡£Äã¿ÉÒÔÕâÑùÅäÖãº
EventStreamWriter<EventType>
writer = clientFactory.createEventWriter (stream,
serializer, EventWriterConfig.builder( ).automaticallyNoteTime
(true).build());
|
µ±ÕâһѡÏÆôʱ£¬¾ÍÎÞÐèÔÙµ÷Óà noteTime()·½·¨ÁË¡£
Ò»µ©»ñÈ¡ÁËʱ¼ä£¬Á÷ÉϵÄËùÓÐ Writer ¶¼±ØÐëÐγÉÒ»¸öͳһµÄÊÓͼ¡£ÎªÁ˽øÐÐÕâÖ־ۺϣ¬¿Í»§¶ËÔÚÄÚ²¿»á½«Ê±¼äÖµÓë
Writer µÄµ±Ç°Î»ÖýøÐÐ×éºÏ£¬²¢½«ÐÅÏ¢·¢Ë͸ø¿ØÖÆÆ÷£¨Controller£©¡£
4.2 ´Ó¶à¸ö Writer ½øÐÐʱ¼ä´Á¾ÛºÏ
¿ØÖÆÆ÷´ÓËùÓÐµÄ Writer ½ÓÊÕÕâЩʱ¼ä´ÁÓëλÖÃÐÅÏ¢¡£¿ØÖÆÆ÷ÕâÑù×öÐÅÏ¢¾ÛºÏ£ºËü´ÓÒ»¸öÁ÷ÉϵÄËùÓÐ Writer
ÊÕ¼¯Ê±¼ä´Á²¢Êä³öÒ»¸ö Stream Cut£¬Õâ¸ö Stream Cut ´óÓÚµÈÓÚËùÓÐ Writer
µ±Ç°Î»ÖõÄ×î´óÖµ£¬Í¬Ê±»¹Êä³öËùÓÐ Writer ±¨¸æÊ±¼äµÄ×îСֵ×÷Ϊʱ¼ä´Á¡£ÈçÏ£º
ͼ 5 ¾ÛºÏ Writer µÄʱ¼ä´Á
ͨ¹ýÕâÑùµÄ·½Ê½¾ÛºÏʱ¼ä´Á£¬µ±Ò»¸ö Reader µÄµ±Ç°Î»Öó¬¹ýÒ»¸ö¸ø¶¨ Stream Cut µÄʱºò¾ÍÒ»¶¨Äܱ£Ö¤ÒѾ¶ÁÈ¡ÁËËùÓжÔÓ¦µÄʼþ¡£
µ±È»£¬Writer ¿ÉÒÔÔÚÏßÒ²¿ÉÒÔÀëÏß¡£ºÜ×ÔÈ»µÄ£¬Èç¹ûÒ»¸ö Writer ¹Ø±Õ²¢ÇÒ²»ÔÙÉÏÏߣ¬ÎÒÃDz»Ï£ÍûÒ»Ö±³ÖÓÐËüµÄµÝÔöʱ¼äÐÅÏ¢¡£ÎªÁËÅųýÕâÖÖÇé¿ö£¬Á÷ÉÏÓÐÒ»¸öÃûΪ
timestampAggregationTimeout µÄÅäÖòÎÊý¡£ÕâÒ»ÅäÖÃÏîÖ¸Ã÷µ±³¬¹ý¶à³¤Ê±¼äûÓÐÊÕµ½Ò»¸ö
Writer µÄÐÅÏ¢ºó£¬¾Í°ÑËüÅųýÔÚʱ¼ä´°¿Ú¼ÆËãÖ®Íâ¡£
ΪÁËÈà Reader ¿ÉÒÔ¶ÁÈ¡ÕâЩ¾ÛºÏºóµÄÐÅÏ¢£¬¿ØÖÆÆ÷½«¾ÛºÏºóµÄʱ¼äºÍ Stream Cut ÐÅϢдÈëÒ»¸öÌØÊâµÄ
Segment¡£Õâ¸ö Segment ÔÚ Pravega ÄÚ²¿±»³ÆÎª Mark Segment¡£Reader
¿ÉÒÔ´ÓÕâ¸öÌØÊâµÄ Segment ¶ÁÈ¡ÏàÓ¦µÄÐÅÏ¢À´È·¶¨ËüÃÇÔÚÁ÷ÖеÄλÖá£
4.3 Reader »ñȡʱ¼ä´°¿Ú
×îÖÕ£¬ËùÓÐµÄ Reader е÷ËüÃǸ÷×ÔµÄλÖÃÐÅÏ¢£¬µÃµ½Ò»¸ö Stream Cut ÐÎʽµÄ×éºÏλÖÃÐÅÏ¢¡£ÕâÓÐÒ»µãÄÑÀí½â£¬ÒòΪΪÁËÖªµÀ
Reader Ïà¶ÔÓÚ Mark Segment ÖÐËù¼Ç¼µÄ Stream Cut µÄλÖã¬Reader
±ØÐëÊ×ÏÈÉú³ÉÒ»¸ö¾ÛºÏºóµÄ Stream Cut¡£ÕâÐèÒª Reader Group ÖÐËùÓÐ Reader
¹²Í¬Ð×÷¡£ÎÒÃÇÊÇÕâÑùʵÏֵģºÈÃÿһ¸ö Reader ¶¼°ÑËüÃǵÄλÖÃÐÅÏ¢¼Ç¼ÔÚÒ»¸ö״̬ͬ²½Æ÷ÖС£
Ò»µ©»ñÈ¡ÁËÒ»¸öλÖÃÐÅÏ¢£¬½ÓÏÂÀ´¾ÍÐèÒª¶ÔËü½øÐбȽϡ£ÊÂʵÉÏ£¬±È½ÏµÄ½á¹û²¢²»ÊÇÒ»¸öµ¥Ò»µÄÊýÖµ¡£ÀýÈ磬¿¼ÂÇÈçÏÂ
Stream Cut ÉϵÄÒ»¸ö Reader Group£º
ͼ 6 Ò»¸öʱ¼äÉÏϽç·Ö±ðΪ T5 ºÍ T2 µÄ Stream Cut
ÔÚÕâ¸öÀý×ÓÖУ¬Reader Group ²¿·Ö³¬Ô½Ä³¸öʱ¼äÖµ£¬µ«ÓÖ²¿·ÖÂäºóÓÚËü¡£Èç¹ûÄã´Ó Watermark
µÄÉè¼Æ³õÖÔ¿¼ÂÇ£¬ÕâÒ»ÇоͶ¼ËµµÃͨÁË¡£Êý¾ÝÔÚ¶à¸öÖ÷»úÉϱ»²¢Ðд¦Àí£¬ÎÒÃÇÏëҪȷ¶¨ÕâÑùÒ»¸öʱ¼äµã£ºÔÚ¸Ãʱ¼äµã֮ǰµÄËùÓÐʼþ¶¼ÒѾ±»´¦ÀíÁË¡£
ÕýÒòΪÈç´Ë£¬Reader ÊÕµ½µÄÊÇÒ»¸ö TimeWindow Êý¾Ý½á¹¹¶ø²»ÊÇÒ»¸ö¼òµ¥µÄʱ¼äÊýÖµ¡£ÕâÕýÊÇ
Reader µÄ·Ö²¼Çø¼ä¡£ÔÚÉÏÊöÀý×ÓÖУ¬Ê±¼äÉÏϽç·Ö±ðΪ T5 ºÍ T2¡£Õâһʱ¼ä´°¿Ú¿ÉÒÔͨ¹ýµ÷ÓÃÈçÏ·½·¨»ñÈ¡£º
TimeWindow window
= reader.getTimeWindow(); |
ÔÚÕâÒ»¹ý³ÌÖÐʼÖÕ±£³ÖµÄ²»±äÁ¿ÊÇ£¬Ò»¸ö Reader µÃµ½µÄʱ¼äϽçÒâζ×ÅËùÓÐÔçÓÚÕâ¸öʱ¼äµãµÄʼþ¶¼Ò»¶¨ÒѾ±»¶ÁÈ¡ÁË¡£»¹ÓÐһЩ¼«¶ËµÄÀý×ÓÐèҪעÒâ¡£
Reader Group ¿ÉÄÜλÓÚµ±Ç°Á÷µÚÒ»´Î¼Ç¼µÄʱ¼ä´Á֮ǰ£¬ÔÚÕâÖÖÇé¿öÏ£¬Ê±¼ä´ÁµÄϽçÎÞ·¨×¼È·¶¨Ò塣Ψһ¿ÉÒÔÈ·¶¨µÄÊÇ£¬Reader
Group ´¦ÓÚµÚÒ»¸öʱ¼ä´Á֮ǰ¡£
Reader Group ¿ÉÄÜλÓÚ¿ØÖÆÆ÷Ëù¼Ç¼µÄ×îºóÒ»¸ö±ê¼ÇÖ®ºó¡£ÀýÈ磬Èç¹ûÒ»¸ö Reader Group
Õý´¦ÓÚÁ÷µÄβ¶Ë²¢ÇÒÏû·ÑËٶȽô¸ú×¢ÈëÊý¾Ý£¬ÄÇôËüºÜÓпÉÄÜÔÚ¿ØÖÆÆ÷¾ÛºÏʱ¼ä֮ǰ¾ÍÍê³ÉÁËʼþ´¦Àí¡£´Ëʱ£¬µ±Ó¦ÓóÌÐòµ÷ÓÃ
getTimeWindow()·½·¨Ê±£¬·µ»ØµÄ TimeWindow ½á¹¹ÖУ¬upperTimeBound
³ÉÔ±¿ÉÄÜΪ¿ÕÖµ¡£ÀàËÆµØ£¬lowerTimeBound ³ÉÔ±Ò²¿ÉÄÜÖͺóÓÚ Reader µÄʵ¼ÊλÖã¬ÒòΪËü±ØÐëµÈ´ýʱ¼äÐÅÏ¢½øÐоۺϲÙ×÷¡£
TimeWindow ½á¹¹ÊÇ»ùÓÚ Reader µ±Ç°ÒѾ¶ÁÈ¡µÄλÖöø²»ÊÇÓ¦ÓóÌÐò´¦ÀíµÄλÖã¨ÒòΪ
Pravega ¸ù±¾ÎÞ´ÓÖªÏþÕâÒ»ÐÅÏ¢£©¡£ËùÒÔ£¬Èç¹ûÓ¦ÓóÌÐòÓÉÓÚ Reader ËÀÍö¶øµ÷ÓÃÁË readerOffline()·½·¨Ö¸Ã÷ÐèÒªÖØÐ´¦Àíʼþ£¬ÄÇô
TimeWindow ¿ÉÄܵ¹ÍËÒԱ㷴ӳ³öijЩʼþÐèÒª±»ÖØÐ´¦Àí£¬ÒòΪÔÚ Reader ËÀÍöµÄ¹ý³ÌÖУ¬ÕâЩÕýÔÚ±»´¦ÀíµÄʼþÒѾ¶ªÊ§ÁË¡£
4.4 Óë´¦ÀíÂß¼µÄÁªÏµ
ÔÚ EventStreamReader ½Ó¿ÚÉÏ£¬getTimeWindow()·½·¨·µ»ØÒ»¸ö TimeWindow
¶ÔÏó¡£TimeWindow ¶ÔÏóÌṩÁËʱ¼äµÄÉϽçºÍϽ硣
ÕâÊÇÒ»¸ö»ùÓÚÀÈ¡£¨Pull£©¶ø²»ÊÇÍÆËÍ£¨Push£©µÄÄ£ÐÍ£¬Ò²¾ÍÊÇ˵ÎÒÃÇ¿ÉÒÔ¼ÙÉèÍùÁ÷ÖÐ×¢ÈëһЩ¡°Î±Ê¼þ¡±¡£ÕâһģÐÍÓÐÈçÏÂÓŵ㣺ËüÎÞÐèÇ¿ÖÆÎªÃ¿Ò»¸öÁ÷¶¼´¦Àíʱ¼ä£¬ËüÔÊÐíʱ¼äÔÚÒ»¸öûÓÐÈκÎʼþµÄÁ÷ÉÏÏòÇ°ÍÆ½ø£¬µ«×îÖØÒªµÄÊÇËüΪ
TimeWindow µÄ¼ÆËãÆµÂÊÌṩÁËÁé»îÐÔ¡£
TimeWindow ·´Ó³ÁËÁ÷Éϵĵ±Ç°Î»Öã¬Òò´Ë£¬Èç¹ûÐèÒªµÄ»°£¬¿ÉÒÔÔÚÿ´Îµ÷ÓÃÍê readNextEvent()·½·¨Ö®ºó¶¼µ÷ÓÃËü£¬»òÕßÒ²¿ÉÒÔÖÜÆÚÐԵص÷ÓÃËüÒԱ㽫ʼþ°´´°¿Ú·Ö×é¡£
4.5 Flink Á¬½ÓÆ÷µÄʾÀý
ÔÚ Pravega µÄ Flink Á¬½ÓÆ÷ÖоÍÓÐÕâÑùÒ»¸öÀý×Ó£¬ÊµÏÖÁË TimestampsAndPeriodicWatermarksOperator
½Ó¿Ú£º
@Override
public void onProcessingTime (long timestamp) throws
Exception {
// register next timer
Watermark newWatermark = userFunction.getCurrentWatermark();
if (newWatermark != null && newWatermark.getTimestamp()
> currentWatermark) {
currentWatermark = newWatermark.getTimestamp();
// emit watermark
output.emitWatermark (newWatermark);
}
long now = getProcessingTimeService ().getCurrentProcessingTime();
getProcessingTimeService( ).registerTimer (now
+ watermarkInterval, this);
}
|
´Ë´¦£¬Á¬½ÓÆ÷»ñȡʱ¼ä´°¿Ú£¬Èç¹ûÌõ¼þÂú×㣬ÔòÍÆ½ø Flink µÄ Watermark£¬Éú³ÉÐ嵀 Watermark
²¢µ÷¶ÈÈÎÎñÔÚÒ»¸ö¿ÉÅäµÄʱ¼ä¼ä¸ôºóÖØÐÂÔËÐС£
ÓÉÓÚÕâ¶ÎÂß¼ÊÇÔÚÁ¬½ÓÆ÷ÉÏʵÏֵģ¬ËùÓÐʹÓà Pravega µÄ Flink Ó¦ÓóÌÐò¶¼¿ÉÒÔͨ¹ýʹÓñê×¼
Flink µÄ API ÏíÊܵ½»ùÓÚʼþʱ¼ä»ò×¢Èëʱ¼äµÄ Watermark µÄºÃ´¦¡£
5 ×ܽá
´¦ÀíÁ÷µÄβ²¿Êý¾ÝºÍÀúÊ·Êý¾ÝÊÇ Pravega µÄÁ½´ó×é³ÉÌØÐÔ¡£Pravega ´æ´¢Á÷ʽÊý¾Ý²¢Ê¹ÓÃͳһµÄ
API ÔÊÐíÓ¦ÓóÌÐòÔÚÊý¾Ý¿ÉÓÃʱÁ¢¼´´¦Àí»òÕßÔÚ½«À´ÈÎÒâʱ¼ä´¦Àí¡£ÎªÁ˽á¹ûµÄÒ»ÖÂÐÔ£¬Á÷ʽÊý¾ÝÐèÒªÓÐÒ»¸öʱ¼ä²Î¿¼ÒÔ±ãʹµÃ½á¹ûÓëÁ÷ʽÊý¾ÝºÎʱ±»´¦ÀíÎ޹أ¬²¢ÇÒÕâÒ²°ó¶¨ÁËʱ¼äÔÊÐí½øÐÐʱ¼ä´°¿Ú¼ÆË㣬ÕâÊǷdz£¹Ø¼üµÄÒ»µã¡£ÕýÊÇÁ÷ʽÊý¾ÝµÄÕâÖÖ¶Ôʱ¼äÐÅÏ¢µÄÐèÇóʹµÃÎÒÃǶÔ
Pravega ¼ÓÈëÁË Watermark µÄÖ§³Ö¡£
ÎÒÃÇ¶Ô Watermark µÄÖ§³ÖÓÉÒÔϼ¸²¿·Ö×é³É£º½«Ê±¼ä´Á¹ØÁªµ½ Pravega µÄдÈëÊý¾ÝÉÏ£¬¸ù¾Ýʱ¼ä´ÁÉú³É±íÕ÷λÖÃÐÅÏ¢µÄ
Stream Cut£¬ÒÔ¼°Í¨¹ý Reader ¶ÔÍⱩ¶ʱ¼äÐÅÏ¢ÒÔ±ãÔÊÐíÓ¦ÓóÌÐòÉú³É Watermark¡£Ä³¸ö
Reader µÃµ½µÄʱ¼äÐÅÏ¢ÊÇÒ»¸ö¸ù¾Ý¸÷ Reader µÄλÖÃÉú³ÉµÄ¿ç Reader ʱ¼ä·¶Î§¡£Õâ¸öʱ¼ä·¶Î§¸ø³öÁËËùÓÐ
Reader ÒѾ¶ÁÈ¡Êý¾ÝµÄϽçÒÔ¼°ÔÚ Reader Group Éϵķֲ¼¿ç¶È¡£
±¾Îĵķ½·¨ÊÇÒ»¸öͨÓ÷½·¨£¬²¢ÇÒÖ§³ÖÈÎÒâÓ¦ÓóÌÐòÉú³Éµ¥µ÷µÝÔöµÄʱ¼ä´Á¡£ÎÒÃÇÑ¡Ôñ Apache Flink
×÷ΪÊ׸ö¼¯³É¶ÔÏó£¬ÒòΪËü¶Ô´°¿Ú¾ÛºÏºÍ Watermark ¾ßÓи߼¶Ö§³Ö¡£ÎÒÃÇÔÚ Pravega µÄ
Flink Á¬½ÓÆ÷ÉϼÓÈëÁË Flink Ö§³Ö£¬Ê¹µÃʹÓà Pravega µÄ Flink ×÷Òµ¿ÉÒÔ´Ó
Watermark ÖлñÒæ¡£ÎÒÃÇÆÚ´ýδÀ´µÄ Pravega Á¬½ÓÆ÷¿ÉÒÔÌṩÀàËÆµÄÖ§³Ö£¬²¢ÇÒ¶ÀÁ¢µÄÓ¦ÓóÌÐò¿ÉÒÔ×Ô¼ºÊµÏÖÕâÖÖÖ§³Ö£¬ÒòΪ±¾ÎÄÒѾչʾÁËʹÓøÃ
API ËùÐè¼ÓÈëµÄÂß¼ÊǷdz£¼òµ¥Ö±°×µÄ¡£
|