±à¼ÍƼö: |
±¾ÎÄÏêϸÂÛÊöÁ˸÷½°¸TaskMaker¡¢ Calculator¡¢ CheckerµÈ¸÷¸öÄ£¿éµÄÉè¼ÆÊµÏÖ£¬×îÖÕʵÏÖÁËÓû§ÎÞÐè¶îÍ⿪·¢£¬Ö»ÐèÒª¼òµ¥µÄÅäÖü´¿ÉÍê³É¼à¿ØÖ¸±êµÄ¼ÆËãºÍÍÆËÍ£¬±ÜÃâÁËÈËÁ¦ÀË·Ñ£¬ÌáÉýЧÄÜ¡£
±¾ÎÄÀ´×ÔÓÚÌÚѶ´ó½²Ìã¬ÓÉAlice±à¼¡¢ÍƼö¡£ |
|
±³¾°
ÔÚ½ðÈÚÒµÎñÉÏ£¬ÖÊÁ¿ºÍÎȶ¨ÊÇÉúÃüÏߣ¬ÎÒÃÇÐèÒª¶ÔËùÓÐÒѾÉÏÏßµÄ·ç¿ØÒªËØ£¬Èç²ßÂÔ¡¢Ä£ÐÍ¡¢±êÇ©¡¢ÌØÕ÷µÈ¹¹½¨¼à¿Ø¡£ÔÚ¹ýÈ¥£¬ÎÒÃDz¿Êð¼à¿ØµÄ·½Ê½Îª£º
·ç¿ØÒªËظºÔðͬѧÔÚÒªËØÉÏÏßǰ£¬Í¨¹ýspark\sqlÍê³É¶Ô¼à¿ØÖ¸±êµÄÔËËã²¢ÀýÐл¯£»
½«¼à¿ØÖ¸±êÔËËã½á¹û³ö¿âmysql\tbase£¬ÓÃÓÚÖ¸±êµÄչʾºÍ¸æ¾¯£»
¸æ¾¯ÏµÍ³ÂÖѯָ±êÊÇ·ñÒì³££¬ÈçÒì³£Ôòͨ¹ýÆóҵ΢ÐŵÈÍÆË͸澯ÏûÏ¢¡£
ÕâÖÖģʽÖ÷ÒªµÄÎÊÌâÔÚÓÚ£º
¿ª·¢Ãż÷¸ß£¬ÒªËظºÔðͬѧÐèÒªÕÆÎÕsparkÀëÏß¼ÆËã¡¢mysqlµÈÊý¾Ý¿âµÄÔöɾÊý¾Ý£¬»¹ÐèÒªÊÖ¶¯ÅäÖÃÀýÐл¯ÈÎÎñ£¬Ôڸ澯ϵͳÉϵǼÇ×¢²áµÈ£¬ºÄʱ·ÑÁ¦£»
ÖØ¸´¹¤×÷¶à£¬ÒªËØÖ¸±êÏàËÆ¡¢Öغ϶Ⱥܸߣ¬Èç¶àÊý·ç¿ØÒªËض¼Éæ¼°PSI¼ÆË㣬ֻÊǸ澯ãÐÖµ²»Ò»Ñù£»Ö¸±ê³ö¿â¡¢ÅäÖø澯µÈͬÑùÊÇÖØ¸´ÏàËÆ²Ù×÷¡£
ΪÁ˽â¾öÉÏÊöÎÊÌ⣬ÎÒÃÇÉè¼Æ¿ª·¢ÁËÒ»Ìס°Í³Ò»¼à¿Ø¼ÆËã¼ì²é¹¤¾ß¡±£¨ÒÔϼò³Æ¼à¿Ø¹¤¾ß£©£¬½«¼à¿Ø¼ÆËã²ð½â³É¼ÆËãÈÎÎñÉú³É¡¢¼à¿ØÖ¸±ê¼ÆËã¡¢¼à¿ØÖ¸±êÑÜÉúÓë¼ì²éµÈÄ£¿é£¬ÊµÏÖÓû§ÎÞÐè¶îÍ⿪·¢£¬Ö»ÐèÒª¼òµ¥µÄÅäÖü´¿ÉÍê³É¼à¿ØÖ¸±êµÄ¼ÆËãºÍÍÆËÍ£¬±ÜÃâÁËÈËÁ¦ÀË·Ñ£¬ÌáÉýЧÄÜ¡£
ÕûÌåÉè¼Æ
ϵͳ½»»¥ÊÓͼ

