±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ·¶ÐÀÐÀ
,ÎÄÕÂÖ÷Òª´ÓÔÀíʵ¼ù¼°³¡¾°½éÉܵģ¬Í¼ÎÄ˵Ã÷Ïêϸ£¬Ï£Íû¶Ô´ó¼ÒÓаïÖú¡£
|
|
HBase´ÓÓ÷¨µÄ½Ç¶ÈÀ´½²Æäʵ·¦³Â¿ÉÉÆ£¬ËùÓиüвåÈëɾ³ý»ù±¾Ò»Á½¸öAPI¾Í¿ÉÒԸ㶨£¬ÒªËµÉÔ΢Óе㸴Ôӵϰ£¬ScanµÄÓ÷¨¿ÉÄÜ»á¶àһЩ˵ͷ¡£¶øÇÒ¾¹ý±ÊÕ߹۲죬ºÜ¶àÒµÎñ¶ÔScanµÄÓ÷¨¿ÉÄÜ´æÔÚһЩÎóÇø£¨¶ÔÓÚÕâЩÎóÇø£¬±ÊÕßÒ²»áÔÚÏÂÎÄÖ¸³ö£©£¬Òò´ËÓÐÁ˱¾ÆªÎÄÕµÄд×÷¶¯»ú¡£Ò²ËãÊÇScanϵÁÐµÄÆäÖÐһƪ°É£¬ºóÃæ¶ÔÓÚScan»¹»áÓÐһƪ½áºÏHDFS·ÖÎöHBaseÊý¾Ý¶ÁÈ¡ÔÚHDFS²ãÃæÊÇÔõôһ¸öÁ÷³Ì£¬¾´ÇëÆÚ´ý¡£
HBaseÖÐScan´Ó´óµÄ²ãÃæÀ´¿´Ö÷ÒªÓÐÈýÖÖ³£¼ûÓ÷¨£ºScanAPI¡¢TableScanMRÒÔ¼°SnapshotScanMR¡£ÈýÖÖÓ÷¨µÄÔÀí²»¾¡Ïàͬ£¬É¨ÃèЧÂÊÒ²µ±È»Ïà²îÉõ¶à£¬×îÖØÒªµÄÊÇÕ⼸ÖÖÓ÷¨ÊÊÓÃÓÚ²»Í¬µÄÓ¦Óó¡¾°£¬ÒµÎñÐèÒª¸ù¾Ý×Ô¼ºµÄʹÓó¡¾°Ñ¡ÔñºÏÊʵÄɨÃ跽ʽ¡£½ÓÏÂÀ´·Ö±ð¶ÔÕâÈýÖÖÓ÷¨´Ó¹¤×÷ÔÀí¡¢×î¼Ñʵ¼ùÁ½¸ö²ãÃæ½øÐнâÎö£¬×îºóÔÙ×ÝÏò¶ÔÈýÖÖÓ÷¨½øÐÐһ϶Աȣ¬Ï£Íû´ó¼ÒÄܹ»´ÓÓ÷¨²ãÃæ¶ÔScanÓиü¶àÁ˽⡣
ScanAPI
scan¿Í»§¶ËÉè¼ÆÔÀí
×î³£¼ûµÄscanÓ÷¨£¬¼û¹Ù·½APIÎĵµ¡£scanµÄÔÀí֮ǰÔÚ¶àÆªÎÄÕÂÖж¼ÓÐÌá¼°£¬ÎªÁ˱íÊö·½±ã£¬ÓбØÒªÔڴ˼òµ¥¸ÅÊöÒ»·¬¡£HBaseÖÐscan²¢²»Ïñ´ó¼ÒÏëÏóµÄÒ»ÑùÖ±½Ó·¢ËÍÒ»¸öÃüÁî¹ýÈ¥£¬·þÎñÆ÷¾Í½«Âú×ãɨÃèÌõ¼þµÄËùÓÐÊý¾ÝÒ»´ÎÐÔ·µ»Ø¸ø¿Í»§¶Ë¡£¶øÊµ¼ÊÉÏËüµÄ¹¤×÷ÔÀíÈçÏÂͼËùʾ£º

