ÓÉÓÚSpark GraphXÐÔÄÜÁ¼ºÃ£¬ÓÖÓзḻµÄ¹¦ÄܺÍÔËËã·û£¬ÄÜÔÚº£Á¿Êý¾ÝÉÏ×ÔÈçÔËÐи´ÔÓµÄͼËã·¨£¬ÌÔ±¦³¢ÊÔ½«Ëü×÷Ϊ·Ö²¼Ê½Í¼¼ÆËãÆ½Ì¨£¬½øÐи÷ÖÖËã·¨³¢ÊÔºÍÉú²úÓ¦Óᣱ¾ÎĽáºÏGraphXµÄÔÀíºÍÌØµã£¬·ÖÏíÆäÔÚÌÔ±¦µÄÓ¦ÓÃʵ¼ù¡£
ÔçÔÚ0.5°æ±¾£¬Spark¾Í´øÁËÒ»¸öСÐ͵ÄBagelÄ£¿é£¬ÌṩÁËÀàËÆPregelµÄ¹¦ÄÜ¡£µ±È»£¬Õâ¸ö°æ±¾»¹·Ç³£Ôʼ£¬ÐÔÄܺ͹¦Äܶ¼±È½ÏÈõ£¬ÊôÓÚʵÑéÐͲúÆ·¡£µ½0.8°æ±¾Ê±£¬¼øÓÚÒµ½ç¶Ô·Ö²¼Ê½Í¼¼ÆËãµÄÐèÇóÈÕÒæ¼ûÕÇ£¬Spark¿ªÊ¼¶ÀÁ¢Ò»¸ö·ÖÖ§Graphx-Branch£¬×÷Ϊ¶ÀÁ¢µÄͼ¼ÆËãÄ£¿é£¬½è¼øGraphLab£¬¿ªÊ¼Éè¼Æ¿ª·¢GraphX¡£ÔÚ0.9°æ±¾ÖУ¬Õâ¸öÄ£¿é±»Õýʽ¼¯³Éµ½Ö÷¸É£¬ËäÈ»ÊÇAlpha°æ±¾£¬µ«ÒÑ¿ÉÒÔÊÔÓã¬Ð¡Ãæ°üȦBagel¸æ±ðÎę̀¡£1.0°æ±¾£¬GraphXÕýʽͶÈëÉú²úʹÓá£
ÖµµÃ×¢ÒâµÄÊÇ£¬GraphXĿǰÒÀÈ»´¦ÓÚ¿ìËÙ·¢Õ¹ÖУ¬´Ó0.8µÄ·ÖÖ§µ½0.9ºÍ1.0£¬Ã¿¸ö°æ±¾´úÂë¶¼Óв»ÉٵĸĽøºÍÖØ¹¹¡£¸ù¾Ý¹Û²ì£¬ÔÚûÓиÄÈκδúÂëÂß¼ºÍÔËÐл·¾³£¬Ö»ÊÇÉý¼¶°æ±¾¡¢Çл»½Ó¿ÚºÍÖØÐ±àÒëµÄÇé¿öÏ£¬Ã¿¸ö°æ±¾ÓÐ10%~20%µÄÐÔÄÜÌáÉý¡£ËäÈ»ºÍGraphLabµÄÐÔÄÜ»¹ÓÐÒ»¶¨²î¾à£¬µ«Æ¾½èSparkÕûÌåÉϵÄÒ»Ì廯Á÷Ë®Ïß´¦Àí£¬ÉçÇøÈÈÁҵĻîÔ¾¶È¼°¿ìËٸĽøËÙ¶È£¬GraphX¾ßÓÐÇ¿´óµÄ¾ºÕùÁ¦¡£
·Ö²¼Ê½Í¼¼ÆËã
ÔÚÕýʽ½éÉÜGraphX֮ǰ£¬ÏÈ¿´¿´Í¨Óõķֲ¼Ê½Í¼¼ÆËã¿ò¼Ü¡£¼òµ¥À´Ëµ£¬·Ö²¼Ê½Í¼¼ÆËã¿ò¼ÜµÄÄ¿µÄ£¬Êǽ«¶ÔÓÚ¾ÞÐÍͼµÄ¸÷ÖÖ²Ù×÷°üװΪ¼òµ¥µÄ½Ó¿Ú£¬È÷ֲ¼Ê½´æ´¢¡¢²¢ÐмÆËãµÈ¸´ÔÓÎÊÌâ¶ÔÉϲã͸Ã÷£¬´Ó¶øÊ¹¸´ÔÓÍøÂçºÍͼËã·¨µÄ¹¤³Ìʦ£¬¸ü¼Ó¾Û½¹ÔÚͼÏà¹ØµÄÄ£ÐÍÉè¼ÆºÍʹÓÃÉÏ£¬¶ø²»ÓùØÐĵײãµÄ·Ö²¼Ê½Ï¸½Ú¡£ÎªÁËʵÏÖ¸ÃÄ¿µÄ£¬ÐèÒª½â¾öÁ½¸öͨÓÃÎÊÌ⣺ͼ´æ´¢Ä£Ê½ºÍͼ¼ÆËãģʽ¡£
ͼ´æ´¢Ä£Ê½
¾ÞÐÍͼµÄ´æ´¢×ÜÌåÉÏÓб߷ָîºÍµã·Ö¸îÁ½ÖÖ´æ´¢·½Ê½¡£2013Ä꣬GraphLab2.0½«Æä´æ´¢·½Ê½Óɱ߷ָî±äΪµã·Ö¸î£¬ÔÚÐÔÄÜÉÏÈ¡µÃÖØ´óÌáÉý£¬Ä¿Ç°»ù±¾Éϱ»Òµ½ç¹ã·º½ÓÊܲ¢Ê¹Óá£
±ß·Ö¸î£ºÃ¿¸ö¶¥µã¶¼´æ´¢Ò»´Î£¬µ«Óеı߻ᱻ´ò¶Ï·Öµ½Á½Ì¨»úÆ÷ÉÏ¡£ÕâÑù×öµÄºÃ´¦ÊǽÚÊ¡´æ´¢¿Õ¼ä£»»µ´¦ÊǶÔͼ½øÐлùÓڱߵļÆËãʱ£¬¶ÔÓÚÒ»ÌõÁ½¸ö¶¥µã±»·Öµ½²»Í¬»úÆ÷ÉϵıßÀ´Ëµ£¬Òª¿ç»úÆ÷ͨÐÅ´«ÊäÊý¾Ý£¬ÄÚÍøÍ¨ÐÅÁ÷Á¿´ó¡£
µã·Ö¸î£ºÃ¿Ìõ±ßÖ»´æ´¢Ò»´Î£¬¶¼Ö»»á³öÏÖÔÚһ̨»úÆ÷ÉÏ¡£ÁÚ¾Ó¶àµÄµã»á±»¸´ÖƵ½¶ą̀»úÆ÷ÉÏ£¬Ôö¼ÓÁË´æ´¢¿ªÏú£¬Í¬Ê±»áÒý·¢Êý¾Ýͬ²½ÎÊÌâ¡£ºÃ´¦ÊÇ¿ÉÒÔ´ó·ù¼õÉÙÄÚÍøÍ¨ÐÅÁ¿¡£
ËäÈ»Á½ÖÖ·½·¨»¥ÓÐÀû±×£¬µ«ÏÖÔÚÊǵã·Ö¸îÕ¼ÉϷ磬¸÷ÖÖ·Ö²¼Ê½Í¼¼ÆËã¿ò¼Ü¶¼½«×Ô¼ºµ×²ãµÄ´æ´¢ÐÎʽ±ä³ÉÁ˵ã·Ö¸î¡£Ö÷ÒªÔÒòÓÐÒÔÏÂÁ½¸ö¡£
- ´ÅÅ̼۸ñϽµ£¬´æ´¢¿Õ¼ä²»ÔÙÊÇÎÊÌ⣬¶øÄÚÍøµÄͨÐÅ×ÊԴûÓÐÍ»ÆÆÐÔ½øÕ¹£¬¼¯Èº¼ÆËãʱÄÚÍø´ø¿íÊDZ¦¹óµÄ£¬Ê±¼ä±È´ÅÅ̸üÕä¹ó¡£Õâµã¾ÍÀàËÆÓÚ³£¼ûµÄ¿Õ¼ä»»Ê±¼äµÄ²ßÂÔ¡£
- ÔÚµ±Ç°µÄÓ¦Óó¡¾°ÖУ¬¾ø´ó¶àÊýÍøÂç¶¼ÊÇ¡°Î޳߶ÈÍøÂ硱£¬×ñÑÃÝÂÉ·Ö²¼£¬²»Í¬µãµÄÁÚ¾ÓÊýÁ¿Ïà²î·Ç³£ÐüÊâ¡£¶ø±ß·Ö¸î»áʹÄÇЩ¶àÁھӵĵãËùÏàÁ¬µÄ±ß´ó¶àÊý±»·Öµ½²»Í¬µÄ»úÆ÷ÉÏ£¬ÕâÑùµÄÊý¾Ý·Ö²¼»áʹµÃÄÚÍø´ø¿í¸ü¼Ó×½½ó¼ûÖ⣬ÓÚÊÇ±ß·Ö¸î´æ´¢·½Ê½±»½¥½¥ÅׯúÁË¡£
ͼ¼ÆËãÄ£ÐÍ
ĿǰµÄͼ¼ÆËã¿ò¼Ü»ù±¾É϶¼×ñÑBSP£¨Bulk Synchronous Parallell£©¼ÆËãģʽ¡£ÔÚBSPÖУ¬Ò»´Î¼ÆËã¹ý³ÌÓÉһϵÁÐÈ«¾Ö³¬²½×é³É£¬Ã¿Ò»¸ö³¬²½Óɲ¢·¢¼ÆË㡢ͨÐźÍÕ¤À¸Í¬²½Èý¸ö²½Öè×é³É¡£Í¬²½Íê³É£¬±êÖ¾×ÅÕâ¸ö³¬²½µÄÍê³É¼°ÏÂÒ»¸ö³¬²½µÄ¿ªÊ¼¡£BSPģʽºÜ¼ò½à¡£»ùÓÚBSPģʽ£¬Ä¿Ç°ÓÐÁ½ÖֱȽϳÉÊìµÄͼ¼ÆËãÄ£ÐÍ¡£
- PregelÄ£ÐÍ¡ª¡ªÏñ¶¥µãÒ»Ñù˼¿¼
2010Ä꣬GoogleµÄеÄÈý¼ÜÂí³µCaffeine¡¢Pregel¡¢Dremel·¢²¼¡£Ëæ×ÅPregelÒ»Æð£¬BSPÄ£Ð͹ãΪÈËÖª¡£Pregel½è¼øMapReduceµÄ˼Ï룬Ìá³öÁË¡°Ïñ¶¥µãÒ»Ñù˼¿¼¡±£¨Think Like A Vertex£©µÄͼ¼ÆËãģʽ£¬ÈÃÓû§ÎÞÐ迼ÂDz¢Ðзֲ¼Ê½¼ÆËãµÄϸ½Ú£¬Ö»ÐèҪʵÏÖÒ»¸ö¶¥µã¸üк¯Êý£¬Èÿò¼ÜÔÚ±éÀú¶¥µãʱ½øÐе÷Óü´¿É¡£
³£¼ûµÄ´úÂëÄ£°åÈçÏ£º