Óëͳһ¼à¿Ø¼ÆËãÓë¼ì²é¹¤¾ß½»»¥µÄÖ÷ÒªÓнÓÈë·½ºÍ¸æ¾¯ÏµÍ³£¬ËùÓÐµÄ¼à¿ØÓɽÓÈë·½·¢Æð£¬½ÓÈë·½¿ÉÒÔÊÇÌØÕ÷¡¢±êÇ©¡¢Ä£ÐÍ¡¢²ßÂԵ͵µ×¼ì²éͬѧ£¬Ò²¿ÉÒÔÊǾßÌåÒµÎñͬѧ¡£½ÓÈë·½Ìá³ö¼à¿ØÐèÇó£¨ÌîдÅäÖã©£¬Í³Ò»¼à¿Ø¼ÆËãÓë¼ì²é¹¤¾ß¸ù¾ÝÐèÇóÉú³É¼ÆËãÈÎÎñÍê³É¼ÆË㣬Èç¹û´¥·¢¸æ¾¯Ôòͨ¹ý¸æ¾¯ÏµÍ³½«¸æ¾¯·¢Ë͸ø½ÓÈë·½£¬½ÓÈë·½½ÓÊܸ澯ºó¼°Ê±ÐÞ¸´²¢·´À¡µÇ¼Ç£¬¼à¿Ø¹¤¾ß»á¶ÁÈ¡Óû§µÄ¸æ¾¯·´À¡ÖØÐÂÍê³ÉÏà¹Ø¼ÆË㣬ֱÖÁ¼à¿ØÖ¸±êÔڸ澯ãÐÖµÄÚ¡£
ΪÁËÍê³É¼à¿ØÖ¸±êµÄ¼ÆË㣬ͳһ¼à¿Ø¼ÆËãÓë¼ì²é¹¤¾ß¿ÉÒÔϸ·ÖΪÈý¸öºËÐÄÄ£¿é£¬·Ö±ðΪ£º
¼ÆËãÈÎÎñÉú³ÉÄ£¿é TaskMaker: ¸ù¾ÝÅäÖúͱ»¼à¿Ø±íµ÷¶ÈÖÜÆÚ£¨hour/day/month)¡¢Ê±¼äÆ«ÖÃÉú³É¼à¿ØÖ¸±ê¼ÆËãÈÎÎñ£¬TaskMaker½â¾öÁ˲»Í¬¼ÆËãÈÎÎñÀýÐл¯ÖÜÆÚ²»Í¬µÄÎÊÌ⣬ʹµÃÏÂÓÎÄ£¿é¿ÉÒÔרעÓÚ¼ÆËã±¾Éí¡£
¼à¿ØÖ¸±ê¼ÆËãÄ£¿é Calculator: ¶ÁȡδÍê³ÉµÄ¼ÆËãÈÎÎñ£¬¼ÆËãÏà¹Ø¼à¿ØÖ¸±ê¡£Calculatorͨ¹ýÉú³ÉÖ´Ðмƻ®²¢ÓÅ»¯µÄ·½Ê½£¬ºÏ²¢²»Í¬ÒµÎñͬѧ¶Ôͬһ±íµÄ¼à¿Ø¼ÆËãÐèÇó£¬ÌáÉý¼ÆËãЧÂÊ¡£
¼à¿ØÖ¸±êÑÜÉúÓë¼ì²éÄ£¿é Checker: ¶ÁÈ¡¼à¿ØÖ¸±ê¼ÆËã½á¹û£¬½øÐл·±È±ä»¯ÂʵÈÑÜÉú£¬È»ºó¶ÔÑÜÉú½á¹û½øÐмì²é£¬·µ»Ø¼ì²é½á¹û¡£
ÐèҪעÒâµÄÊÇ£¬ÎÒÃÇÌá³öÁË¡°¼à¿ØÖ¸±êÑÜÉúµÄ¸ÅÄ£¬½«²»ÒÀÀµÊý¾ÝÔ´±íÖ»ÒÀÀµ¼à¿ØÖ¸±ê¼°ÆäÀúÊ·¼Ç¼µÄÒ»ÀàÖ¸±ê³ÆÎª¡°ÑÜÉúÖ¸±ê¡±£¬½«ÑÜÉúÖ¸±êÑÓ³Ùµ½¼ì²éÆ÷CheckerÉϼÆË㣬¿ÉÒÔ½ÚÊ¡´óÁ¿¼ÆËã×ÊÔ´¡£¾ßÌåÀ´¿´£¬·ÇÑÜÉúÖ¸±êºÍÑÜÉúÖ¸±êµÄ²»Í¬ÔÚÓÚ£º
·ÇÑÜÉúÖ¸±ê¡£·ÇÑÜÉúÖ¸±ê¼´Ö¸±ê¼ÆËã½ö½öÒÀÀµÓÚÊý¾ÝÔ´±í£¬¶ø²»ÒÀÀµÓëÀúÊ·µÄ¼à¿ØÖ¸±ê£¬ÀýÈçPSIÖµ¡¢Ç¨ÒÆÂʵȣ¬ÕâЩָ±êÃèÊöÁË¼à¿ØÒªËØ·Ö²¼µÄ±ä»¯£¬Æä¼ÆËãÖ»ÒÀÀµÓÚÔ´±íµÄµ±Ç°ÖÜÆÚºÍ¶Ô±ÈÖÜÆÚÊý¾Ý£¬²»ÐèÒª¶Ô¼à¿ØÖ¸±ê½øÐÐÑÜÉú£¬ÈçPSI>0.1¼´¸æ¾¯¡£´ËÍâÈÎÎñ»ò±í״̬¼à¿Ø£¬ÈçÈÎÎñÍê³Éʱ¼ä¡¢±í·ÖÇø¼ÆÊýµÈÒ²Ö»ÒÀÀµÔ´±í£¬²»ÐèÒªÑÜÉú¡£·ÇÑÜÉúÖ¸±êÖ»ÄÜÓÉCalculatorÍê³É¼ÆË㣬ͨ³£ÐèÒª¶à´Î±éÀúÊý¾ÝÔ´±í£¬¼à¿ØËùÏûºÄµÄÖ÷Òª¼ÆËã×ÊÔ´¾ÍÊǼÆËã·ÇÑÜÉúÖ¸±êËùµ¼Ö¡£
ÑÜÉúÖ¸±ê¡£ÑÜÉúÖ¸±êÊÇÖ¸¶Ô¼à¿ØÖ¸±ê½øÐжþ´ÎÔËËãºóµÃµ½µÄ¼à¿ØÖ¸±ê£¬ÑÜÉúÖ¸±êµÄ¼ÆËã²»ÒÀÀµÔ´±í£¬Ö»ÒÀÀµ¼à¿ØÖ¸±ê¼°ÆäÀúÊ·¼Ç¼¡£ÀýÈçÁãÖµ¡¢È±Ê§ÖµÂÊ£¬ËüÃÇÊÇ·ÇÑÜÉúÖ¸±ê£¬ÐèÒªÒ»´Î±éÀú±í¼ÆËãµÃµ½£¬µ«ÎÒÃÇͨ³£²»Ö±½Ó¼à¿ØÁãÖµ¡¢È±Ê§ÖµÂÊ£¬ÒòΪ²»Í¬ÌØÕ÷ÉϱÈÂʶ¼²»Ò»Ñù£¬AÌØÕ÷¿ÉÄÜ5%£¬BÌØÕ÷¿ÉÄÜ10%£¬Ö±½Ó¶Ô±ÈÂÊÅäÖø澯µ¼ÖÂÿ¸öÌØÕ÷µÄãÐÖµ¶¼²»Ò»Ñù£¬ÅäÖø´ÔÓ£¬Òò¶øÎÒÃÇ¼à¿ØÁãֵȱʧֵÂʵIJ¨¶¯£¨¼´µ±Ç°ÖÜÆÚÁãֵȱʧֵ±ÈÂÊͬÆäËûÖÜÆÚµÄ²îÖµ£©£¬´ËʱËüÃÇÊÇÑÜÉúÖ¸±ê£¬ÒòΪ²¨¶¯µÄ¼ÆËãÖ»ÒÀÀµÓÚµ±Ç°ºÍ¶Ô±ÈÖÜÆÚµÄÁãÖµ¡¢È±Ê§Öµ±ÈÂÊ£¬Í¬Ê±¶Ô±ÈÖÜÆÚµÄ±ÈÂÊÔÚÀúÊ·ÈÎÎñÉϾÍÒѾÍê³É¼ÆË㣬¸´Óýá¹û¿ÉÒÔ½Úʡһ±¶ÒÔÉϵļÆËã×ÊÔ´£¬ÌáÉýЧÂÊ¡£
³ýÁ˺ËÐÄÄ£¿é£¬Í³Ò»¼à¿Ø¼ÆËãÓë¼ì²é¹¤¾ß»¹ÌṩÁË¡°·¢³ö¸æ¾¯Ö¸Á¡¢¡°½ÓÊܸ澯·´À¡ÖØÐÂÉú³É¼ÆËãÈÎÎñ¡±µÈ¸¨ÖúÄ£¿é¡£ÒÔÉϹ²Í¬×é³ÉÁËͳһ¼à¿Ø¼ÆËãÓë¼ì²é¹¤¾ß£¬È·±£´¥·¢µÄÒì³£¸æ¾¯Äܹ»µÃµ½¼°Ê±·´À¡ÐÞÕý¡£
²¿ÊðÊÓͼ
ÔÚʵ¼Ê²¿ÊðÉÏ£¬Í³Ò»¼à¿Ø¼ÆËãÓë¼ì²é¹¤¾ßÖÐTaskMaker£¨ÈÎÎñÉú³É£©¡¢Calculator£¨¼ÆË㣩¡¢Checker£¨¼ì²é£©µÈÄ£¿éʵ¼ÊÉ϶ÔÓ¦Ò»¸öSpark½Úµã£¬¸÷¸öÄ£¿éÖ®¼äÒÀÀµ¹ØÏµÈçÏÂͼËùʾ¡£

