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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Spark Ö®Â㺴óÊý¾Ý²úÆ·µÄÒ»ÖÖ²âÊÔ·½·¨ÓëʵÏÖ
 
×÷ÕߣºËï¸ß·É
  2206  次浏览      27
 2020-3-4
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜÁËʲôÊÇshuffleºÍÊý¾ÝÇãб£¬ÔìÊýµÄ»ù±¾Ô­Àí£¬ÒÔ¼°Ê¹Óüò¶ÌµÄ´úÂëʵÏÖ¼òµ¥µÄETLµÄ²âÊÔ³¡¾°ºÍ²âÊԽű¾£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚTesterHomeÉçÇø £¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­¡¢ÍƼö¡£

ǰÑÔ

spark×÷ΪÏÖÔÚÖ÷Á÷µÄ·Ö²¼Ê½¼ÆËã¿ò¼Ü£¬ÒѾ­ÈÚÈëµ½Á˺ܶàµÄ²úÆ·ÖÐ×÷ΪETLµÄ½â¾ö·½°¸¡£ ¶øÎÒÃÇÈç¹ûÏëҪȥ²âÊÔÕâÑùµÄ²úÆ·¾ÍÒª¶Ô·Ö²¼Ê½¼ÆËãµÄÔ­ÀíÓиöÇåÎúµÄÈÏÖª²¢ÇÒÒ²ÒªÊìϤ·Ö²¼Ê½¼ÆËã¿ò¼ÜµÄʹÓÃÀ´Õë¶Ô¸÷ÖÖETL³¡¾°Éè¼Æ²»Í¬µÄ²âÊÔÊý¾Ý¡£ ¶øÒ»°ãÀ´ËµÎÒÃÇÐèÒª´ÓÒÔÏÂÁ½¸ö½Ç¶ÈÀ´½øÐвâÊÔ¡£

ETLÄܼæÈݸ÷ÖÖ²»Í¬µÄÊý¾Ý(²»Í¬µÄÊý¾Ý¹æÄ££¬Êý¾Ý·Ö²¼ºÍÊý¾ÝÀàÐÍ)

ETL´¦ÀíÊý¾ÝµÄÕýÈ·ÐÔ

²âÊÔÊý¾Ý¼æÈÝ

ETLÊǰ´Ò»¶¨¹æÔòÕë¶ÔÊý¾Ý½øÐÐÇåÏ´£¬³éÈ¡£¬×ª»»µÈһϵÁвÙ×÷µÄ¼òд¡£ÄÇôһ°ãÀ´ËµËûÒªÄܹ»´¦ÀíºÜ¶àÖÖ²»Í¬µÄÊý¾ÝÀàÐÍ¡£ ÎÒÃÇÔÚÉú²úÉÏÓö¼ûµÄbugÓкܴóÒ»²¿·ÖÕ¼±ÈÊÇÉú²ú»·¾³Óöµ½Á˱Ƚϼ«¶ËµÄÊý¾Ýµ¼ÖÂÎÒÃǵÄETL³ÌÐòÎÞ·¨´¦Àí¡£ ±ÈÈ磺

Êý¾ÝÓµÓдóÁ¿µÄ·ÖƬ

Êý¾ÝÇãб

¿í±í

¿Õ±í

¿ÕÐÐ

¿ÕÎļþ

ÖÐÎÄÐкÍÖÐÎÄÁÐ

³¬³¤ÁÐÃû

°üº¬ÌØÊâ×Ö·ûµÄÊý¾Ý

Õë¶ÔÉÏÃæËµµÄһЩÊý¾Ý³¡¾°ÎÒÌô¼¸¸öÖØÒªµÄ˵һÏ£º

Êý¾ÝÓµÓдóÁ¿·ÖƬ

ÔÚ·Ö²¼Ê½¼ÆËãÖУ¬Ò»·ÝÊý¾ÝÊÇÓɶà¸öÉ¢ÂäÔÚHDFSÉϵÄÎļþ×é³ÉµÄ£¬ ÕâЩÎļþ¿ÉÄÜÉ¢ÂäÔÚ²»Í¬µÄ»úÆ÷ÉÏ£¬ Ö»²»¹ýHDFS»á¸øÊ¹ÓÃÕßÒ»¸öͳһµÄÊÓͼ£¬ÈÃʹÓÃÕßÒÔΪ×Ô¼ºÔÚ²Ù×÷µÄÊÇÒ»¸öÎļþ£¬¶ø²»ÊǺܶà¸öÎļþ¡£ ÕâÊÇHDFSÕâÖÖ·Ö²¼Ê½ÎļþϵͳµÄ´æ´¢·½Ê½¡£ ¶ø¸÷ÖÖ·Ö²¼Ê½¼ÆËã¿ò¼Ü£¬ ±ÈÈçhadoopµÄMapReduce£¬»òÕßÊÇspark¡£ ¾Í»áÀûÓÃÕâÖÖÌØÐÔ£¬Ö±½Ó¶ÁȡɢÂäÔÚ¸÷¸ö»úÆ÷ÉÏÎļþ²¢±£´æÔÚÄǸö½ÚµãµÄÄÚ´æÖÐ(ÀíÏë״̬Ï£¬Èç¹û×ÊÔ´²»¹»¿ÉÄÜ»¹ÊǻᷢÉúÊý¾ÝÔÚ½Úµã¼äÇ¨ÒÆ)¡£ ¶ø¶ÁÈ¡µ½ÄÚ´æÖеÄÊý¾ÝÒ²ÊÇ·ÖÆ¬µÄ(partition)¡£ sparkĬÈÏÒÔ128MΪµ¥Î»¶ÁÈ¡Êý¾Ý£¬Èç¹ûÊý¾ÝСÓÚÕâ¸öÖµ»á°´Ò»¸ö·ÖƬ´æ´¢£¬Èç¹û´óÓÚÕâ¸öÖµ¾Í¼ÌÐøÍùÉÏÔö³¤·ÖƬ¡£ ±ÈÈçÒ»¸öÎļþµÄ´óСÊÇ130M£¬ spark¶ÁÈ¡ËüµÄʱºò»áÔÚÄÚ´æÖзֳÉÁ½¸öpartition(1¸ö128M£¬1¸ö2M)¡£ Èç¹ûÕâ¸öÎļþÌØ±ðС£¬Ö»ÓÐ10M£¬ÄÇËüÒ²»á±»µ±×öÒ»¸öpartition´æÔÚÄÚ´æÖС£ ËùÒÔÈç¹ûÒ»·ÝÊý¾Ý´æ·ÅÔÚHDFSÖУ¬Õâ¸öÊý¾ÝÊÇÓÉ10¸öÉ¢ÂäÔÚ¸÷¸ö½ÚµãµÄÎļþ×é³ÉµÄ¡£ ÄÇôsparkÔÚ¶ÁÈ¡µÄʱºò£¬¾Í»áÖÁÉÙÔÚÄÚ´æÖÐÓÐ10¸öpartition£¬ Èç¹ûÿ¸öÎļþµÄ´óС¶¼³¬¹ýÁË128M£¬partitionµÄÊýÁ¿»á¼ÌÐøÔö¼Ó¡£