Õâ¸öÄ£ÐÍËäÈ»¼ò½à£¬µ«ºÜÈÝÒ×·¢ÏÖËüµÄȱÏÝ¡£¶ÔÓÚÁÚ¾ÓÊýºÜ¶àµÄ¶¥µã£¬ËüÐèÒª´¦ÀíµÄÏûÏ¢·Ç³£ÅӴ󣬶øÇÒÔÚÕâ¸öģʽÏ£¬ËüÃÇÊÇÎÞ·¨±»²¢·¢´¦ÀíµÄ¡£ËùÒÔ¶ÔÓÚ·ûºÏÃÝÂÉ·Ö²¼µÄ×ÔȻͼ£¬ÕâÖÖ¼ÆËãÄ£ÐÍϺÜÈÝÒ×·¢Éú¼ÙËÀ»òÕß±ÀÀ£¡£
Ïà±ÈPregelÄ£Ð͵ÄÏûϢͨÐÅ·¶Ê½£¬GraphLabµÄGASÄ£Ð͸üÆ«Ïò¹²ÏíÄÚ´æ·ç¸ñ¡£ËüÔÊÐíÓû§µÄ×Ô¶¨Ò庯Êý·ÃÎʵ±Ç°¶¥µãµÄÕû¸öÁÚÓò£¬¿É³éÏó³ÉGather¡¢ApplyºÍScatterÈý¸ö½×¶Î£¬¼ò³ÆÎªGAS¡£Ïà¶ÔÓ¦£¬Óû§ÐèҪʵÏÖÈý¸ö¶ÀÁ¢µÄº¯Êýgather¡¢applyºÍscatter¡£³£¼ûµÄ´úÂëÄ£°åÈçÏÂËùʾ£º