ÉÏͼÓÒ²àÊÇHBase scanµÄ¿Í»§¶Ë´úÂ룬ÆäÖÐforÑ»·ÖÐÿ´Î±éÀúResultScanner¶ÔÏó»ñȡһÐмǼ£¬Êµ¼ÊÉÏÔÚ¿Í»§¶Ë²ãÃæ¶¼»áµ÷ÓÃÒ»´ÎnextÇëÇó¡£nextÇëÇóÕû¸öÁ÷³Ì¿ÉÒÔ·ÖΪÈçϼ¸¸ö²½Ö裺
nextÇëÇóÊ×ÏÈ»á¼ì²é¿Í»§¶Ë»º´æÖÐÊÇ·ñ´æÔÚ»¹Ã»ÓжÁÈ¡µÄÊý¾ÝÐУ¬Èç¹ûÓоÍÖ±½Ó·µ»Ø£¬·ñÔòÐèÒª½«nextÇëÇó¸øHBase·þÎñÆ÷¶Ë£¨RegionServer£©¡£
Èç¹û¿Í»§¶Ë»º´æÒѾûÓÐɨÃè½á¹û£¬¾Í»á½«nextÇëÇó·¢Ë͸øHBase·þÎñÆ÷¶Ë¡£Ä¬ÈÏÇé¿öÏ£¬Ò»´ÎnextÇëÇó½ö¿ÉÒÔÇëÇó100ÐÐÊý¾Ý£¨»òÕß·µ»Ø½á¹û¼¯×Ü´óС²»³¬¹ý2M£©
·þÎñÆ÷¶Ë½ÓÊÕµ½nextÇëÇóÖ®ºó¾Í¿ªÊ¼´ÓBlockCache¡¢HFileÒÔ¼°memcacheÖÐÒ»ÐÐÒ»ÐнøÐÐɨÃ裬ɨÃèµÄÐÐÊý´ïµ½100ÐÐÖ®ºó¾Í·µ»Ø¸ø¿Í»§¶Ë£¬¿Í»§¶Ë½«Õâ100ÌõÊý¾Ý»º´æµ½ÄÚ´æ²¢·µ»ØÒ»Ìõ¸øÉϲãÒµÎñ¡£
ÉϲãÒµÎñ²»¶ÏÒ»ÌõÒ»Ìõ»ñȡɨÃèÊý¾Ý£¬ÔÚÊý¾ÝÁ¿´óµÄÇé¿öÏÂʵ¼ÊÉÏHBase¿Í»§¶Ë»á²»¶Ï·¢ËÍnextÇëÇóµ½HBase·þÎñÆ÷¡£ÓеÄÅóÓÑ¿ÉÄÜ»áÎÊΪʲôscanÐèÒªÉè¼ÆÎª¶à´ÎnextÇëÇóµÄģʽ£¿¸öÈËÈÏΪÕâÊÇ»ùÓÚ¶à¸ö²ãÃæµÄ¿¼ÂÇ£º
HBase±¾Éí´æ´¢Á˺£Á¿Êý¾Ý£¬ËùÒԺܶೡ¾°ÏÂÒ»´ÎscanÇëÇóµÄÊý¾ÝÁ¿¶¼»á±È½Ï´ó¡£Èç¹û²»ÏÞÖÆÃ¿´ÎÇëÇóµÄÊý¾Ý¼¯´óС£¬ºÜ¿ÉÄܻᵼÖÂϵͳ´ø¿í³Ô½ô´Ó¶øÔì³ÉÕû¸ö¼¯ÈºµÄ²»Îȶ¨¡£
Èç¹û²»ÏÞÖÆÃ¿´ÎÇëÇóµÄÊý¾Ý¼¯´óС£¬ºÜ¶àÇé¿öÏ¿ÉÄÜ»áÔì³É¿Í»§¶Ë»º´æOOMµô¡£
Èç¹û²»ÏÞÖÆÃ¿´ÎÇëÇóµÄÊý¾Ý¼¯´óС£¬ºÜ¿ÉÄÜ·þÎñÆ÷¶ËɨÃè´óÁ¿Êý¾Ý»á»¨·Ñ´óÁ¿Ê±¼ä£¬¿Í»§¶ËºÍ·þÎñÆ÷¶ËµÄÁ¬½Ó¾Í»átimeout¡£
ÕâÑùµÄÉè¼ÆÓÐûÓÐ覴ã¿
next²ßÂÔ¿ÉÒÔ±ÜÃâÔÚ´óÊý¾ÝÁ¿µÄÇé¿öÏ·¢Éú¸÷ÖÖÒì³£Çé¿ö£¬µ«ÕâÑùµÄÉè¼Æ¶ÔÓÚɨÃèЧÂÊËÆºõ²¢²»ÓѺã¬ÕâÀï¾ÙÁ½¸öÀý×Ó£º
scan²¢Ã»Óв¢·¢Ö´ÐС£ÕâÀï¿ÉÄܺܶ࿴¹Ù»áÎÊ£ºÉ¨ÃèÊý¾Ý·Ö²¼ÔÚ²»Í¬µÄregionÄѵÀÒ²²»»á²¢ÐÐÖ´ÐÐɨÃèÂð£¿Êǵģ¬È·Êµ²»»á£¬ÖÁÉÙÔÚÏÖÔڵİ汾ÖÐûÓÐʵÏÖ¡£ÕâµãÒ»¶¨³öºõºÜ¶à¶ÁÕßµÄÒâÁÏ£¬ÎÒÃÇÖªµÀgetµÄÅúÁ¿¶ÁÇëÇó»á½«ËùÓеÄÇëÇó°´ÕÕÄ¿±êregion½øÐзÖ×飬²»Í¬·Ö×éµÄgetÇëÇó»á²¢·¢Ö´ÐжÁÈ¡¡£È»¶øscan²¢Ã»ÓÐÕâÑùʵÏÖ¡£
´ó¼ÒÓÐûÓÐ×¢Òâµ½ÉÏͼÖв½Öè3ºÍ²½Öè4Ö®¼äHBase·þÎñÆ÷¶ËɨÃèÊý¾ÝµÄʱºòHBase¿Í»§¶ËÔÚ¸Éʲô£¿×èÈûµÈ´ýÊǰɡ£È·Êµ£¬ËùÒÔ´Ó¿Í»§¶ËÊÓ½ÇÀ´¿´Õû¸öɨÃèʱ¼ä£½¿Í»§¶Ë´¦ÀíÊý¾Ýʱ¼ä£«·þÎñÆ÷¶ËɨÃèÊý¾Ýʱ¼ä£¬ÕâÄܲ»ÄÜÓÅ»¯£¿
ScanAPIÓ¦Óó¡¾°
¸ù¾ÝÉÏÃæµÄ·ÖÎö£¬scan APIµÄЧÂʺܴó³Ì¶ÈÉÏÈ¡¾öÓÚɨÃèµÄÊý¾ÝÁ¿¡£Í¨³£½¨ÒéOLTPÒµÎñÖÐÉÙÁ¿Êý¾ÝÁ¿É¨ÃèµÄscan¿ÉÒÔʹÓÃscan
API£¬´óÁ¿Êý¾ÝµÄɨÃèʹÓÃscan API£¬É¨ÃèÐÔÄÜÓÐʱºò²¢²»Äܹ»µÃµ½ÓÐЧ±£Ö¤¡£
ScanAPI×î¼Ñʵ¼ù
ÅúÁ¿OLAPɨÃèÒµÎñ½¨Ò鲻ҪʹÓÃScanAPI£¬ScanAPIÊÊÓÃÓÚÉÙÁ¿Êý¾ÝɨÃ賡¾°£¨OLTP³¡¾°£©
½¨ÒéËùÓÐscan¾¡¿ÉÄܶ¼ÉèÖÃstartkeyÒÔ¼°stopkey¼õÉÙɨÃ跶Χ
½¨ÒéËùÓнöÐèҪɨÃ貿·ÖÁеÄscan¾¡¿ÉÄÜͨ¹ý½Ó¿ÚsetFamilyMapÉèÖÃÁÐ×åÒÔ¼°ÁÐ
TableScanMR
ScanAPI½öÊÊÓÃÓÚOLTP³¡¾°£¬ÄÇOLAP³¡¾°ÏÂÐèÒª´ÓHBaseÖÐɨÃè´óÁ¿Êý¾Ý½øÐзÖÎöÔõô°ìÄØ£¿ÏÖÔÚÓкܶàÒµÎñÐèÇó¶¼ÐèÒª´ÓHBaseɨÃè´óÁ¿Êý¾Ý½øÐзÖÎö£¬±ÈÈç×î³£¼ûµÄÓû§ÐÐΪ·ÖÎöÒµÎñ£¬Í¨³£ÐèҪɨÃèijЩÓû§×î½üÒ»¶Îʱ¼äµÄÍøÂçÐÐΪÊý¾Ý½øÐзÖÎö¡£
¶ÔÓÚÕâÀàÒµÎñ£¬HBaseĿǰÌṩÁËÁ½ÖÖ»ùÓÚMRɨÃèµÄÓ÷¨£¬·Ö±ðΪTableScanMRÒÔ¼°SnapshotScanMR¡£Ê×ÏÈÀ´½éÉÜTableScanMR£¬¾ßÌåÓ÷¨¿ÉÒԲο¼¹Ù·½Îĵµ¡£TableScanMRµÄ¹¤×÷ÔÀíÆäʵºÜ¼òµ¥£¬Ëµ°×Á˾ÍÊÇScanAPIµÄ²¢Ðл¯¡£ÈçÏÂͼËùʾ£º