¶øÔÚÖ´ÐмÆËãµÄʱºò£¬ÕâЩ´æ´¢ÔÚ¶à¸ö½ÚµãÄÚ´æÖеÄÊý¾Ý»á²¢·¢µÄÖ´ÐÐÊý¾Ý¼ÆËãÈÎÎñ¡£ Ò²¾ÍÊÇ˵ÎÒÃǵÄÊý¾ÝÊÇ´æ·ÅÔÚ¶à¸ö½ÚµãÖеÄÄÚ´æÖеģ¬ ÎÒÃÇΪÿһ¸öpartition¶¼Ö´ÐÐÒ»¸ö¼ÆËãÈÎÎñ¡£ ËùÒÔÎÒÃÇÕë¶ÔÒ»¸öÌØ±ð´óµÄÊý¾ÝµÄ¼ÆËãÈÎÎñ£¬ »áÊ×ÏȰÑÊý¾Ý°´partition¶ÁÈ¡µ½²»Í¬½ÚµãµÄ²»Í¬µÄÄÚ´æÖУ¬ Ò²¾ÍÊǰÑÊý¾Ý²ð·Ö³ÉºÜ¶àСµÄ·ÖƬ·ÅÔÚ²»Í¬»úÆ÷µÄÄÚ´æÖС£ È»ºó·Ö±ðÔÚÕâЩСµÄ·ÖƬÉÏÖ´ÐмÆËãÈÎÎñ¡£ ×îºóÔÙ¾ÛºÏÿ¸ö¼ÆËãÈÎÎñµÄ½á¹û¡£ Õâ¾ÍÊÇ·Ö²¼Ê½¼ÆËãµÄ»ù±¾Ô­Àí¡£ Èç¹ûÓÐͬѧ»¹ÊDZȽÏ㣬¿ìÈ¥·­Ö®Ç°ÎÒдµÄ3ƪsparkµÄ»ù´¡ÎÄÕ¡£

ÄÇôÕâ¸öʱºòÎÊÌâ¾ÍÀ´ÁË£¬ ÕâÖÖ°´partitionΪµ¥Î»µÄ·Ö²¼Ê½¼ÆËã¿ò¼Ü¡£partitionµÄÊýÁ¿¾ö¶¨×Ų¢·¢µÄÊýÁ¿¡£ ¿ÉÒÔÀí½âΪ£¬Èç¹ûÊý¾ÝÓÐ100¸öpartition£¬¾Í»áÓÐ100¸öÏß³ÌÕë¶ÔÕâ·ÝÊý¾Ý×ö¼ÆËãÈÎÎñ¡£ËùÒÔpartitionµÄÊýÁ¿´ú±í׿ÆËãµÄ²¢Ðг̶ȡ£ µ«ÊDz»ÊÇ˵partitionÔ½¶àÔ½ºÃ£¬Èç¹ûÃ÷Ã÷Êý¾Ý¾ÍºÜС£¬ ÎÒÃÇÈ´²ð·ÖÁË´óÁ¿µÄpartitionµÄ»°£¬·´¶øÊDZȽÏÂýµÄ¡£ ¶øÇÒËùÓÐ·ÖÆ¬µÄ¼ÆËã½á¹û×îºóÊÇÒª¾ÛºÏÔÚÒ»¸öµØ·½µÄ¡£ ÕâЩ¶¼»áÔì³ÉÍøÂçIOµÄ¿ªÏú(ÒòΪÊý¾ÝÊÇÔÚ²»Í¬µÄ½Úµã֮ǰ´«ÊäµÄ)¡£ ÓÈÆäÊÇÔÚ·Ö²¼Ê½¼ÆËãÖУ¬ÎÒÃÇÓÐshuffleÕâ¸öÐÔÄÜɱÊÖ(²»ÊìϤÕâ¸ö¸ÅÄîµÄͬѧÇë¿´ÎÒ֮ǰµÄÎÄÕÂ)¡£ ÔÚ´óÁ¿µÄ·ÖƬÏÂÖ´ÐÐshuffle½«»áÊÇÒ»¸öÔÖÄÑ£¬ÒòΪ´óÁ¿µÄÍøÂçIO»áµ¼Ö¼¯Èº´¦ÓںܸߵĸºÔØÉõÖÁ̱»¾¡£ ÎÒÃÇÔø¾­Åö¼û¹ýÖ»ÓÐ500Mµ«ÊÇÈ´ÓÐ7000¸ö·ÖƬµÄÊý¾Ý£¬ÄÇÒ»´ÎµÄ½á¹ûÊÇÕë¶ÔÕâ¸öÊý¾Ý²¢ÐÐÖ´ÐÐÁ˶à¸öETL³ÌÐòºó£¬Õû¸öhadoop¼¯ÈºÌ±»¾ÁË¡£ ÕâÊÇÔÚÊý¾ÝÔ¤´¦ÀíµÄʱºòÍü¼Ç×öreparation(ÖØÐÂ·ÖÆ¬)µÄ½á¹û¡£ ËùÒԺܶàºÜСµÄ£¬»òÕßÊÇË鯬»¯µÄÎļþÔÚHDFSÖÐÊÇÒ»¸öºÜÓ°ÏìÐÔÄܵÄÎÊÌâ¡£

ËùÒÔ˵ÁËÕâô¶àÎÒÃǵIJâÊÔµã¾ÍÀ´ÁË£¬ Õë¶Ô¸÷ÖÖETL³ÌÐò£¬ רÃÅÖÆÔìÕâÖÖÓµÓдóÁ¿·ÖƬµÄÊý¾Ý¡£±ÈÈç²âÊÔͬÑùµÄÊý¾ÝÁ¿£¬ µ«ÊÇ·ÖÆ¬·Ö±ðÊÇ100£¬500£¬1000¡£ ÑéÖ¤¸÷¸öETL³ÌÐòÔÚÕâÖÖÊý¾ÝϵıíÏÖ¡£