ÓÉÓÚgather/scatterº¯ÊýÊÇÒÔµ¥Ìõ±ßΪ²Ù×÷Á£¶È£¬ËùÒÔ¶ÔÓÚÒ»¸ö¶¥µãµÄÖÚ¶àÁڱߣ¬¿ÉÒÔ·Ö±ðÓÉÏàÓ¦µÄworker¶ÀÁ¢µ÷ÓÃgather/scatterº¯Êý¡£ÕâÒ»Éè¼ÆÖ÷ÒªÊÇΪÁËÊÊÓ¦µã·Ö¸îµÄͼ´æ´¢Ä£Ê½£¬´Ó¶ø±ÜÃâPregelÄ£ÐÍ»áÓöµ½µÄÎÊÌâ¡£
GraphXµÄ¿ò¼Ü
ÔÚÉè¼ÆGraphXʱ£¬µã·Ö¸îºÍGAS¶¼ÒѳÉÊ죬²¢ÔÚÉè¼ÆºÍ±àÂëÖÐÕë¶ÔËüÃǽøÐÐÁËÓÅ»¯£¬ÔÚ¹¦ÄܺÍÐÔÄÜÖ®¼äѰÕÒ×î¼ÑµÄƽºâµã¡£ÈçͬSpark±¾Éí£¬Ã¿¸ö×ÓÄ£¿é¶¼ÓÐÒ»¸öºËÐijéÏó¡£GraphXµÄºËÐijéÏóÊÇResilient Distributed Property Graph£¬Ò»ÖÖµãºÍ±ß¶¼´øÊôÐÔµÄÓÐÏò¶àÖØÍ¼¡£ËüÀ©Õ¹ÁËSpark RDDµÄ³éÏó£¬ÓÐTableºÍGraphÁ½ÖÖÊÓͼ£¬¶øÖ»ÐèÒªÒ»·ÝÎïÀí´æ´¢¡£Á½ÖÖÊÓͼ¶¼ÓÐ×Ô¼º¶ÀÓеIJÙ×÷·û£¬´Ó¶ø»ñµÃÁËÁé»î²Ù×÷ºÍÖ´ÐÐЧÂÊ¡£
ÈçͬSpark£¬GraphXµÄ´úÂë·Ç³£¼ò½à¡£GraphXµÄºËÐÄ´úÂëÖ»ÓÐ3ǧ¶àÐУ¬¶øÔÚ´ËÖ®ÉÏʵÏÖµÄPregelÄ£ÐÍ£¬Ö»Òª¶Ì¶ÌµÄ20¶àÐС£GraphXµÄ´úÂë½á¹¹ÕûÌåÈçͼ1Ëùʾ£¬ÆäÖд󲿷ֵÄʵÏÖ£¬¶¼ÊÇÎ§ÈÆPartitionµÄÓÅ»¯½øÐеġ£ÕâÔÚijÖ̶ֳÈÉÏ˵Ã÷Á˵ã·Ö¸îµÄ´æ´¢ºÍÏàÓ¦µÄ¼ÆËãÓÅ»¯£¬µÄÈ·ÊÇͼ¼ÆËã¿ò¼ÜµÄÖØµãºÍÄѵ㡣

ͼ1 GraphXµÄ´úÂë½á¹¹
GraphXµÄµ×²ãÉè¼ÆÓÐÒÔϼ¸¸ö¹Ø¼üµã¡£
- ¶ÔGraphÊÓͼµÄËùÓвÙ×÷£¬×îÖÕ¶¼»áת»»³ÉÆä¹ØÁªµÄTableÊÓͼµÄRDD²Ù×÷À´Íê³É¡£ÕâÑù¶ÔÒ»¸öͼµÄ¼ÆË㣬×îÖÕÔÚÂß¼ÉÏ£¬µÈ¼ÛÓÚһϵÁÐRDDµÄת»»¹ý³Ì¡£Òò´Ë£¬Graph×îÖվ߱¸ÁËRDDµÄ3¸ö¹Ø¼üÌØÐÔ£ºImmutable¡¢DistributedºÍFault-Tolerant¡£ÆäÖÐ×î¹Ø¼üµÄÊÇImmutable£¨²»±äÐÔ£©¡£Âß¼ÉÏ£¬ËùÓÐͼµÄת»»ºÍ²Ù×÷¶¼²úÉúÁËÒ»¸öÐÂͼ£»ÎïÀíÉÏ£¬GraphX»áÓÐÒ»¶¨³Ì¶ÈµÄ²»±ä¶¥µãºÍ±ßµÄ¸´ÓÃÓÅ»¯£¬¶ÔÓû§Í¸Ã÷¡£
- Á½ÖÖÊÓͼµ×²ã¹²ÓõÄÎïÀíÊý¾Ý£¬ÓÉRDD[Vertex-Partition]ºÍRDD[EdgePartition]ÕâÁ½¸öRDD×é³É¡£µãºÍ±ßʵ¼Ê¶¼²»ÊÇÒÔ±íCollection[tuple]µÄÐÎʽ´æ´¢µÄ£¬¶øÊÇÓÉVertexPartition/EdgePartitionÔÚÄÚ²¿´æ´¢Ò»¸ö´øË÷Òý½á¹¹µÄ·ÖƬÊý¾Ý¿é£¬ÒÔ¼ÓËÙ²»Í¬ÊÓͼϵıéÀúËÙ¶È¡£²»±äµÄË÷Òý½á¹¹ÔÚRDDת»»¹ý³ÌÖÐÊǹ²Óõ쬽µµÍÁ˼ÆËãºÍ´æ´¢¿ªÏú¡£
- ͼµÄ·Ö²¼Ê½´æ´¢²ÉÓõã·Ö¸îģʽ£¬¶øÇÒʹÓÃpartitionBy·½·¨£¬ÓÉÓû§Ö¸¶¨²»Í¬µÄ»®·Ö²ßÂÔ£¨PartitionStrategy£©¡£»®·Ö²ßÂԻὫ±ß·ÖÅäµ½¸÷¸öEdgePartition£¬¶¥µãMaster·ÖÅäµ½¸÷¸öVertexPartition£¬EdgePartitionÒ²»á»º´æ±¾µØ±ß¹ØÁªµãµÄGhost¸±±¾¡£»®·Ö²ßÂԵIJ»Í¬»áÓ°Ïìµ½ËùÐèÒª»º´æµÄGhost¸±±¾ÊýÁ¿£¬ÒÔ¼°Ã¿¸öEdgePartition·ÖÅäµÄ±ßµÄ¾ùºâ³Ì¶È£¬ÐèÒª¸ù¾ÝͼµÄ½á¹¹ÌØÕ÷ѡȡ×î¼Ñ²ßÂÔ¡£Ä¿Ç°ÓÐEdgePartition2d¡¢EdgePartition1d¡¢RandomVertexCutºÍCanonicalRandomVertexCutÕâËÄÖÖ²ßÂÔ¡£ÔÚÌÔ±¦´ó²¿·Ö³¡¾°Ï£¬EdgePartition2dЧ¹û×îºÃ¡£
GraphXµÄͼÔËËã·û
ÈçͬSparkÒ»Ñù£¬GraphXµÄGraphÀàÌṩÁ˷ḻµÄͼÔËËã·û£¬´óÖ½ṹÈçͼ2Ëùʾ¡£¿ÉÒÔÔÚ¹Ù·½GraphX Programming GuideÖÐÕÒµ½Ã¿¸öº¯ÊýµÄÏêϸ˵Ã÷£¬±¾ÎĽö½²Êö¼¸¸öÐèҪעÒâµÄ·½·¨¡£

ͼ2 GraphXµÄͼÔËËã·û
ͼµÄcache
ÿ¸öͼÊÇÓÉ3¸öRDD×é³É£¬ËùÒÔ»áÕ¼Óøü¶àµÄÄÚ´æ¡£ÏàӦͼµÄcache¡¢unpersistºÍcheckpoint£¬¸üÐèҪעÒâʹÓü¼ÇÉ¡£³öÓÚ×î´óÏ޶ȸ´ÓñߵÄÀíÄGraphXµÄĬÈϽӿÚÖ»ÌṩÁËunpersistVertices·½·¨¡£Èç¹ûÒªÊͷűߣ¬µ÷ÓÃg.edges.unpersist()·½·¨²ÅÐУ¬Õâ¸øÓû§´øÀ´ÁËÒ»¶¨µÄ²»±ã£¬µ«ÎªGraphXµÄÓÅ»¯ÌṩÁ˱ãÀûºÍ¿Õ¼ä¡£²Î¿¼GraphXµÄPregel´úÂ룬¶ÔÒ»¸ö´óͼ£¬Ä¿Ç°×î¼ÑµÄʵ¼ùÊÇ£º

´óÌåÖ®ÒâÊǸù¾ÝGraphXÖÐGraphµÄ²»±äÐÔ£¬¶Ôg×ö²Ù×÷²¢¸³»Ø¸øgÖ®ºó£¬gÒѲ»ÊÇÔÀ´µÄgÁË£¬¶øÇÒ»áÔÚÏÂÒ»ÂÖµü´úʹÓã¬ËùÒÔ±ØÐëcache¡£ÁíÍ⣬±ØÐëÏÈÓÃprevG±£Áôס¶ÔÔÀ´Í¼µÄÒýÓ㬲¢ÔÚÐÂͼ²úÉúºó£¬¿ìËÙ½«¾Éͼ³¹µ×Êͷŵô¡£·ñÔò£¬Ê®¼¸ÂÖµü´úºó£¬»áÓÐÄÚ´æÐ¹Â©ÎÊÌ⣬ºÜ¿ìºÄ¹â×÷Òµ»º´æ¿Õ¼ä¡£
mrTriplets¡ª¡ªÁڱ߾ۺÏ
mrTriplets£¨mapReduceTriplets£©ÊÇGraphXÖÐ×îºËÐĵÄÒ»¸ö½Ó¿Ú¡£PregelÒ²»ùÓÚËü¶øÀ´£¬ËùÒÔ¶ÔËüµÄÓÅ»¯Äܴܺó³Ì¶ÈÉÏÓ°ÏìÕû¸öGraphXµÄÐÔÄÜ¡£mrTripletsÔËËã·ûµÄ¼ò»¯¶¨ÒåÊÇ£º