TableScanMR»á½«scanÇëÇó¸ù¾ÝÄ¿±êregionµÄ·Ö½ç½øÐзֽ⣬·Ö½â³É¶à¸ösub-scan£¬Ã¿¸ösub-scan±¾ÖÊÉϾÍÊÇÒ»¸öScanAPI¡£¼ÙÈçscanÊÇÈ«±íɨÃ裬ÄÇÕâÕűíÓжàÉÙregion£¬¾Í»á½«Õâ¸öscan·Ö½â³É¶à¸ösub-scan£¬Ã¿¸ösub-scanµÄstartkeyºÍstopkey¾ÍÊÇregionµÄstartkeyºÍstopkey¡£
TableScanMR×î¼Ñʵ¼ù
TableScanMRÉè¼ÆÎªOLAP³¡¾°Ê¹Óã¬Òò´ËÔÚÀëÏßɨÃèʱ¾¡¿ÉÄÜʹÓøÃÖз½Ê½
TableScanMRÔÀíÉÏÖ÷ҪʵÏÖÁËScanAPIµÄ²¢Ðл¯£¬½«scan°´ÕÕregion±ß½ç½øÐÐÇз֡£ÕâÖÖ³¡¾°ÏÂÕû¸öscanµÄʱ¼ä»ù±¾µÈÓÚ×î´óregionɨÃèµÄʱ¼ä¡£ÔÚijЩÓÐÊý¾ÝÇãбµÄ³¡¾°Ï¿ÉÄܳöÏÖijһ¸öregionÉÏÓдóÁ¿´ýɨÃèÊý¾Ý£¬¶øÆäËû´óÁ¿regionÉ϶¼½öÓкÜÉٵĴýɨÃèÊý¾Ý¡£ÕâÑù²¢Ðл¯Ð§¹û²¢²»ºÃ¡£Õë¶ÔÕâÖÖÊý¾ÝÇãбµÄ³¡¾°TableScanMR×öÁËÆ½ºâ´¦Àí£¬Ëü»á½«´óregionÉϵÄscanÇзֳɶà¸öСµÄscanʹµÃËùÓзֽâºóµÄscanɨÃèµÄÊý¾ÝÁ¿»ù±¾Ï൱¡£Õâ¸öÓÅ»¯Ä¬ÈÏÊǹرյģ¬ÐèÒªÉèÖòÎÊý¡±hbase.mapreduce.input.autobalance¡±Îªtrue¡£Òò´Ë½¨Òé´ó¼ÒʹÓÃTableScanMRʱ½«¸Ã²ÎÊýÉèÖÃΪtrue¡£
¾¡Á¿½«É¨Ãè±íÖÐÏàÁÚµÄСregionºÏ²¢³É´óregion£¬¶ø½«´óregionÇзֳÉÉÔ΢СµãµÄregion
TableScanMRÖÐScanÐèҪעÒâÈçÏÂÁ½¸ö²ÎÊýÉèÖãº
Scan scan = new
Scan();
scan.setCaching(500); // 1 is the default in Scan,
which will be bad for MapReduce jobs
scan.setCacheBlocks(false); // don't set to true
for MR jobs |
SnapshotScanMR
SnapshotScanMRÓëTableScanMRÏàͬ¶¼ÊÇʹÓÃMR²¢Ðл¯¶ÔÊý¾Ý½øÐÐɨÃ裬Á½ÕßÓ÷¨Ò²»ù±¾Ïàͬ£¬Ö±½ÓʹÓÃTableScanMRµÄÓ÷¨£¬ÔÚ´Ë»ù´¡ÉÏ×ö²¿·ÖÐ޸ļ´¿É£¬ÈçÏÂËùʾ£º

µ«Á½ÕßÔÚʵÏÖÉÏÈ´Óжà¸ö·Ç³£´óµÄÇø±ð£º
´ÓÃüÃûÀ´¿´¾ÍÖªµÀ£¬SnapshotScanMRɨÃèÓÚÔʼ±í¶ÔÓ¦µÄsnapshotÖ®ÉÏ£¨¸ü׼ȷÀ´Ëµ¸ù¾Ýsnapshot
restore³öÀ´µÄhfile£©£¬¶øTableScanMRɨÃèÓÚÔʼ±í¡£
SnapshotScanMRÖ±½Ó»áÔÚ¿Í»§¶Ë´ò¿ªregionɨÃèHDFSÉϵÄÎļþ£¬²»ÐèÒª·¢ËÍScanÇëÇó¸øRegionServer£¬ÔÙÓÐRegionServerɨÃèHDFSÉϵÄÎļþ¡£Êǵģ¬Äãû¿´´í£¬ÊÇÔÚ¿Í»§¶ËÖ±½ÓɨÃèHDFSÉϵÄÎļþ£¬ÕâÀàscanner³ÆÖ®ÎªClientSideRegionScanner¡£
ÏÂͼÊÇSnapshotScanMRµÄ¹¤×÷ÔÀíͼ£¨×¢ÒâºÍTableScanMR¹¤×÷ÔÀíͼ¶Ô±È£©£º

ÕâÊÇÒ»¸öÏà¶Ô¼òµ¥µÄʾÒâͼ£¬ÆäÖÐÊ¡ÂÔÁ˺ܶദÀísnapshotµÄ¹ý³ÌÒÔ¼°ÇзÖscanµÄ¹ý³Ì¡£×ÜÌåÀ´¿´ºÍTableScanMR¹¤×÷Á÷³Ì»ù±¾Ò»Ö£¬×î´óµÄ²»Í¬À´×ÔregionɨÃèHDFSÕâ¸öÄ£¿é£¬TableScanMRÖÐÕâ¸öÄ£¿éÀ´×ÔÓÚregionserver£¬¶øSnapshotScanMRÖпͻ§¶ËÖ±½ÓÈÆ¹ýregionserverÔÚ¿Í»§¶Ë½èÓÃregionÖеÄɨÃè»úÖÆÖ±½ÓɨÃèhdfsÖÐÊý¾Ý¡£
ÓÐЩÅóÓÑ¿ÉÄÜÒªÎÊÁË£¬ÎªÊ²Ã´ÒªÕâÃ´Íæ£¿×ܽáÆðÀ´£¬Ö®ËùÒÔÕâÃ´ÍæÖ÷ÒªÓÐÁ½¸öÔÒò£º
¼õС¶ÔRegionServerµÄÓ°Ïì¡£ºÜÏÔÈ»£¬SnapshotScanMRÕâÖÖÈÆ¹ýRegionServerµÄʵÏÖ·½Ê½×î´óÏ޶ȵļõСÁ˶Լ¯ÈºÖÐÆäËûÒµÎñµÄÓ°Ïì¡£
¼«´óµÄÌáÉýÁËɨÃèЧÂÊ¡£SnapshotScanMRÏà±ÈTableScanMRÔÚɨÃèЧÂÊÉÏ»áÓÐ2±¶¡«N±¶µÄÐÔÄÜÌáÉý£¨ÏÂһС½Ú¶Ô¸÷ÖÖɨÃèÓ÷¨ÐÔÄÜ×ö¸ö¶Ô±ÈÆÀ¹À£©¡£ÓÐÈËÓÖÒªÎÊÁË£¬ÎªÊ²Ã´»áÓÐÕâô´óµÄÐÔÄÜÌáÉý£¿¸öÈËÈÏΪÖ÷ÒªÓÐÈçÏÂÁ½¸ö·½ÃæµÄÔÒò£º
ɨÃèµÄ¹ý³ÌÉÙÁËÒ»´ÎÍøÂç´«Ê䣬¶ÔÓÚ´óÊý¾ÝÁ¿µÄɨÃè£¬ÍøÂç´«Ê仨·ÑµÄʱ¼äÊǷdz£ÅÓ´óµÄ£¬ÕâÖ÷Òª¿ÉÄÜÇ£³¶µ½Êý¾ÝµÄÐòÁл¯ÒÔ¼°·´ÐòÁл¯¿ªÏú¡£
TableScanMRɨÃèÖÐRegionServerºÜ¿ÉÄÜ»á³ÉΪƿ¾±£¬¶øSnapshotScanMRɨÃ貢ûÓÐÕâ¸öÆ¿¾±µã¡£
ÔÚ×îºó˵һ¸öTableScanMRºÍSnapshotScanMR¶¼´æÔÚµÄÎÊÌ⣬Á½Õßʵ¼ÊÉ϶¼Êǰ´ÕÕregion¶Ôscan½øÐÐÇз֣¬È»¶ø¶ÔÓںܶà´óregion£¨´óÓÚ30g£©£¬µ¥¸öregionµÄɨÃèÁ£¶È»¹ÊÇÌ«´ó¡£ÁíÍ⣬ºÜ¶àscanɨÃè¿ÉÄܲ¢Ã»ÓÐÉæ¼°¶à¸öregion£¬¶øÊǼ¯ÖÐÔÚijһ¸öregionÉÏ£¬¾Ù¸öÀý×Ó£¬É¨Ãèij¸öÓû§×î½üÒ»¸öÔµÄÐÐΪ¼Ç¼£¬Èç¹ûrowkeyÉè¼ÆÎªusername+timestampµÄ»°£¬´ýɨÃèÊý¾Ýͨ³£»á¼¯Öд洢ÔÚÒ»¸öregionÉÏ£¬ÕâÖÖɨÃèÈç¹ûʹÓÃMRµÄ»°£¬ÔÚµ±Ç°µÄ²ßÂÔÏÂÖ»»áÉú³ÉÒ»¸öMapper¡£Òò´ËÓбØÒªÌṩһЩÆäËû²ßÂÔ¿ÉÒÔ½«scan·Ö½âµÄÁ£¶È×öµÄ¸üϸ¡£
»ù±¾ÐÔÄܶԱÈ
Õë¶ÔTableScanMRºÍSnapshotScanMRÁ½ÖÖɨÃ跽ʽ£¬±ÊÕß×ö¹ýÒ»¸ö¼òµ¥²âÊÔ£¬Í¬ÑùɨÃè1ÒÚÌõµ¥ÐÐ1KµÄ¼Ç¼£¨regionÓÐ15¸ö£©£¬SnapshotScanMRËùÐèÒªµÄʱ¼ä»ù±¾ÊÇTableScanMRµÄÒ»°ë¡£Ç°Ð©Ìì±ÊÕ߸պÿ´µ½Ò»¸ö·ÖÏí£¬ÀïÃæÓжÔʹÓÃScanAPI¡¢ClientSideRegionScannerAPI¡¢TableScannMRÒÔ¼°SnapshotScanMR½øÐÐÁËÐÔÄܶԱȣ¬ÈçÏÂͼËùʾ£º


´ÓÉÏͼÖпÉÒÔ¿´³ö£¬Ê¹ÓÃScanAPIµÄÐÔÄÜ×î²î£¬SnapshotScanMRµÄÐÔÄÜ×îºÃ¡£SnapshotScanMRµÄÐÔÄÜÏà±ÈTableScanMR(ScanMR)Ò²ÓÐ3±¶µÄÐÔÄÜÌáÉý¡£È»¶øÔÚʵ¼ÊÓ¦ÓÃÖУ¬ºÍСÃ×committerÕùÉñ֮ǰÁĹý£¬SnapshotScanMRĿǰ¿ÉÄÜ»¹Óкܶ಻ÊǺÜÍêÉÆµÄµØ·½£¬ËûÃÇÒ²ÔÚ²»¶ÏµÄÐÞ¸´£¬ÏàÐÅÔÚÖ®ºóµÄ°æ±¾ÖÐSnapshotScanMR»á¸ü¼Ó³ÉÊì¡£ |