Êý¾ÝÇãб

ÔÚÎÒ֮ǰµÄÎÄÕÂÖн²¹ýʲôÊÇshuffleºÍÊý¾ÝÇãб¡£ÕâÀï¼òµ¥µÄ»Ø¹Ëһϡ£

ÔÚÉÏÃæµÄÈÎÎñ´¦ÀíÖгöÏÖÁËshuffleµÄ²Ù×÷¡£shuffleÒ²½ÐÏ´ÅÆ£¬ ÔÚÉÏÃæ½²partitionºÍ·Ö²¼Ê½¼ÆËãÔ­ÀíµÄʱºò£¬ÎÒÃÇÖªµÀ·Ö²¼Ê½¼ÆËã¾ÍÊǰÑÊý¾Ý»®·ÖºÜ¶à¸öÊý¾ÝƬ´æ·ÅÔںܶà¸ö²»Í¬µÄ½ÚµãÉÏ£¬ È»ºóÔÚÕâЩÊý¾ÝƬÉϲ¢·¢Ö´ÐÐͬÑùµÄ¼ÆËãÈÎÎñÀ´´ïµ½·Ö²¼Ê½¼ÆËãµÄÄ¿µÄ£¬ÕâЩÈÎÎñ»¥ÏàÊǶÀÁ¢µÄ£¬ ±ÈÈçÎÒÃÇÖ´ÐÐÒ»¸öcount²Ù×÷£¬ Ò²¾ÍÊǼÆËãÕâ¸öÊý¾ÝµÄÐÐÊý¡£ ʵ¼ÊµÄ²Ù×÷ÆäʵÊÇÕë¶Ôÿ¸öÊý¾Ý·ÖƬ£¬Ò²¾ÍÊÇpartition·Ö±ðÖ´ÐÐcountµÄ²Ù×÷¡£ ±ÈÈçÎÒÃÇÓÐ3¸ö·ÖƬ·Ö±ðÊÇA,B,C£¬ ÄÇÖ´ÐÐcountµÄʱºòÆäʵÊDz¢·¢3¸öỊ̈߳¬Ã¿¸öÏß³ÌÈ¥¼ÆËãÒ»¸öpartitionµÄÐÐÊý£¬ ËûÃǶ¼¼ÆËãÍê±Ïºó£¬ÔÙ»ã×ܵ½driver³ÌÐòÖУ¬ Ò²¾ÍÊÇA,B,CÕâÈý¸ö¼ÆËãÈÎÎñµÄ¼ÆËã¹ý³ÌÊDZ˴˶ÀÁ¢»¥²»¸ÉÈŵģ¬Ö»ÔÚ¼ÆËãÍê³Éºó½øÐоۺϡ£ µ«²¢²»ÊÇËùÓеļÆËãÈÎÎñ¶¼¿ÉÒÔÕâÑù¶ÀÁ¢µÄ£¬±ÈÈçÄãÒªÖ´ÐÐÒ»¸ögroupbyµÄsql²Ù×÷¡£ ¾ÍÏñÉÏÃæµÄͼÖУ¬ÎÒÒªÏȰÑÊý¾Ý°´µ¥´Ê·Ö×飬֮ºó²ÅÄÜ×öÆäËûµÄͳ¼Æ¼ÆË㣬 ±ÈÈçͳ¼Æ´ÊƵ»òÕ߯äËûÏà¹Ø²Ù×÷¡£ ÄÇôÊ×ÏÈsparkÒª×öµÄÊǸù¾ÝgroupbyµÄ×Ö¶Î×ö¹þÏ££¬ÏàֵͬµÄÊý¾Ý´«Ë͵½Ò»¸ö¹Ì¶¨µÄpartitionÉÏ¡£ ÕâÑù¾ÍÏñÉÏͼһÑù£¬ÎÒÃǰÑÊý¾ÝÖÐÓµÓÐÏàͬkeyÖµµÄÊý·ÖÅäµ½Ò»¸öpartition£¬ ÕâÑù´ÓÊý¾Ý·ÖƬÉϾͰÑÊý¾Ý½øÐзÖ×é¸ôÀë¡£ È»ºóÎÒÃÇҪͳ¼Æ´ÊƵµÄ»°£¬Ö»ÐèÒª²ÅÀ´Ò»¸öcount²Ù×÷¾Í¿ÉÒÔÁË¡£ shuffleµÄ³öÏÖÊÇΪÁ˼ÆËãÄܹ»¸ßЧµÄÖ´ÐÐÏÂÈ¥£¬ °ÑÏàËÆµÄÊý¾Ý¾ÛºÏµ½ÏàͬµÄpartitionÉϾͿÉÒÔ·½±ãÖ®ºóµÄ¼ÆËãÈÎÎñÒÀÈ»ÊǶÀÁ¢¸ôÀëµÄ²¢ÇÒ²»»á´¥·¢ÍøÂçIO¡£ ÕâÊÇ·½±ãºóÐø¼ÆËãµÄÉè¼ÆÄ£Ê½£¬Ò²¾ÍÊǽÚÊ¡Á˺óÐøÒ»ÏµÁмÆËãµÄ¿ªÏú¡£ µ«´ú¼ÛÊÇshuffle±¾ÉíµÄ¿ªÏú£¬¶øÇҺܶàÇé¿öÏÂshuffle±¾ÉíµÄ¿ªÏúÒ²ÊǺܴóµÄ¡£ ÓÈÆäÊÇshuffle»áÒòΪÊý¾ÝÇãб¶ø³öÏÖÖøÃûµÄ³¤Î²ÏÖÏó¡£

