±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËʲôÊÇ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µÄ²âÊÔ³¡¾°ºÍ²âÊԽű¾ÁË¡£
½áβ
ÏÈдµ½ÕâÀï°É£¬²»ÔçÁË¡£ ×î½ü×ܰ¾Ò¹£¬ ÉíÌå¿ì¿¸²»×¡ÁË¡£ ³Ã×ÅÖÜÄ©ÎÒÔç˯»á¡£
|