¼ÆËãÈÎÎñÖ÷ÒªÓÉTaskMakerÄ£¿é¸ù¾ÝÓû§ÅäÖÃÉú³É£¬´ËÍâÓû§·´À¡ÒѾÐÞ¸´µÄ¸æ¾¯Ò²»áÖØÐÂÉú³É¼ÆËãÈÎÎñ£¬TaskMakerÆÁ±ÎÁ˲»Í¬µ÷¶ÈÖÜÆÚµÄÊý¾ÝÈÎÎñÉú³ÉÖÜÆÚ²»Ò»ÖµÄÎÊÌ⣬ÀýÈçÈÕ±íÈÎÎñÿÌìÉú³ÉǰһÌìµÄ±í¼à¿ØÈÎÎñ£¬Ô±íÈÎÎñÖ»ÔÚÿÔÂÌØ¶¨Ò»ÌìÉú³ÉÔ±íµÄ¼à¿ØÈÎÎñ£»Calculator½ÓÊܼÆËãÈÎÎñÍê³É¼à¿ØÖ¸±êµÄ¼ÆË㣬CalculatorÍê³É¼à¿ØµÄ¶àÊý¼ÆË㣬ÐèÒª½Ï¶àµÄ¼ÆËã×ÊÔ´£»CheckerÍê³É¼à¿ØÖ¸±êµÄÑÜÉúºÍ¼ì²é¡£
Ä£¿éÏêϸÉè¼Æ
½ÓÏÂÀ´£¬ÎÒÃÇÌÖÂÛ¼à¿Ø¹¤¾ßTaskMaker£¨ÈÎÎñÉú³É£©¡¢Calculator£¨¼ÆË㣩¡¢Checker£¨¼ì²é£©µÈÄ£¿éµÄÉè¼ÆÄѵ㡣
¼ÆËãÈÎÎñÉú³É£¨TaskMaker£©Ä£¿é
¼ÆËãÈÎÎñÉú³É£¨TaskMaker£©Ä£¿éºËÐÄÂß¼ÊÇ:
½âÎöÅäÖñí (ÅäÖñí×ֶμûϱí)£»
¸ù¾ÝÅäÖñíÖÐschedule_typeµ÷¶ÈÖÜÆÚºÍschedule_biasÆ«Öã¬Éú³ÉÐèÒª¼ì²é±íµÄ·ÖÇø£¨partition_name£©,½«Ô´±íÐÅÏ¢£¨table_name¡¢col_name¡¢partition_name£©ºÍ¼ÆËãÐÅÏ¢£¨cal_procedure¡¢kwargs£©Ð´»Ø¡£