ºÃ£¬ ˵ÁËÕâô¶àÖÕÓÚ˵µ½Êý¾ÝÇãбÁË¡£ ¸ù¾ÝshuffleµÄÀíÂÛ£¬ÏàËÆµÄÊý¾Ý»á¾ÛºÏµ½Í¬Ò»¸öpartitionÉÏ¡£ µ«ÊÇÈç¹ûÎÒÃǵÄÊý¾Ý·Ö²¼²»¾ùÔÈ»á³öÏÖʲôÇé¿öÄØ£¿ ±ÈÈçÎÒÃÇÒªÕë¶ÔÖ°ÒµÕâ¸ö×Ö¶Î×ögroupbyµÄ²Ù×÷£¬ µ«ÊÇÈç¹û100WÐÐÊý¾ÝÖÐÓÐ90WÐеÄÊý¾Ý¶¼ÊdzÌÐòÔ±Õâ¸öÖ°ÒµµÄ»°£¬ »á³öÏÖʲôÇé¿ö£¿ Äã»á·¢ÏÖÓÐ90WÐеÄÊý¾Ý¶¼Åܵ½ÁËͬһ¸öpartitionÉÏÔì³ÉÒ»¸ö¾Þ´óµÄpartition¡£ÕâÑù¾ÍÎ¥±³ÁË·Ö²¼Ê½¼ÆËãµÄ³õÖÔ£¬ ·Ö²¼Ê½¼ÆËãµÄ³õÖÔ¾ÍÊǰÑÊý¾ÝÇзֳɺܶàµÄСÊý¾Ý·Ö²¼ÔÚ²»Í¬µÄ½ÚµãÄÚ´æÖУ¬ÀûÓöà¸ö½ÚµãµÄ²¢ÐмÆËãÄÜÁ¦À´¼ÓËÙ¼ÆËã¹ý³Ì¡£ µ«ÊÇÏÖÔÚÎÒÃǾø´ó²¿·ÖµÄÊý¾Ý¶¼»ã¾Ûµ½ÁËÒ»¸öpartitionÖУ¬ÕâÑù¾ÍÓÖ±ä³ÉÁ˵¥µã¼ÆËã¡£ ¶øÇÒÕâÀﻹÓÐÒ»¸öÌØ±ð´óµÄÎÊÌ⣬ ¾ÍÊÇÎÒÃÇÔÚÌá½»ÈÎÎñµ½hadoop yarnÉϵÄʱºò£¬ÉêÇëµÄ×ÊÔ´Êǹ̶¨ÇÐÆ½¾ù·ÖÅäµÄ¡£ ±ÈÈçÎÒÉêÇë10¸öcontainerÈ¥¼ÆËãÕâ·ÝÊý¾Ý£¬ÄÇÕâ10¸öcontainerµÄ×ÊÔ´ÊÇÏàµÈµÄ£¬ÄĸöÒ²²»¶à£¬ÄĸöÒ²²»ÉÙ¡£ µ«ÊÇÎÒÃǵÄÊý¾Ý·ÖƬµÄ´óСȴÊDz»Ò»ÑùµÄ£¬ ±ÈÈç90WÐÐµÄ·ÖÆ¬ÐèÒª5¸öGµÄÄڴ棬µ«ÊÇÆäËûµÄÊý¾Ý·ÖƬ¿ÉÄÜ1¸öG¾Í¹»ÁË¡£ ËùÒÔÈç¹ûÎÒÃDz»ÖªµÀÓÐÊý¾ÝÇãбµÄÇé¿ö³öÏÖ¶øµ¼ÖÂÉêÇëµÄ×ÊÔ´½ÌÉÙ£¬¾Í»áµ¼ÖÂÈÎÎñOOM¶ø¹Òµô¡£ ¶øÈç¹ûÎÒÃÇΪÁ˾޴óµÄÊý¾Ý·ÖƬΪÿ¸öcontainer¶¼ÉêÇëÁË5GµÄ×ÊÔ´£¬ ÄÇÓÖÔì³ÉÁË×ÊÔ´ÀË·Ñ¡£

Êý¾ÝÇãбºÍshuffleÊÇÒµ½ç¾­µäÄÑÌ⣬ºÜÄÑ´¦Àí¡£ Ôںܶà´óÊý¾Ý²úÆ·Öж¼»áÓиù¾ÝÊý¾Ý´óС×Ô¶¯µ÷ÕûÉêÇë×ÊÔ´µÄ¹¦ÄÜ¡£¶øÊý¾ÝÇãб¾ÍÊÇÕâÖÖ¹¦Äܾø¶ÔµÄÌìµÐ¡£ ´¦Àí²»ºÃµÄ»°£¬Òª²»»á±ä³ÉÉêÇë¹ý´ó×ÊÔ´³Å±¬¼¯Èº£¬Òª²»»áÉêÇë¹ýС×ÊÔ´µ¼ÖÂÈÎÎñ¹Òµô¡£ ¶øÎÒÃÇÔÚ²âÊÔ½×¶ÎÒª×öµÄ£¬¾ÍÊÇÄ£Äâ³öÕâÖÖÊý¾ÝÇãбµÄÊý¾Ý£¬ È»ºóÑéÖ¤ETL³ÌÐòµÄ±íÏÖ¡£

¿í±í

ºÃÁË£¬ÉÏÃæÁ½¸ö×îÄѽâÊ͵ÄÒѾ­½²ÍêÁË£¬ ¿í±í¾ÍºÜ¼òµ¥ÁË£¬ÁÐÊýÌ«¶àµÄ±í¾ÍÊÇ¿í±í¡£±ÈÈçÎÒ¼û¹ýµÄ×î¿íµÄ±íÊÇ1WÁеģ¬ ÓÈÆäÔÚ»úÆ÷ѧϰϵͳÖУ¬ ÓÉÓÚÒª³éÈ¡¸ßÎ¬ÌØÕ÷£¬ ËùÒÔÔÚETL½×¶Î¾­³£»á°ÑºÜ¶àµÄ±íÆ´½Ó³ÉÒ»¸öºÜ´óµÄ¿í±í¡£ÕâÖÖ¿í±íÊÇÊý¾Ý¿ÉÊÓ»¯µÄÌìµÐ£¬±ÈÈçÎÒÃǵŦÄÜÊÇ¿ÉÒÔËæ»úÔ¤ÀÀÒ»·ÝÊý¾ÝµÄ100ÐС£ ÄÇ100*1WÕâÑùµÄÊý¾ÝÁ¿Òª´«Ê䵽ǰ¶Ë²¢äÖȾ¾ÍÊǸöºÜ·ÑʵIJÙ×÷ÁË¡£ÓÈÆäÊÇÔ¤ÀÀ±¾ÉíÒ²ÊÇÒªÖ´ÐÐһЩ¼ÆËãµÄ¡£Èç¹û¼ÓÉÏÕâ·ÝÊý¾Ý±¾À´¾ÍÓк£Á¿·ÖƬµÄ»°£¬ ÒªÔÚºǫ́´ò¿ªÕâô¶àµÄÎļþ£¬ÔÙ¼ÓÉ϶ÁÈ¡Õâô¿íµÄ±íµÄÊý¾Ý¡£ ÉõÖÁÓпÉÄÜOOM£¬ ʵ¼ÊÉÏÎÒҲȷʵ¼û¹ýÒòΪÕâ¸öÔ­ÒòOOMµÄ¡£ ËùÒÔÕâ¸ö²âÊÔµã¾ÍÊÇÎÒÃǹÊÒâÈ¥ÔìÕâÑùµÄ¿í±í½øÐвâÊÔ¡£