ËüµÄ¼ÆËã¹ý³ÌΪ£ºmap£¬Ó¦ÓÃÓÚÿһ¸öTripletÉÏ£¬Éú³ÉÒ»¸ö»òÕß¶à¸öÏûÏ¢£¬ÏûÏ¢ÒÔTriplet¹ØÁªµÄÁ½¸ö¶¥µãÖеÄÈÎÒâÒ»¸ö»òÁ½¸öΪĿ±ê¶¥µã£»reduce£¬Ó¦ÓÃÓÚÿһ¸öVertexÉÏ£¬½«·¢Ë͸øÃ¿Ò»¸ö¶¥µãµÄÏûÏ¢ºÏ²¢ÆðÀ´¡£
mrTriplets×îºó·µ»ØµÄÊÇÒ»¸öVertexRDD[A]£¬°üº¬Ã¿Ò»¸ö¶¥µã¾ÛºÏÖ®ºóµÄÏûÏ¢£¨ÀàÐÍΪA£©£¬Ã»ÓнÓÊÕµ½ÏûÏ¢µÄ¶¥µã²»»á°üº¬ÔÚ·µ»ØµÄVertexRDDÖС£
ÔÚ×î½üµÄ°æ±¾ÖУ¬GraphXÕë¶ÔËü½øÐÐÁËһЩÓÅ»¯£¬¶ÔÓÚPregelÒÔ¼°ËùÓÐÉϲãËã·¨¹¤¾ß°üµÄÐÔÄܶ¼ÓÐÖØ´óÓ°Ïì¡£Ö÷Òª°üÀ¨ÒÔϼ¸µã¡£
- Caching for Iterative mrTriplets & Incremental Updates for Iterative mrTriplets£ºÔںܶàͼ·ÖÎöËã·¨ÖУ¬²»Í¬µãµÄÊÕÁ²Ëٶȱ仯ºÜ´ó¡£ÔÚµü´úºóÆÚ£¬Ö»ÓкÜÉٵĵã»áÓиüС£Òò´Ë£¬¶ÔÓÚûÓиüеĵ㣬ÏÂÒ»´ÎmrTriplets¼ÆËãʱEdgeRDDÎÞÐè¸üÐÂÏàÓ¦µãÖµµÄ±¾µØ»º´æ£¬´ó·ù½µµÍÁËͨÐÅ¿ªÏú¡£
- Indexing Active Edges£ºÃ»ÓиüÐµĶ¥µãÔÚÏÂÒ»ÂÖµü´úʱ²»ÐèÒªÏòÁÚ¾ÓÖØÐ·¢ËÍÏûÏ¢¡£Òò´Ë£¬mrTriplets±éÀú±ßʱ£¬Èç¹ûÒ»Ìõ±ßµÄÁÚ¾ÓµãÖµÔÚÉÏÒ»ÂÖµü´úʱûÓиüУ¬ÔòÖ±½ÓÌø¹ý£¬±ÜÃâÁË´óÁ¿ÎÞÓõļÆËãºÍͨÐÅ¡£
- Join Elimination£ºTripletÊÇÓÉÒ»Ìõ±ßºÍÆäÁ½¸öÁÚ¾Óµã×é³ÉµÄÈýÔª×飬²Ù×÷TripletµÄmapº¯Êý³£³£Ö»Ðè·ÃÎÊÆäÁ½¸öÁÚ¾ÓµãÖµÖеÄÒ»¸ö¡£ÀýÈ磬ÔÚPageRank¼ÆËãÖУ¬Ò»¸öµãÖµµÄ¸üÐÂÖ»ÓëÆäÔ´¶¥µãµÄÖµÓйأ¬¶øÓëÆäËùÖ¸ÏòµÄÄ¿µÄ¶¥µãµÄÖµÎ޹ء£ÄÇôÔÚmrTriplets¼ÆËãÖУ¬¾Í²»ÐèÒªVertexRDDºÍEdgeRDDµÄ3-way join£¬¶øÖ»ÐèÒª2-way join¡£
ËùÓÐÕâЩÓÅ»¯Ê¹GraphXµÄÐÔÄÜÖ𽥱ƽüGraphLab¡£ËäÈ»»¹ÓÐÒ»¶¨²î¾à£¬µ«Ò»Ì廯µÄÁ÷Ë®Ïß·þÎñºÍ·á¸»µÄ±à³Ì½Ó¿Ú£¬¿ÉÒÔÃÖ²¹ÐÔÄܵÄ΢С²î¾à¡£
½ø»¯µÄPregelÄ£ÐÍ
GraphXÖеÄPregel½Ó¿Ú£¬²¢²»Ñϸñ×ñÑPregelÄ£ÐÍ£¬ËüÊÇÒ»¸ö²Î¿¼GAS¸Ä½øµÄPregelÄ£ÐÍ¡£¶¨ÒåÈçÏ£º

ÕâÖÖ»ùÓÚmrTrilets·½·¨µÄPregelÄ£ÐÍ£¬Óë±ê×¼PregelµÄ×î´óÇø±ðÊÇ£¬ËüµÄµÚ2¶Î²ÎÊýÌå½ÓÊÕµÄÊÇ3¸öº¯Êý²ÎÊý£¬¶ø²»½ÓÊÕmessageList¡£Ëü²»»áÔÚµ¥¸ö¶¥µãÉϽøÐÐÏûÏ¢±éÀú£¬¶øÊǽ«¶¥µãµÄ¶à¸öGhost¸±±¾ÊÕµ½µÄÏûÏ¢¾ÛºÏºó£¬·¢Ë͸øMaster¸±±¾£¬ÔÙʹÓÃvprogº¯ÊýÀ´¸üеãÖµ¡£ÏûÏ¢µÄ½ÓÊպͷ¢ËͶ¼±»×Ô¶¯²¢Ðл¯´¦Àí£¬ÎÞÐèµ£Ðij¬¼¶½ÚµãµÄÎÊÌâ¡£
³£¼ûµÄ´úÂëÄ£°åÈçÏÂËùʾ£º

¿ÉÒÔ¿´µ½£¬GraphXÉè¼ÆÕâ¸öÄ£Ð͵ÄÓÃÒâ¡£Ëü×ÛºÏÁËPregelºÍGASÁ½ÕßµÄÓŵ㣬¼´½Ó¿ÚÏà¶Ô¼òµ¥£¬ÓÖ±£Ö¤ÐÔÄÜ£¬¿ÉÒÔÓ¦¶Ôµã·Ö¸îµÄͼ´æ´¢Ä£Ê½£¬Ê¤ÈηûºÏÃÝÂÉ·Ö²¼µÄ×ÔȻͼµÄ´óÐͼÆËã¡£ÁíÍ⣬ֵµÃ×¢ÒâµÄÊÇ£¬¹Ù·½µÄPregel°æ±¾ÊÇ×î¼òµ¥µÄÒ»¸ö°æ±¾¡£¶ÔÓÚ¸´ÔÓµÄÒµÎñ³¡¾°£¬¸ù¾ÝÕâ¸ö°æ±¾À©Õ¹Ò»¸ö¶¨ÖƵÄPregelÊǺܳ£¼ûµÄ×ö·¨¡£
ͼËã·¨¹¤¾ß°ü
GraphXÒ²ÌṩÁËÒ»Ì×ͼËã·¨¹¤¾ß°ü£¬·½±ãÓû§¶Ôͼ½øÐзÖÎö¡£Ä¿Ç°×îа汾ÒÑÖ§³ÖPageRank¡¢ÊýÈý½ÇÐΡ¢×î´óÁ¬Í¨Í¼ºÍ×î¶Ì·¾¶µÈ6ÖÖ¾µäµÄͼËã·¨¡£ÕâЩËã·¨µÄ´úÂëʵÏÖ£¬Ä¿µÄºÍÖØµãÔÚÓÚͨÓÃÐÔ¡£Èç¹ûÒª»ñµÃ×î¼ÑÐÔÄÜ£¬¿ÉÒԲο¼ÆäʵÏÖ½øÐÐÐ޸ĺÍÀ©Õ¹Âú×ãÒµÎñÐèÇó¡£ÁíÍ⣬ÑжÁÕâЩ´úÂ룬ҲÊÇÀí½âGraphX±à³Ì×î¼Ñʵ¼ùµÄºÃ·½·¨¡£
GraphXÔÚÌÔ±¦
ͼÆ×Ìå¼ìƽ̨
»ù±¾ÉÏ£¬ËùÓеĹØÏµ¶¼¿ÉÒÔ´ÓͼµÄ½Ç¶ÈÀ´¿´´ýºÍ´¦Àí£¬µ«µ½µ×Ò»¸ö¹ØÏµµÄ¼ÛÖµ¶à´ó£¿½¡¿µÓë·ñ£¿ÊʺÏÓÃÓÚʲô³¡¾°£¿ºÜ¶àʱºòÊÇ¿¿ÔËÓªÈËÔ±ºÍ²úÆ·¾ÀíÆ¾Ö±¾õÀ´ÅÐ¶ÏºÍÆÀ¹ÀµÄ¡£ÈçºÎ½«¸÷ÖÖͼµÄÖ¸±ê¾«Ï¸»¯ºÍ¹æ·¶»¯£¬¶ÔÓÚ²úÆ·ºÍÔËÓªµÄ¹¹Ë¼½øÐÐÊý¾ÝÉϵÄÔ¤ÑÐÖ¸µ¼£¬Ìṩ¿ÆÑ§¾ö²ßµÄÒÀ¾Ý£¬ÊÇͼÆ×Ìå¼ìƽ̨Éè¼ÆµÄ³õÖԺͳö·¢µã¡£
»ùÓÚÕâÑùµÄ³ö·¢µã£¬½èÖúGraphX·á¸»µÄ½Ó¿ÚºÍ¹¤¾ß°ü£¬Õë¶ÔÌÔ±¦ÄÚ²¿ÁÖÁÖ×Ü×ܵÄͼҵÎñÐèÇó£¬ÎÒÃÇ¿ª·¢Ò»¸öͼÆ×Ìå¼ìƽ̨¡£Ä¿Ç°Ö÷Òª½øÐÐÏÂÁÐÖ¸±êµÄ¼ì²é¡£
¶È·Ö²¼£ºÕâÊÇÒ»¸öͼ×î»ù´¡ºÍÖØÒªµÄÖ¸±ê¡£¶È·Ö²¼¼ì²âµÄÄ¿µÄ£¬Ö÷ÒªÊÇÁ˽âͼÖС°³¬¼¶½Úµã¡±µÄ¸öÊýºÍ¹æÄ££¬ÒÔ¼°ËùÓнڵã¶ÈµÄ·Ö²¼ÇúÏß¡£³¬¼¶½ÚµãµÄ´æÔÚ¶Ô¸÷ÖÖ´«²¥Ëã·¨¶¼»áÓÐÖØ´óµÄÓ°Ï죨²»ÂÛÊÇÕýÃæÖúÁ¦»¹ÊÇ·´Ãæ×èÁ¦£©£¬Òò´ËÒªÔ¤ÏȶÔÕâЩÊý¾ÝÁ¿ÓиöÔ¤¹À¡£½èÖúGraphX×î»ù±¾µÄͼÐÅÏ¢½Ó¿Údegrees: VertexRDD[Int]£¨°üÀ¨inDegreesºÍoutDegrees£©£¬Õâ¸öÖ¸±ê¿ÉÒÔÇáËɼÆËã³öÀ´£¬²¢½øÐи÷ÖÖ¸÷ÑùµÄͳ¼Æ¡£
¶þÌøÁÚ¾ÓÊý£º¶Ô´ó²¿·ÖÉç½»¹ØÏµÀ´Ëµ£¬Ö»»ñµÃÒ»ÌøµÄ¶È·Ö²¼Ô¶Ô¶²»¹»£¬ÁíÒ»¸öÖØÒªµÄÖ¸±êÊǶþÌøÁÚ¾ÓÊý¡£ÀýÈ磬ÎÞÃØAppÖкÃÓѵĺÃÓѵÄÃØÃÜ£¬´«²¥·¶Î§¸ü¹ã£¬ÐÅÏ¢Á¿¸ü·á¸»¡£Òò´Ë£¬¶þÌøÁÚ¾ÓÊýµÄͳ¼ÆÊÇͼÆ×Ìå¼ìÖкÜÖØÒªµÄÒ»¸öÖ¸±ê¡£¶ÔÓÚ¶þÌøÁھӵļÆË㣬GraphXûÓиø³öÏֳɵĽӿڣ¬ÐèÒª×Ô¼ºÉè¼ÆºÍ¿ª·¢¡£Ä¿Ç°Ê¹Óõķ½·¨ÊÇ£ºµÚÒ»´Î±éÀú£¬ËùÓеãÏòÁھӵ㴫²¥Ò»¸ö´ø×ÔÉíID£¬ÉúÃüֵΪ2µÄÏûÏ¢£»µÚ¶þ´Î±éÀú£¬ËùÓе㽫ÊÕµ½µÄÏûÏ¢ÏòÁÚ¾ÓµãÔÙת·¢Ò»´Î£¬ÉúÃüֵΪ1£»×îÖÕͳ¼ÆËùÓеãÉÏ£¬½ÓÊÕµ½µÄÉúÃüֵΪ1µÄID£¬²¢½øÐзÖ×é»ã×Ü£¬µÃµ½ËùÓеãµÄ¶þÌøÁÚ¾Ó¡£
ÖµµÃ×¢ÒâµÄÊÇ£¬½øÐÐÕâ¸ö¼ÆËã֮ǰ£¬ÐèÒª½èÖú¶È·Ö²¼½«Í¼Öеij¬¼¶½ÚµãÈ¥µô£¬²»ÄÉÈë¶þÌøÁÚ¾ÓÊýµÄ¼ÆËã¡£·ñÔò£¬ÕâЩ³¬¼¶½Úµã»áÔÚµÚÒ»ÂÖ´«²¥ºóÊÕµ½¹ý¶àµÄÏûÏ¢¶ø±¬µô£¬Í¬Ê±ËüÃDzÎÓë¼ÆË㣬»áÓ°ÏìÓëËüÃÇÓÐÒ»ÌøÁÚ¾Ó¹ØÏµµÄ¶¥µã£¬µ¼Ö²»Äܵõ½ÕæÕýÓÐЧµÄ¶þÌøÁÚ¾ÓÊý¡£
Á¬Í¨Í¼£º¼ì²âÁ¬Í¨Í¼µÄÄ¿µÄÊÇŪÇåÒ»¸öͼÓм¸¸öÁ¬Í¨²¿·Ö¼°Ã¿¸öÁ¬Í¨²¿·ÖÓжàÉÙ¶¥µã¡£ÕâÑù¿ÉÒÔ½«Ò»¸ö´óͼ·Ö¸îΪ¶à¸öСͼ£¬²¢È¥µôÁãËéµÄÁ¬Í¨²¿·Ö£¬´Ó¶ø¿ÉÒÔÔÚ¶à¸öС×ÓͼÉϽøÐиü¼Ó¾«Ï¸µÄ²Ù×÷¡£Ä¿Ç°£¬GraphXÌṩÁËConnectedComponentsºÍStronglyConnected-ComponentsËã·¨£¬Ê¹ÓÃËüÃÇ¿ÉÒÔ¿ìËÙ¼ÆËã³öÏàÓ¦µÄÁ¬Í¨Í¼¡£Á¬Í¨Í¼¿ÉÒÔ½øÒ»²½ÑÝ»¯±ä³ÉÉçÇø·¢ÏÖËã·¨£¬¶ø¸ÃËã·¨ÓÅÁӵįÀÅбê×¼Ö®Ò»£¬ÊǼÆËãÄ£¿éµÄQÖµ£¬À´²é¿´ËùνµÄmodularityÇé¿ö¡£
¸ü¶àµÄÖ¸±ê£¬ÀýÈçTriangle CountºÍK-Core£¬ÎÞÂÛÊǽèÖúGraphXÒÑÓеĺ¯Êý£¬»¹ÊÇ×Ô¼º´ÓÍ·¿ª·¢£¬¶¼Â½ÐøÔÚ½øÐÐÖС£Ä¿Ç°Õâ¸öͼÆ×Ìå¼ìƽ̨Òѳõ¾ß¹æÄ££¬Í¨¹ýƽ̨µÄ½¨Á¢ºÍÍÆ¹ã£¬Í¼Ïà¹ØµÄ²úÆ·ºÍÒµÎñÖð½¥×ßÉÏ¡°ÎÞÊý¾Ý£¬²»ÌÖÂÛ£¬ÓÃÖ¸±êÀ´Ô¤¹ÀЧ¹û¡±µÄÊý¾Ý»¯ÔËӪ֮·£¬ÓÐЧÌá¸ß¹µÍ¨Ð§ÂÊ£¬Îª¸÷ÖÖͼÏà¹ØµÄÒµÎñ¿ª·¢×ßÉÏ¿ÆÑ§»¯ºÍϵͳ»¯Ö®Â·×öºÃ×¼±¸¡£
¶àͼºÏ²¢¹¤¾ß
ÔÚͼÆ×Ìå¼ìƽ̨µÄ»ù´¡ÉÏ£¬ÎÒÃÇ¿ÉÒÔÁ˽⵽¸÷ÖÖ¹ØÏµµÄÌØµã¡£Ã¿ÖÖ¹ØÏµ¶¼ÓÐ×Ô¼ºµÄÇ¿ÏîºÍÈõÏÀýÈçÓÐЩ¹ØÏµÍ¼Æ×Á¬Í¨ÐÔºÃЩ£¬¶øÓÐЩ¹ØÏµÍ¼Æ×µÄÉç½»ÐÔºÃЩ£¬Òò´ËÍùÍùҪʹÓùØÏµAÀ´·á¸»¹ØÏµB¡£Îª´Ë£¬½èÖúGraphX£¬ÎÒÃÇÔÚͼÆ×Ìå¼ìƽ̨ÉÏ¿ª·¢ÁËÒ»¸ö¶àͼºÏ²¢¹¤¾ß£¬ÌṩÀàËÆÍ¼²¢¼¯µÄ¸ÅÄ¿É¿ìËÙ¶ÔÖ¸¶¨µÄÁ½¸ö²»Í¬µÄ¹ØÏµÍ¼Æ×½øÐкϲ¢£¬²úÉúÒ»¸öÐµĹØÏµÍ¼Æ×¡£
ÒÔÓûùÓÚA¹ØÏµµÄͼÀ´À©³ä»ùÓÚB¹ØÏµµÄͼ£¬Éú³ÉÀ©³äͼCΪÀý£¬ÈÚºÏËã·¨µÄ»ù±¾Ë¼Â·Èçͼ3£ºÈôͼBÖÐij±ßµÄÁ½¸ö¶¥µã¶¼ÔÚͼAÖУ¬Ôò½«¸Ã±ß¼ÓÈëCͼ£¨ÈçBD±ß£©£»ÈôͼBÖÐij±ßµÄÒ»¸ö¶¥µãÔÚͼAÖУ¬ÁíÒ»¸ö¶¥µã²»ÔÚ£¬Ôò½«¸Ã±ßºÍÁíÒ»¶¥µã¶¼¼ÓÉÏ£¨ÈçCE±ßºÍEµã£©£»ÈôͼAÖÐij±ßµÄÁ½¸ö¶¥µã¶¼²»ÔÚͼBÖУ¬ÔòÉáÆúÕâÌõ±ßºÍ¶¥µã£¨ÈçEF±ß£©¡£

ͼ3 ͼºÏ²¢Ëã·¨
ʹÓÃGraphXµÄouterJoinVerticesµÈͼÔËËã·û£¬Äܼܺòµ¥µØÍê³ÉÉÏÊö²Ù×÷¡£ÁíÍ⣬ÔÚ¿¼ÂÇͼºÏ²¢Ê±£¬Ò²¿ÉΪ²»Í¬Í¼µÄ±ß¼ÓÉϲ»Í¬µÄÈ¨ÖØ£¬×ۺϿ¼ÂǵãÖ®¼ä²»Í¬¹ØÏµµÄÖØÒªÐÔ¡£Ð²úÉúµÄͼ£¬»áÔÙ½øÐÐÒ»ÂÖͼÆ×Ìå¼ì¡£Í¨¹ýǰºóÈý¸öͼ¸÷¸öÌå¼ìÖ¸±êµÄ¶Ô±È£¬ÓÐÖúÓÚ¶ÔÒµÎñÉÏÏߺóµÄЧ¹û×öÔ¤¹ÀºÍÅжϡ£Èç¹û²»·ûºÏÆÚÍû£¬¿É³¢ÊÔÖØÐÂÑ¡ÔñÀ©³ä·½°¸¡£
ÄÜÁ¿´«²¥Ä£ÐÍ
¼ÓÈ¨ÍøÂçÉϵÄÄÜÁ¿´«²¥ÊǾµäµÄͼģÐÍÖ®Ò»£¬¿ÉÓÃÓÚÓû§ÐÅÓþ¶ÈÔ¤²â¡£Ä£Ð͵Ä˼·ÊÇ£ºÎïÒÔÀà¾Û£¬ÈËÒÔȺ·Ö¡£³£ºÍÐÅÓþ¶È¸ßµÄÓû§½øÐн»Ò׵ģ¬ÐÅÓþ¶È×ÔÈ»½Ï¸ß£»³£ºÍÐÅÓþ¶È²îµÄÓû§ÓÐÒµÎñÀ´ÍùµÄ£¬ÐÅÓþ¶È×ÔÈ»½ÏµÍ¡£Ä£ÐͲ»¸´ÔÓ£¬µ«ÌÔ±¦È«ÍøÓÐÉÏÒÚµÄÓû§µãºÍ¼¸Ê®ÒÚ¹ØÏµ±ß£¬Òª¶ÔÈç´Ë¹æÄ£µÄ¾ÞÐÍͼ½øÐÐÄÜÁ¿´«²¥£¬²¢¶Ô±ßµÄÈ¨ÖØ½øÐо«Ï¸µÄµ÷½Ú£¬¶Ôͼ¼ÆËã¿ò¼ÜµÄÐÔÄܺ͹¦Äܶ¼ÊǾ޴óµÄ¿¼Ñé¡£½èÖúGraphX£¬ÎÒÃÇÔÚÕâÁ½µãÖ®¼äÈ¡µÃÁËÆ½ºâ£¬³É¹¦ÊµÏÖÁ˸ÃÄ£ÐÍ¡£
Á÷³ÌÈçͼ4Ëùʾ£¬ÏÈÉú³ÉÒÔÓû§Îªµã¡¢ÂòÂô¹ØÏµÎª±ßµÄ¾ÞÐÍͼinitGraph£¬¶ÔÑ¡³öµÄÖÖ×ÓÓû§£¬·Ö±ð¸³ÓèÏàͬµÄ³õʼÕý¸ºÄÜÁ¿Öµ£¨trustRank & badRank£©£¬È»ºó½øÐÐÁ½ÂÖËæ»úÓÎ×ߣ¬Ò»ÂÖºÃÖÖ×Ó´«²¥ÕýÄÜÁ¿£¨tr£©£¬Ò»ÂÖ»µÖÖ×Ó´«²¥¸ºÄÜÁ¿£¨br£©£¬È»ºóÕý¸ºÄÜÁ¿Ïà¼õµÃµ½finalRank£¬¸ù¾ÝfinalRankÅжÏÓû§µÄºÃ»µ¡£±ßµÄ³õʼ´«²¥Ç¿¶ÈÊÇ0.85£¬ÕâʱAUCºÜµÍ£¬ÐèÒªÔÙ¸øÃ¿Ìõ±ß£¬´øÉÏÒ»¸öÓɶà¸öÌØÕ÷£¨½»Ò×´ÎÊý¡¢½ð¶î¡¡£©×é³ÉµÄ×éºÏÈ¨ÖØ¡£Ã¿¸öÌØÕ÷£¬¶¼Óв»Í¬µÄ¶ÀÁ¢È¨ÖØºÍÆ«ÒÆÁ¿¡£Í¨¹ýʹÓÃpartialDerivativeAUC·½·¨£¬ÔÚѵÁ·¼¯ÉϼÆËãAUC£¬È»ºó¶ÔAUCÇ󯫵¼£¬µÃµ½Ã¿¸ö¹ØÏµÎ¬¶ÈµÄ¶ÀÁ¢È¨ÖØºÍÆ«ÒÆÁ¿£¬Éú³ÉеÄÈ¨ÖØµ÷½ÚÆ÷£¨WeightAdjustor£©£¬¶ÔͼÉÏËùÓбßÉϵÄÈ¨ÖØ¸üУ¬ÔÙ½øÐÐÐÂÒ»ÂÖ´óµü´ú£¬ÕâÑùÒ»Ö±µ½AUCÎȶ¨Ê±£¬ÖÕÖ¹¼ÆËã¡£

ͼ4 ÄÜÁ¿´«²¥ºÍѵÁ·Ä£ÐÍ
ÔÚ½Ó½üÈ«Á¿µÄÊý¾ÝÉϽøÐÐ3ÂÖ´óµü´ú£¬Ã¿ÂÖ2+6´ÎPregel£¬Ã¿´ÎPregel´óÔ¼30´ÎСµü´úºó£¬×îÖÕµÄAUC´Ó0.6ÌáÉýµ½0.9£¬´ïµ½Á˲»´íµÄÓû§Ô¤²â׼ȷÂÊ¡£ÑµÁ·Ê±³¤ÔÚ6¸öСʱ×óÓÒ£¬ÎÞÂÛÔÚÐÔÄÜ»¹ÊÇ׼ȷÂÊÉÏ£¬¶¼³¬Ô½ÒµÎñ·½µÄÆÚÍû¡£
δÀ´Í¼¼ÆËãµÄǰ¾°
¾¹ý°ëÄê¶àµÄ³¢ÊÔ£¬Ö®Ç°Ò»Ð©Ïë×öµ«ÒòΪûÓÐ×ã¹»µÄ¼ÆËãÄÜÁ¦¶ø²»ÄÜʵÏÖµÄͼģÐÍ£¬ÏÖÒѲ»ÊÇÎÊÌâ¡£ÎÒÃǽ«»á½øÒ»²½½«Ô½À´Ô½¶àµÄͼģÐÍ£¬ÔÚGraphXÉÏʵÏÖ¡£ÕâЩģÐÍÓ¦ÓÃÓÚÓû§ÍøÂçµÄÉçÇø·¢ÏÖ¡¢Óû§Ó°ÏìÁ¦¡¢ÄÜÁ¿´«²¥¡¢±êÇ©´«²¥µÈ£¬¿ÉÒÔÌáÉýÓû§ð¤ÐԺͻîÔ¾¶È£»¶øÓ¦Óõ½ÍƼöÁìÓòµÄ±êÇ©ÍÆÀí¡¢ÈËȺ»®·Ö¡¢ÄêÁä¶ÎÔ¤²â¡¢ÉÌÆ·½»Ò×ʱÐòÌø×ª£¬Ôò¿ÉÒÔÌáÉýÍÆ¼öµÄ·á¸»¶ÈºÍ׼ȷÐÔ¡£
|