TaskMakerµÄÖ÷ÒªÉè¼ÆÄѵãÔÚÓÚ£ºÐèÒª´¦Àí¼à¿ØÈÎÎñµ÷¶ÈÖÜÆÚÓëÔ´±í¼ÆËãÈÎÎñµ÷¶ÈÖÜÆÚµÄ²î±ð£¬ÊÊÅäºÃhour/day/week/monthµÈ²»Í¬ÖÜÆÚ£¬¿ÉÒÔ×ܽáΪÏÂ±í£º

¼ÙÉ赱ǰÊý¾Ýʱ¼äÊÇ20210210 11:00£¬ÒòΪµ÷¶Èϵͳ¶ÔÈÕÈÎÎñͨ³£ÓÐÒ»ÌìµÄÆ«ÒÆ£¬´Ëʱʵ¼ÊÖ´ÐÐʱ¼äΪ20210211
11:00£¬¶ÔÓÚ²»Í¬ÀàÐ͵ÄÔ´±íÖÜÆÚ£¬Æ«ÖúÍ×îÖÕÉú³É·ÖÇø¾ÙÀýÈçÏ£º
hour: Èç¹ûÆ«ÖÃÊÇ-1£¬Ôò¼ì²é·ÖÇøºÍµ±Ç°Êý¾Ýʱ¼äÒ»Ö£¬Îª20210210 11:00£¬Èç¹ûÊÇ-2£¬Ôò¼ì²é·ÖÇøÌáǰһСʱ£¬Îª20210210
10:00£»
day£ºÈç¹ûÆ«ÖÃÊÇ-1£¬Ôò¼ì²é·ÖÇøºÍµ±Ç°Êý¾Ýʱ¼äÒ»Ö£¬Îª20210210£¬Èç¹ûÊÇ-2£¬Ôò¼ì²é·ÖÇøÌáǰһÌ죬Ϊ20210209£»
week: Èç¹ûÆ«ÖÃÊÇ-1£¬´ú±í¼ì²éÉÏÒ»ÖÜ£¬µ«ÊÇÒòΪµ±ÌìÊÇÖÜÈý£¬²»Éú³ÉÖܼÆËãÈÎÎñ£»
month£ºÈç¹ûÆ«ÖÃÊÇ-10£¬Éú³ÉÉÏÔ¼ÆËãÈÎÎñ202101£¬Èç¹û²»ÊÇ-10£¬Ôò²»Éú³ÉÔ¼ÆËãÈÎÎñ£¬×¢Òâµ½Çø±ðÓÚСʱ±í¡¢ÈÕ±í¡¢ÖÜ±í£¬Æ«ÖÃͨ³£±íÊ¾Æ«ÒÆÈô¸É¸öÖÜÆÚ£¬µ«ÊÇÔ±íÀýÍ⣬Ô±íµÄÆ«Öôú±í¡°¼¸ºÅ¿ªÊ¼¼ÆËãÈÎÎñ¡±¡£
Ô´±íÈÕ±í¡¢Ô±íµÈ²»Í¬µ÷¶ÈÖÜÆÚµÄÎÊÌâÔÚTaskMakerÄ£¿é½â¾ö£¬ºóÐøÄ£¿é²»ÔÙ¸ÐÖªÔ´±íÖÜÆÚµÄÇø±ð£¬×¨×¢Íê³É¼à¿ØÖ¸±êµÄ¼ÆËã¡£
¼à¿ØÖ¸±ê¼ÆË㣨Calculator£©Ä£¿é
¼à¿ØÖ¸±ê¼ÆË㣨Calculator£©Ä£¿éºËÐÄÂß¼£¨ÈçÏÂͼ£©ÊÇ£º
¶ÁȡδÍê³ÉµÄ¼ÆËãÈÎÎñ£»
ͨ¹ýÉú³ÉÖ´Ðмƻ®²¢ÓÅ»¯µÄ·½Ê½£¬ºÏ²¢²»Í¬ÒµÎñͬѧ¶Ôͬһ±íµÄ¼à¿Ø¼ÆËãÐèÇó£¬ÌáÉý¼ÆËãЧÂÊ£¬Calculator»á²úÉúÈý¸ö×ֶΣ¬·Ö±ðΪ£º
cal_time£º±£´æ¼ÆËãʱ¼ä
cal_outputs£º±£´æ¼ÆËã½á¹û£¬json¸ñʽ
cal_errors£º±£´æ¼ÆËãÒì³£´íÎóÐÅÏ¢

Ê×ÏÈ£¬ÎÒÃÇͨ¹ýʵÀýÀ´½âÊÍÈçºÎͨ¹ýÖ´ÐÐÓÅ»¯±ÜÃâÖØ¸´¼ÆË㣬ÌáÉýÐÔÄÜ£º
ͬѧ1µÄÒµÎñÐèÒª¼ì²étable±íµÄAÁеÄpsi
ͬѧ2µÄÒµÎñÐèÒª¼ì²étable±íµÄBÁеÄpsi
ͬѧ3µÄÒµÎñÐèÒª¼ì²étable±íµÄCÁÐȱʧÂÊÕ¼±È
¼ÆËãpsiÐèÒª3´Î±éÀú±í£¬¼ÆËãȱʧÂÊÐèÒª1´Î±éÀú±í£¬¹²¼ÆÐèÒª3+3+1=7´Î±éÀú
¶øÊµ¼ÊÉ϶¼ÊǶÔͬһtable±íµÄ±éÀú£¬¿ÉÒԺϲ¢£¬ÈçÏÂͼ£¬´ËʱֻÐèÒª3´Î±éÀú£¬¿ÉÒÔ½Úʡһ±¶ÒÔÉϵÄʱ¼ä

ΪÁËʵÏÖÖ´ÐÐÓÅ»¯£¬ÎÒÃÇÐèÒª½«Ò»¸ö¼à¿ØÖ¸±êµÄ¼ÆËã¹ý³Ì²ð½âΪÈô¸É¸ö×îС¿ÉÖ´Ðе¥Ôª£¬³ÆÖ®Îªº¯Êý¡£¾ßÌ嵽ʵÏÖÉÏ£¬º¯Êý±£´æÁ˼ÆËãÂß¼µÄʵÏÖ´úÂ룬¹ý³Ìµ÷ÓÃÈô¸É¸öº¯ÊýÍê³É¼à¿ØÖ¸±êµÄ×îÖÕ¼ÆË㣬ÈçÏ£º
# Function
def F:RDD_aggre(...): ...
def F:math_psi(...): ... |
# Procedure
def P:psi(...):
seg = F:RDD_aggre('cal_seg', ...)
cur = F:RDD_aggre('count@cur', seg, ...)
his = F:RDD_aggre('count@-1', seg, ...)
psi = F:math_psi(cur, seg, ...)
return psi |
ÉÏÊö¼ÆËã¹ý³Ì¿ÉÒÔת»»³É¼ÆËãͼDAGÀ´±íʾ£¬ÈçÏÂͼ£º

¸ü¸´Ôӵ쬵±Óжà¸ö¼à¿Ø¼ÆËã¹ý³Ìʱ£¬DAG¿ÉÒÔ±íʾΪ£º

DAGÐèÒªÖ´ÐеIJ¿·ÖΪҶ×ӽڵ㣬ΪÁ˱ÜÃâÖØ¸´¼ÆË㣬
ÎÒÃǶÔÿ´ÎÖ´ÐеÄÒ¶×Ó½Úµã½øÐÐÁ½ÀàÀàÓÅ»¯£º
ºÏ²¢Í¬Ãûº¯Êý£¬µ±º¯ÊýÃûºÍ²ÎÊý¶¼ÍêȫһÖÂʱ£¬ºÏ²¢º¯Êý£¬½öÖ´ÐÐÒ»´Î£»µ±º¯ÊýÃûÒ»Ö¡¢²ÎÊý²»Ò»Ö£¬Éú³ÉеÄÖ´Ðк¯Êý£¨Ö÷ÒªÕë¶ÔRDD
aggregate²Ù×÷£©£¬Í¬Ñù½øÖ´ÐÐÒ»´Î¡£
»º´æ¼ÆËã½á¹û£¬»º´æº¯Êý½á¹û£¬µ±ÐèÒªÔٴμÆËãÏàͬº¯Êýʱ£¬Ö±½Ó´Ó»º´æ¶ÁÈ¡½á¹û¡£
ÀýÈ磬ÉÏÊöDAGÒ¶×Ó½Úµã±íʾµÄ¿ÉÖ´Ðк¯Êý(Ò¶×ӽڵ㣩Ϊ£ºF:RDD_aggre£¨cal_seg£¬±í1£¬AÁУ©¡¢F:RDD_aggre£¨cal_seg£¬±í1£¬AÁУ©¡¢F:RDD_aggre£¨null_rate£¬±í1£¬BÁУ©£¬ÆäÖÐÁ½¸öF:RDD_aggre£¨cal_seg£¬±í1£¬AÁУ©ÎªÍ¬Ãûͬ²Îº¯Êý£¬ºÏ²¢ÎªÒ»¸öÖ´ÐУ¬ÓÖF:RDD_aggre£¨cal_seg£¬±í1£¬AÁУ©ÓëF:RDD_aggre£¨null_rate£¬±í1£¬BÁУ©ÊÇͬÃûº¯Êý£¬¿ÉÒԺϲ¢Ö´ÐÐF:RDD_aggre£¨[cal_seg,
null_rate]£¬[±í1, ±í1]£¬[AÁÐ, BÁÐ]£©,´ËʱԱ¾ÐèÒªÐèÒªÈý´Î±éÀú±í£¬ºÏ²¢ÎªÒ»´Î±éÀú±í¼´¿ÉÍê³É¡£

ͬÑùµÄ£¬ÔÚµÚ¶þ²ãÒ¶×ӽڵ㺯ÊýF:RDD_aggre£¨count@cur£¬seg, ±í1£¬AÁУ©¿ÉÒԺϲ¢ÎªÒ»´ÎÖ´ÐУ¬µ«F:RDD_aggre£¨count@-1,
seg£¬±í1£¬AÁУ©¡¢F:RDD_aggre£¨count@-6, seg£¬±í1£¬AÁУ©ÐèÒª·Ö±ð±éÀú²»Í¬µÄ±í·ÖÇø£¨ÉÏÒ»ÖÜÆÚ·ÖÇø¡¢Ç°6ÖÜÆÚ·ÖÇø£©£¬Òò¶øÖ»ÄÜ·Ö±ð¼ÆË㣬µÚ¶þ²ãÒ¶×ӽڵ㹲²úÉúÈý´Î±éÀú±í£¬ÈçÏ£º

×îÖÕ£¬ÀÈ¡·Ö¶Î¼ÆÊý£¬ÔÚ±¾µØÍê³ÉPSIµÄ¼ÆË㣺

×ÛÉÏ£¬Ö´ÐÐÓÅ»¯Ë㷨С½áÈçÏ£º
Ëã·¨: Ö´ÐÐÓÅ»¯Ëã·¨¡£
ÊäÈ룺µ±Ç°È«²¿Î´Ö´ÐмÆËãÈÎÎñ¶ÔÓ¦¼ÆËã¹ý³Ì¡£
Á÷³Ì£º
- Step1. ½«¼ÆËã¹ý³Ìת»¯³ÉDAG±íʾ£¬Ã¿¸ö½ÚµãΪһ¸öÖ´Ðк¯Êý¡£
- Step2. Èç¹ûµ±Ç°»¹´æÔÚδִÐеÄÒ¶×ӽڵ㣬ÄÇôºÏ²¢Ò¶×Ó½ÚµãÖеÄͬÃûº¯Êý£¬µ±º¯ÊýÃûºÍ²ÎÊý¶¼ÍêȫһÖÂʱ£¬ºÏ²¢º¯Êý£»µ±º¯ÊýÃûÒ»Ö¡¢²ÎÊý²»Ò»Ö£¬Éú³ÉеÄÖ´Ðк¯Êý¡£
- Step3. Ö´Ðк¯Êý£¬Èç¹û»º´æÖдæÔÚ½á¹û£¬Ö±½ÓÀÈ¡½á¹û£¬·ñÔòÍê³É¼ÆËãºó»º´æ½á¹û¡£
- Step4. Èô»¹´æÔÚδִÐеÄÒ¶×ӽڵ㣬·µ»ØStep2£¬·ñÔòÖÕÖ¹¡£
Êä³ö£º¼ÆËã¹ý³Ì¶ÔÓ¦µÄ¼à¿ØÖ¸±ê½á¹û¡£
µ±Ç°£¬CalcutorÖ§³Ö³£¼û¼à¿ØÖ¸±ê°üÀ¨£º

ͨ¹ýCalcutorÄ£¿é¿ÉÒÔÍê³É¼à¿ØÖ¸±êµÄ¼ÆË㣬µ«Ò²´æÔÚһЩ¼à¿ØÖ¸±ê£¨Èç¿ÕÖµÕ¼±È£©ÐèÒªÑÜÉúºó²ÅÄÜÅжÏÊÇ·ñÒì³££¬Òò¶øÎÒÃÇÉè¼ÆÁËCheckerÄ£¿é¡£
¼à¿ØÖ¸±êÑÜÉúÓë¼ì²é£¨Checker£©Ä£¿é
¼à¿ØÖ¸±êÑÜÉúÓë¼ì²é£¨Checker£©Ä£¿éºËÐÄÂ߼Ϊ£º
¶Áȡδ¼ì²éµÄ¼à¿ØÖ¸±ê£»
°´gen_proceduresÑÜÉúÂß¼ÖÐÅäÖ÷½·¨¶Ô¼à¿ØÖ¸±êÑÜÉúºó£¬°´check_strategies¼ì²éÂß¼ÖÐÅäÖ÷½·¨¶Ô¼à¿ØÖ¸±ê¼ì²é£»
Checker»á²úÉúÎå¸ö×ֶΣ¬·Ö±ðΪ£º
check_time £º±£´æ¼ÆËãʱ¼ä
gen_outputs £º±£´æÑÜÉú£¬json¸ñʽ
gen_errors £º±£´æÑÜÉúÒì³£´íÎóÐÅÏ¢
check_pass£º¼ì²éÊÇ·ñͨ¹ý
check_details£º±£´æÎ´Í¨¹ýÔÒò£¬½ÓÈ뷽ͬѧÐè¹Ø×¢check_pass¡¢check_details×Ö¶Î

CheckerµÄÑÜÉú·½·¨°üÀ¨£º

Íê³ÉÑÜÉúºó£¬ÐèÒªÅжÏÖ¸±êÊÇ·ñÒì³££¬ÕâÊÇͨ¹ý¼ì²éãÐֵʵÏֵ쬳£¼ûµÄ¼ì²éÂß¼ÓУº

¾Ù¸öÀý×Ó£¬Èç¹ûÒª¶ÔȱʧÂʲ¨¶¯½øÐÐ¼à¿Ø£¬ÒªÇóÆä±ä»¯·ù¶ÈСÓÚ0.1£¬²¢Çұ仯ÂÊСÓÚ0.2£¬¿ÉÒÔ½«Ö¸±êÑÜÉúÅäÖÃΪ
diff@-1¡¢relative@-1£¬Ö¸±ê¼ì²é²ßÂÔÅäÖÃΪ abs_less_than@0.1 ¡¢
abs_less_than@0.2 ¡£
¼à¿Ø¼ÆËãÓÅ»¯ÊµÀý - PSI¼ÆËã´Ó20hµ½2h
ÔÚÎÒÃǵÄʵ¼ùÖУ¬·¢ÏÖ¶Ô6w¸öÊý¾ÝÁеÄpsiµÈ4¸ö¼à¿ØÖ¸±êµÄ¼ÆË㣬½öÈÕ±í¼à¿Ø¼ÆËãºÄʱ³¤´ï20h+ £¬¼ÆËãºÄʱ¹ý´ó£¬³¤Ê±¼äÕ¼Óü¯Èº×ÊÔ´Ò²»áµ¼ÖÂÏßÉÏÈÎÎñÑÓ³Ù¡£ÎÒÃÇ·ÖÎöÁËÔì³É¼ÆËãʱ¼ä³¤µÄÔÒòÓУº
²¿·Ö¼à¿ØÖ¸±êÈçPSI¼ÆËãÉæ¼°¶à´Î±éÀú±í£»
Pyspark ÔÉúRowÊôÐÔ·ÃÎÊЧÂʲ
²¿·Ö³¬´ó±íÐÐÊý´ïµ½20ÒÚ+¡£
Õë¶ÔÕâЩÎÊÌ⣬ÎÒÃÇÌá³öÁËÏÂÊö·½°¸ÖðÒ»½â¾ö¡£
PSI¼ÆËãÓÅ»¯£º´Ó4´Î±éÀú±íµ½Ò»´Î±éÀú±í
Ïà±Èȱʧֵռ±È¡¢ÁãÖµÕ¼±ÈÖ»ÐèÒ»´Î±éÀú±í£¬¼ÆËãpsi@-1¡¢psi@-6×ܹ²ÐèÒª4´Î±éÀú±í£¬¾ßÌåÈçÏ£º
±éÀúµ±Ç°ÖÜÆÚ»ñÈ¡·Ö¶Îsegs£»
¸ù¾Ý·Ö¶Îsegs±éÀúµ±Ç°ÖÜÆÚ»ñÈ¡·Ö¶Î¼ÆÊý£»
¸ù¾Ý·Ö¶Îsegs±éÀú-1ÖÜÆÚ»ñÈ¡·Ö¶Î¼ÆÊý£¬¼ÆËãpsi@-1£»
¸ù¾Ý·Ö¶Îsegs±éÀú-6ÖÜÆÚ»ñÈ¡·Ö¶Î¼ÆÊý£¬¼ÆËãpsi@-6¡£
ΪÁ˽µµÍPSIµÄ±éÀú´ÎÊý£¬ÎÒÃÇÉè¼ÆÁËÒ»ÖÖ»ùÓÚÖ±·½Í¼µÄPSI¹ÀËã·½·¨£¬Í¨¹ýÒ»´Î±éÀú±í£¬µÃµ½ÌØÕ÷·Ö²¼Ö±·½Í¼£¬ÔÙ½áºÏÀúÊ·ÉϼÆËãµÄÆäËûÖÜÆÚÌØÕ÷·Ö²¼Ö±·½Í¼£¬¾Í¿ÉÒÔ¹ÀËã³öPSI¡£
ÈçÏÂͼËùʾ£¬»ùÓÚÖ±·½Í¼µÄPSI¹ÀËã·½·¨Ö÷Òª°üÀ¨4¸ö²½Ö裺
- ²½ÖèÒ»£º±éÀúÒ»´Î±í£¬Ê¹ÓÃÐîË®³Ø²ÉÑùÊý¾Ý£¨>10w)£¬±¾µØ¼ÆËã·Ö¶Î¡¢Í³¼Æ¸÷¸ö·Ö¶Î¼ÆÊý£¬µÃµ½ÌØÕ÷µÄÖ±·½Í¼·Ö²¼h1£¬ÈçÏÂͼ£»
- ²½Öè¶þ£º´ÓÀúÊ·½á¹ûÖÐÀÈ¡-nÖÜÆÚµÄÖ±·½Í¼·Ö²¼h2£»
- ²½ÖèÈý£ºÓÉÓÚ¡°·Ö¸îµã¡±²»Ò»Ö£¬ÎÒÃÇÎÞ·¨Ö±½Ó¸ù¾ÝÖ±·½Í¼¼ÆËãPSI£¬Òò´Ë¶ÔÖ±·½Í¼½øÐзָʹµÃµ±Ç°ÖÜÆÚÖ±·½Í¼ºÍÉÏÒ»ÖÜÆÚÖ±·½Í¼µÄ·Ö¸îµãÒ»Ö£¬È¡h1¡¢h2Ö±·½Í¼·Ö¸îµãµÄ²¢¼¯×÷Ϊзָîµã£¬°´ÕÕеķָîµãÖØÐ»®·ÖÖ±·½Í¼µÃµ½h1`¡¢h2`£»
- ²½ÖèËÄ£º¸ù¾Ý·Ö¸ôºóµÄÖ±·½Í¼h1`¡¢h2`ºÍPSI¼ÆË㹫ʽ¼ÆËãPSI¼´¿É¡£

ͨ¹ýPSI¼ÆËãÓÅ»¯£¬¼ÆËãʱ¼ä´Ó20h -> 7h¡£
Pyspark RowÊôÐÔ·ÃÎÊÓÅ»¯
ÎÒÃÇ·¢ÏÖPysparkʵÏÖµÄRow·ÃÎÊÊôÐÔÓÐЧÂÊÎÊÌ⣨ÈçÏÂͼ£¬¹Ù·½Ô´Âë×¢ÊÍÒ²³ÐÈÏÁËÕâÒ»ÎÊÌ⣩£¬row['field']ÐèÒª±éÀúËùÓеÄÁÐÃû£¬²ÅÄܵõ½ÕýÈ·µÄϱ꣬Æäʱ¼ä¸´ÔÓ¶ÈÊÇO(n)¡£

ΪÁ˽â¾örow·ÃÎÊËٶȵÄÎÊÌ⣬ÎÒÃÇÌá³öÁËÏÂÊö·½°¸£º
¹ã²¥[ÁÐÃû->ÁÐϱê]Map£ºfield_map = broadcast(field_map)
ËùÓÐÓÃrow['field']µÄµØ·½£¬ ¶¼¸Ä³É row[feld_map.value['field']]
ͨ¹ýʹÓÃÁËÉÙÁ¿µÄÄÚ´æ´æ´¢[ÁÐÃû->ÁÐϱê]Ó³É䣬¼´Äܽ«RowÊôÐÔ·ÃÎʸ´ÔÓ¶È´ÓO(n) ->
O(1)£¬×îÖÕʵÑéÖ¤Ã÷¼ÆËãʱ¼ä´Ó7h -> 4h¡£
³¬´ó±íµÄÓÅ»¯£º²ÉÑùÓë±ÜÃâÐòÁл¯
ÎÒÃǹ۲쵽£¬Ä¿Ç°´æÔÚÉÙÁ¿¼à¿Ø±íÐÐÊý´ïµ½20ÒÚ+£¬ÀúÊ·ÔÒòÆä¸ñʽΪformat£¨ÂýÓÚorcfile£©£¬ÕâЩ±íÈ«±í±éÀú¼ÆËã¼à¿ØÖ¸±êµÄʱ¼ä´ïµ½Êý¸öСʱ¡£
Õë¶ÔÕâÖÖ³¬´ó±í£¬ÎÒÃÇÌá³öÁ˲ÉÑùºÍ±ÜÃâÐòÁл¯µÄÓÅ»¯·½·¨£¬¾ßÌåÀ´Ëµ£º
²ÉÑù£¬¼´¶ÔÐÐÊý´óÓÚ1Òڵıí²ÉÑù£¬¿ØÖÆÐÐÊýÔÚÒ»ÒÚÄÚ£¬ÐèҪעÒâµÄÊÇ£¬ÎªÁ˱£Ö¤²ÉÑùЧÂÊ£¬ÎÒÃÇʹÓÃwhere×Ó¾äÍê³É²ÉÑù£ºwhere
rand(123) < Ò»ÒÚ/±íÐÐÊý£»
±ÜÃâÐòÁл¯£¬¼´Í¨¹ýDataFrame API where »ò select×Ó¾äɸѡ²»Ê¹ÓõÄÐлòÁУ¬±ÜÃâËüÃÇÐòÁл¯µ½Python¶ÔÏó¡£
ͨ¹ýÉÏÊöÓÅ»¯£¬¶ÔÓÚ20ÒÚ+ÐÐÊýµÄ´ó±í¼ÆËãʱ¼ä´ÓÊý¸öСʱµ½¼¸Ê®·ÖÖÓ£¬²¢×îÖÕʵÏÖ×ÜÌ弯Ëãʱ¼ä´Ó20h
-> 2hµÄÓÅ»¯¡£

С½á
Õë¶Ô½ðÈÚ·ç¿ØÒªËØ¼à¿ØµÄ¡°¿ª·¢Ãż÷¸ß¡±¡°Öظ´¹¤×÷¶à¡±µÈÎÊÌ⣬±¾ÎÄÌá³öÁË¡°Í³Ò»¼à¿Ø¼ÆËãÓë¼ì²é¹¤¾ß¡±ÕâÒ»½â¾ö·½°¸£¬±¾ÎÄÏêϸÂÛÊöÁ˸÷½°¸TaskMaker¡¢
Calculator¡¢ CheckerµÈ¸÷¸öÄ£¿éµÄÉè¼ÆÊµÏÖ£¬×îÖÕʵÏÖÁËÓû§ÎÞÐè¶îÍ⿪·¢£¬Ö»ÐèÒª¼òµ¥µÄÅäÖü´¿ÉÍê³É¼à¿ØÖ¸±êµÄ¼ÆËãºÍÍÆËÍ£¬±ÜÃâÁËÈËÁ¦ÀË·Ñ£¬ÌáÉýЧÄÜ¡£×îºó£¬ÎÒÃÇ»¹¸ø³öÁËÒ»¸ö¡°¼à¿Ø¼ÆËãÄ£¿é¡±ÓÅ»¯µÄʵÀý£¬Í¨¹ý¡°Ö±·½Í¼¹ÀËãPSI¡±¡¢¡°RowÁÐÃû¹ã²¥¡±¡¢¡°²ÉÑùÓë±ÜÃâÐòÁл¯¡±µÈ·½Ê½£¬½«¼à¿Ø¼ÆËãµÄËÙÂÊÌáÉýÁË10±¶£¬½ÚÊ¡ÁË´óÁ¿¼ÆËã×ÊÔ´¡£ |