ÆäËûµÄÊý¾ÝÀàÐͲ»Ò»Ò»½âÊÍÁË£¬ ¶¼¸ú×ÖÃæµÄÒâ˼²î²»¶à¡£

ÔìÊý

¼ÈÈ»ÎÒÃÇÖªµÀÁËÔÚ²âÊÔµÄʱºòÒªÓø÷ÖÖ²»Í¬µÄÊý¾Ý½øÐвâÊÔ£¬ËùÒÔÎÒÃDZØÈ»ÒªÓÐÒ»¿îÔìÊý¹¤¾ßÀ´°ïÎÒ´´½¨ÕâЩÊý¾Ý¡£ ÕâÀïÑ¡ÐÍÉÏÎÒʹÓõÄÒ²ÊÇspark¡£ Ö®ËùÒÔҲʹÓÃsparkÕâÖÖ·Ö²¼Ê½¿ò¼ÜÀ´ÔìÊý£¬¶ø²»Êǵ¥¶ÀʹÓÃparquet»òÕßhdfsµÄclientÊÇÒòΪÎÒÃÇÔìµÄÊý¾Ý³ýÁËÒª·ûºÏһЩ¼«¶Ë³¡¾°Í⣬ҲҪ±£Ö¤ÒªÓÐ×ã¹»µÄÊý¾ÝÁ¿£¬ ±Ï¾¹ETL¶¼ÊÇÃæ¶Ô´óÊý¾Ý³¡¾°µÄ¡£ ËùÒÔÀûÓÃsparkµÄ·Ö²¼Ê½¼ÆËãµÄÓÅÊÆ¿ÉÒÔÔÚ¶Ìʱ¼äÄÚ´´½¨´óÁ¿Êý¾Ý¡£ ±ÈÈçÎÒǰÁ½ÌìÔì¹ýÒ»¸ö1ÒÚÐУ¬60¸öGµÄÊý¾Ý£¬Ö»ÓÃÁË20·ÖÖÓ¡£

¼¼Êõϸ½Ú

¿´¹ýÎÒ֮ǰ3ƪÎÄÕµÄͬѧӦ¸Ã¶¼ÖªµÀRDDÊÇʲôÁË£¬RDDÊÇsparkµÄ·Ö²¼Ê½Êý¾Ý½á¹¹¡£ ÎÒÃǸղÅ˵µÄÒ»·ÝÊý¾Ý±»spark¶ÁÈ¡ºó»á¾ÍÉú³ÉÒ»¸öRDD£¬µ±È»RDD¾Í°üº¬ÁËÄÇЩpartition¡£ ÎÒÃÇ´´½¨RDDµÄ·½Ê½ÓÐÁ½ÖÖ£¬ Ò»ÖÖÊÇ´ÓÒ»¸öÒÑÓеÄÎļþÖжÁÈ¡RDD£¬µ±È»Õâ²»ÊÇÎÒÃÇÏëÒªµÄЧ¹û¡£ ËùÒÔÎÒÃÇʹÓõڶþÖÖ£¬ ´ÓÄÚ´æÖеÄÒ»¸öListÖÐÉú³ÉRDD¡£ ÈçÏ£º

public class Demo {
public static void main(String[] args) {
SparkConf conf = new SparkConf().setAppName("data produce")
.setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf);
SparkSession spark = SparkSession
.builder()
.appName("Java Spark SQL basic example")
.getOrCreate();
List data = new XRange(1000);
JavaRDD distData = sc.parallelize(data, 100);

ÉÏÃæÊÇÎÒдµÄÒ»¸ödemo£¬Ç°Ãæ³õʼ»¯spark confºÍspark sessionµÄ´úÂë¿ÉÒÔÏȺöÂÔ²»Óùܡ£ Ö÷Òª¿´×îºóÁ½ÐУ¬ XRangeÊÇÎÒ·ÂÕÕpythonµÄxrangeÉè¼ÆµÄÀà¡£ ¿ÉÒÔ°ïÎÒÓÃÀàËÆÉú³ÉÆ÷µÄÔ­Àí´´½¨Ò»¸ö´øÓÐindexÐòÁеÄList¡£ ÆäʵÕâÀïÎÒÃÇÊÖ¶¯´´½¨Ò»¸ölistÒ²ÐС£ ¶ø×îºóÒ»ÐоÍÊÇÎÒÃÇͨ¹ýsparkµÄAPI°ÑÒ»¸öListת»»³ÉÒ»¸öRDD¡£sc.parallelizeµÄµÚÒ»¸ö²ÎÊýÊÇList£¬¶øµÚ¶þ¸ö²ÎÊý¾ÍÊÇÄãÒªÉèÖõIJ¢Ðжȣ¬ Ò²¿ÉÒÔÀí½âΪÄãÒªÉú³ÉÕâ¸öÊý¾ÝµÄpartitionµÄÊýÁ¿¡£ ÆäʵÈç¹ûÎÒÃÇÏÖÔÚÏëÉú³ÉÕâһǧÐеÄÖ»ÓÐindexµÄÊý¾ÝµÄ»°£¬ ÔÙµ÷ÓÃÕâÑùÒ»¸öAPI¾Í¿ÉÒÔÁË£ºdistData.saveAsTextFile("path"); ͨ¹ýÕâÑùÒ»¸öAPI¾Í¿ÉÒÔÖ±½Ó±£´æÎļþÁË¡£ µ±È»ÕâÑù¿Ï¶¨²»ÊÇÎÒÃÇÏëÒªµÄ£¬ÒòΪÀïÃæ»¹Ã»ÓÐÎÒÃÇÒªµÄÊý¾Ý¡£ ËùÒÔÕâ¸öʱºòÎÒÃÇÒª³ö¶¯sparkµÄÒ»¸ö¸ß¼¶½Ó¿Ú£¬dataframe¡£ dataframeÊÇspark·ÂÕÕpandasµÄdataframeµÄÉè¼Æ¿ª·¢µÄ¸ß¼¶API¡£ ¹¦ÄܸúpandasºÜÏñ£¬ ÎÒÃÇ¿ÉÒÔ°ÑÒ»¸ödataframe¾Íµ±×öÒ»¸ö±íÀ´¿´£¬ ¶øËüÒ²ÓкܶàºÃÓõÄAPI¡£ ×îÖØÒªµÄÊÇÎÒÃÇÓÐÒ»¸öDataframeWriterÀàרÃÅÓÃÀ´½²dataframe±£´æ³É¸÷ÖÖ¸÷Ñù¸ñʽºÍ·ÖÇøµÄÊý¾ÝµÄ¡£ ±ÈÈç¿ÉÒԺܷ½±ãµÄ±£´æÎªscv£¬txtÕâÖÖ´«Í³Êý¾Ý£¬ ¿ÉÒԺܷ½±ã±£´æ³ÉparquetºÍorcÕâÖÖÁÐʽ´æ´¢µÄÎļþ¸ñʽ¡£ Ò²Ìṩpartition byµÄ²Ù×÷À´±£´æ³É·ÖÇø±í»òÕßÊÇ·ÖͰ±í¡£×ÜÖ®ËüÄܹ»°ïÎÒÃÇÔì³ö¸÷ÖÖÎÒÃÇÐèÒªµÄÊý¾Ý¡£ ÄÇôÎÒÃÇÈçºÎ°ÑÒ»¸öRDDת»»³ÉÎÒÃÇÐèÒªµÄdataframe²¢Ìî³ä½øÎÒÃÇÐèÒªµÄÊý¾ÝÄØ¡£ ÍùÏ¿´£º

List<StructField> fields = new ArrayList<>();
String schemaString = "name,age";
fields.add(DataTypes.createStructField("name",
DataTypes.StringType, true));
fields.add(DataTypes.createStructField("age",
DataTypes.IntegerType, true));
StructType schema = DataTypes.createStructType(fields);


// Convert records of the RDD (people) to Rows
JavaRDD rowRDD = distData.map( record ->{
RandomStringField randomStringField = new
RandomStringField();
randomStringField.setLength(10); BinaryIntLabelField
binaryIntLabelField = new
BinaryIntLabelField();
return RowFactory.create(randomStringField.gen(),
binaryIntLabelField.gen());
});
Dataset dataset =spark.createDataFrame(rowRDD, schema);
dataset.persist();
dataset.show();
DataFrameWriter writer = new DataFrameWriter(dataset);
writer.mode(SaveMode.Overwrite).partitionBy("age").
parquet("/Users/sungaofei/gaofei");

dataframeÖÐÿһ¸öÊý¾Ý¶¼ÊÇÒ»ÐУ¬Ò²¾ÍÊÇÒ»¸öRow¶ÔÏ󣬶øÇÒdataframe¶ÔÓÚÿһÁÐÒ²¾ÍÊÇÿ¸öschemaÓÐ×ÅÑϸñµÄÒªÇó¡£ ÒòΪËüÊÇÒ»¸ö±íô¡£ËùÒÔ¸úÊý¾Ý¿âµÄ±í»òÕßpandasÖеıíÊÇÒ»ÑùµÄ¡£Òª¹æ¶¨ºÃÿһÁеÄschemaÒÔ¼°Ã¿Ò»ÐеÄÊý¾Ý¡£ ËùÒÔÊ×ÏÈÎÒÃÇÏȶ¨ÒåºÃschema£¬ ¶¨Òåÿ¸öschemaµÄÁÐÃûºÍÊý¾ÝÀàÐÍ¡£ È»ºóͨ¹ýDataTypesµÄAPI´´½¨schema¡£ ÕâÑùÎÒÃǵÄÁÐÐÅÏ¢¾ÍÓÐÁË¡£ È»ºóÊǹؼüµÄÎÒÃÇÈçºÎ°ÑÒ»¸öRDDת»»³ÉdataframeÐèÒªµÄRow²¢ÇÒÌî³äºÃÿһÐеÄÊý¾Ý¡£ ÕâÀïÎÒÃÇʹÓÃRDDµÄmap·½·¨£¬ ÆäʵdataframeÒ²ÊÇÒ»¸öÌØÊâµÄRDD£¬ Õâ¸öRDDÀïµÄÿһÐж¼ÊÇÒ»¸öROW¶ÔÏó¶øÒÑ¡£ ËùÒÔÎÒÃÇʹÓÃRDDµÄmap·½·¨À´Ìî³äÎÒÃÇÿһÐеÄÊý¾Ý²¢°ÑÕâÒ»ÐÐÊý¾Ýת»»³ÉRow¶ÔÏó¡£

JavaRDD rowRDD = distData.map( record ->{
RandomStringField randomStringField = new RandomStringField();
randomStringField.setLength(10);

BinaryIntLabelField binaryIntLabelField = new BinaryIntLabelField();
return RowFactory.create(randomStringField.gen(), binaryIntLabelField.gen());
});

ÒòΪ֮ǰ¶¨ÒåschemaµÄʱºòÖ»¶¨ÒåÁËÁ½ÁУ¬ ·Ö±ðÊÇnameºÍage¡£ ËùÒÔÔÚÕâÀïÎÒ·Ö±ðÓÃÒ»¸öËæ»úÉú³ÉStringÀàÐ͵ÄÀàºÍËæ»úÉú³ÉintÀàÐ͵ÄÀàÀ´Ìî³äÊý¾Ý¡£ ×îºóʹÓÃRowFactory.create·½·¨À´°ÑÕâÁ½¸öÊý¾ÝÉú³ÉÒ»¸öRow¡£ map·½·¨Æäʵ¾ÍÊÇÈÃʹÓÃÕß´¦ÀíÿһÐÐÊý¾ÝµÄ·½·¨£¬ recordÕâ¸ö²ÎÊý¾ÍÊǰÑÐÐÊý¾Ý×÷Ϊ²ÎÊý¸øÎÒÃÇʹÓᣠµ±È»Õâ¸öÀý×ÓÀïԭʼRDDµÄÿһÐж¼Êǵ±³õÉú³ÉListµÄʱºò³õʼ»¯µÄindexÐòºÅ¡£ ¶øÎÒÃÇÏÖÔÚ²»ÐèÒªËü£¬ ËùÒÔÒ²¾ÍûÓÐʹÓᣠֱ½Ó·µ»ØËæ»ú×Ö·û´®ºÍintÀàÐ͵ÄÊý¡£ È»ºóÎÒÃÇÓÐÁËÕâ¸öÿһÐÐÊý¾Ý¶¼ÊÇRow¶ÔÏóµÄRDDºó¡£ ¾Í¿ÉÒÔͨ¹ýµ÷ÓÃÏÂÃæµÄAPIÀ´Éú³Édataframe¡£

Dataset dataset =spark.createDataFrame(rowRDD, schema);

·Ö±ð°ÑrowºÍschema´«µÝ½øÈ¥£¬Éú³ÉdataframeµÄ±í¡£ ×îºóÀûÓÃDataFrameWriter±£´æÊý¾Ý¡£

ºÃÁË£¬ Õâ¾ÍÊÇÔìÊýµÄ»ù±¾Ô­ÀíÁË£¬ ÆäʵҲÊÇÂù¼òµ¥µÄ¡£ µ±È»Òª×öµ½Ñϸñ¿ØÖÆÊý¾Ý·Ö²¼£¬Êý¾ÝÀàÐÍ£¬ÌØÕ÷ά¶ÈµÈµÈ¾ÍÐèÒª×öºÜ¶àÌØÊâµÄ´¦Àí¡£ ÕâÀï¾Í²»Õ¹¿ªÏ¸½ÚÁË¡£

²âÊÔETL´¦ÀíµÄÕýÈ·ÐÔ

¸Õ²ÅÒ»Ö±ÔÚ˵µÄÊÇÈçºÎÉú³ÉÊý¾ÝÀ´²âÊÔETL³ÌÐòÊÇ·ñÄܹ»Õý³£´¦Àí¸÷ÖÖ²»Í¬ÀàÐ͵ÄÊý¾ÝµÄ¡£ ÄÇôÏÂÃæÒª½²µÄ¾ÍÊÇÈçºÎ²âÊÔ´¦ÀíETL³ÌÐòµÄÕýÈ·ÐÔÁË¡£ Ò²¾ÍÊÇËüÊÇ·ñ°´ÎÒÃÇÆÚÍûµÄÂß¼­½«Êý¾Ý½øÐÐÇåÏ´£¬ÌáÈ¡£¬Æ´½ÓµÈ²Ù×÷¡£ Ò²¼´ÊÇ˵ÕâÊǹ¦ÄܲâÊÔ£¬ Ô­ÀíÉϸúÎÒÃÇ´«Í³µÄ²âÊÔ˼·ÊÇÒ»ÑùµÄ¡£ ÊäÈëÒ»·ÝÊý¾Ý£¬È»ºóÅжÏÊä³öµÄÊý¾ÝÊÇ·ñÊÇÕýÈ·µÄ¡£ Ö»²»¹ýÎÒÃÇÕâÊÇÔÚ´óÊý¾ÝÁ¿ÏµĴ¦ÀíºÍ²âÊÔ£¬ÊäÈëµÄÊý¾ÝÊÇ´óÊý¾Ý£¬ELTÊä³öµÄÒ²ÊÇ´óÊý¾Ý£¬ ËùÒÔ¾ÍÐèҪһЩеIJâÊÔÊֶΡ£ ÆäʵÕâ¸ö²âÊÔÊÖ¶ÎҲûʲôÐÂÆæµÄÁË£¬ ÊÇÎÒÃǸղÅÒ»Ö±ÔÚ½²µÄ¼¼Êõ£¬Ò²¾ÍÊÇsparkÕâÖÖ·Ö²¼Ê½¼ÆËã¿ò¼Ü¡£ ÎÒÃÇÒÔsparkÈÎÎñÀ´²âÊÔÕâЩETL³ÌÐò£¬ÕâͬÑùÒ²ÊÇΪÁ˲âÊÔ×ÔÉíµÄЧÂʺÍÐÔÄÜ¡£ Èç¹ûµ¥´¿Ê¹ÓÃhdfs clientÀ´¶ÁÈ¡ÎļþµÄ»°£¬ ɨÃèÄÇô´óµÄÊý¾ÝÁ¿ÊǺܺÄʱµÄ£¬ÕâÊÇÎÒÃDz»ÄܽÓÊܵġ£ ËùÒÔÎÒÃÇÀûÓôóÊý¾Ý¼¼ÊõÀ´²âÊÔ´óÊý¾Ý¹¦ÄܾͳÉΪÁ˱ØÈ»¡£ µ±È»Ò²ÐíÓÐЩͬѧ»áÈÏΪÎÒÖ»ÊDzâÊÔ¹¦ÄÜô£¬ÓÖ²»ÊDzâÊÔËã·¨µÄ´¦ÀíÐÔÄÜ£¬Ã»±ØÒªÊ¹ÓÃÄÇô´óµÄÊý¾ÝÁ¿¡£ ÎÒÃÇÓÃСһµãµÄÊý¾Ý£¬±ÈÈçÒ»°ÙÐеÄÊý¾Ý¾Í¿ÉÒÔÁË¡£ µ«ÆäʵÕâÒ²ÊDz»¶ÔµÄ£¬ ÒòΪÔÚ·Ö²¼Ê½¼ÆËãÖУ¬ ´óÊýÁ¿ºÍСÊý¾ÝÁ¿µÄ´¦Àí½á¹û¿ÉÄܲ»ÊÇÍêȫһÖµģ¬ ±ÈÈçËæ»ú²ð·ÖÊý¾ÝÕâÖÖ³¡¾°ÔÚ´óÊý¾ÝÁ¿Ï¿ÉÄܲÅÄܲâÊÔ³öbug¡£ ¶øÇÒ´óÊý¾Ý²âÊÔ»¹ÓÐÁíÍâÒ»ÖÖ³¡¾°¾ÍÊÇÊý¾Ý¼à¿Ø£¬ ¶¨ÆÚµÄɨÃèÏßÉÏÊý¾Ý£¬ÑéÖ¤ÏßÉÏÊý¾ÝÊÇ·ñ³öÏÖÒì³£¡£ ÕâÒ²ÊÇÒ»ÖÖ²âÊÔ³¡¾°£¬¶øÇÒÏßÉϵÄÊý¾ÝÒ»¶¨ÊǺ£Á¿µÄ¡£

·Ï»°²»¶à˵£¬Ö±½Ó¿´ÏÂÃæµÄ´úÂëÆ¬¶Î¡£

@Features(Feature.ModelIde)
@Stories(Story.DataSplit)
@Description("ʹÓÃpysparkÑéÖ¤Ëæ»ú²ð·ÖÖеķֲã²ð·Ö")
@Test
public void dataRandomFiledTest(){
String script = "# coding: UTF-8\n" +
"# input script according to definition of \"run\" interface\n" +
"from trailer import logger\n" +
"from pyspark import SparkContext\n" +
"from pyspark.sql import SQLContext\n" +
"\n" +
"\n" +
"def run(t1, t2, context_string):\n" +
" # t2ΪԭʼÊý¾Ý£¬ t1Ϊ¾­¹ýÊý¾Ý²ð·ÖËã×Ó¸ù¾Ý×ֶηֲã²ð·ÖºóµÄÊý¾Ý\n" +
" # ÓÉÓÚÊý¾Ý²ð·ÖÊǸù¾Ýcol_20ÕâÒ»ÁнøÐеķֲã²ð·Ö£¬ ËùÒÔÔÚÕâÀï·Ö±ð\n" +
" # ¶ÔÕâ2·ÝÊý¾Ý½øÐзÖ×鲢ͳ¼ÆÃ¿Ò»¸ö·Ö×éµÄ¼ÆÊý¡£ÓÉÓÚÕâÒ»ÁÐÊÇlabel\n" +
" # ËùÒÔÆäʵֻÓÐÁ½¸ö·Ö×飬·Ö±ðÊÇ0ºÍ1\n" +
" t2_row = t2.groupby(t2.col_20).agg({\"*\" : \"count\"}).cache()\n" +
" t1_row = t1.groupby(t1.col_20).agg({\"*\" : \"count\"}).cache()\n" +
" \n" +
" \n" +
" t2_0 = t2_row.filter(t2_row.col_20 == 1).collect()[0][\"count(1)\"]\n" +
" t2_1 = t2_row.filter(t2_row.col_20 == 0).collect()[0][\"count(1)\"]\n" +
" \n" +
" t1_0 = t1_row.filter(t1_row.col_20 == 1).collect()[0][\"count(1)\"]\n" +
" t1_1 = t1_row.filter(t1_row.col_20 == 0).collect()[0][\"count(1)\"]\n" +
" \n" +
" # Êý¾Ý²ð·ÖËã×ÓÊǸù¾Ý×ֶΰ´ÕÕ1:1µÄ±ÈÀý½øÐвð·ÖµÄ¡£ËùÒÔt1ºÍt2µÄÿһ¸ö·Ö×é\n" +
" # ¶¼Ó¦¸ÃÖ»ÓÐԭʼÊý¾ÝÁ¿µÄÒ»°ë\n" +
" if t2_0/2 - t1_0 >1:\n" +
" raise RuntimeError(\"the 0 class is not splited correctly\")\n" +
" \n" +
" if t2_1/2 - t1_1 >1:\n" +
" raise RuntimeError(\"the 1 class is not splited correctly\")\n" +
"\n" +
" return [t1]";

ÎÒÃÇÓÃÀ´É¨ÃèÊý¾Ý±íµÄAPIÈÔÈ»ÊÇÎÒÃÇ֮ǰÌáµ½µÄdataframe¡£ÉÏÃæµÄ´úÂëÆ¬¶ÎÊÇÎÒÃÇǶÈësparkÈÎÎñµÄ½Å±¾¡£ ÀïÃæt1ºÍt2¶¼ÊÇdataframe£¬ ·Ö±ð´ú±íԭʼÊý¾ÝºÍ¾­¹ýÊý¾Ý²ð·ÖËã·¨²ð·ÖºóµÄÊý¾Ý¡£ ²âÊԵŦÄÜÊÇ·Ö²ã²ð·Ö¡£ Ò²¾ÍÊǰ´Ä³Ò»Áа´±ÈÀý³éÈ¡Êý¾Ý¡£ ±ÈÈç˵100WÐеÄÊý¾Ý£¬ÎÒ°´jobÕâ¸ö×ֶηֲã²ð·Ö£¬ ÎÒÒªÇóµÄ±ÈÀýÊÇ30%¡£ Ò²¼´ÊÇ˵ÿÖÖÖ°Òµ³éÈ¡30%µÄÊý¾Ý³öÀ´£¬Ï൱ÓÚÕâÊÇÒ»¸öÊý¾Ý²ÉÑùµÄ¹¦ÄÜ¡£ OK£¬ ËùÒÔÔÚ²âÊԽű¾ÖУ¬ÎÒÃÇ·Ö±ðÏȰÑԭʼ±íºÍ¾­¹ý²ÉÑùµÄ±í°´ÕâÒ»ÁнøÐзÖ×é²Ù×÷£¬ Ò²¾ÍÊÇgroupby(col_20)¡£ ÕâÀïÎÒÑ¡ÔñµÄÊǰ´col_20½øÐзֲã²ð·Ö¡£ ¸ù¾Ý¸Õ²Å½²µÄÕâÑùµÄ·Ö×é²Ù×÷ºó»á´¥·¢shuffle£¬°ÑÓÐÏàְͬҵµÄÊý¾Ý´«µ½Ò»¸öÊý¾Ý·ÖƬÉÏ¡£ È»ºóÎÒÃÇ×öcountÕâÖÖ²Ù×÷ͳ¼ÆÃ¿Ò»¸ö×éµÄÐÐÊý¡£ ÒòΪÕâ¸öËã·¨ÎÒÊǰ´1£º1²ð·ÖµÄ£¬Ò²¾ÍÊǰ´50%²ÉÑù¡£ ËùÒÔ×îºóÎÒÒªÑéÖ¤²ð·ÖºóµÄÊý¾ÝµÄÿһ×éµÄÐÐÊý¶¼ÊÇԭʼÊý¾ÝÖиÃ×éµÄÒ»°ë¡£

ÄÇôÉÏÃæ¾ÍÊÇÒ»¸ö¼òµ¥µÄETLµÄ²âÊÔ³¡¾°ºÍ²âÊԽű¾ÁË¡£

½áβ

ÏÈдµ½ÕâÀï°É£¬²»ÔçÁË¡£ ×î½ü×ܰ¾Ò¹£¬ ÉíÌå¿ì¿¸²»×¡ÁË¡£ ³Ã×ÅÖÜÄ©ÎÒÔç˯»á¡£

 
   
2206 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù