ã·ãªãŒãºã®åã®ããŒãã§ãç§ãã¡ïŒ100,500åç®ïŒã¯ãGoogle MapReduceã¢ãããŒãã®åºæ¬çãªãã¯ããã¯ãšæ®µéã«ã€ããŠè©±ãããšããŸãããåŸç¶ã®èŽè¡ã«MapReduceãç¥ãããããã«ãæåã®ããŒãã¯ããã£ããã³ããæå³ããããšãèªããªããã°ãªããŸããã ããããã¹ãŠãCachéObjectScriptã§å®è£ ããæ¹æ³ã1è¡ã§ç€ºãæéã¯ãããŸããã§ããã ãããŠãããã«ã€ããŠã¯ä»æ¥ïŒãããŠæ°æ¥åŸïŒã®è©±ã§ãã
ãããããžã§ã¯ãã®æåã®ã¡ãã»ãŒãžãæãåºããŠãã ãããCachéObjectScriptã§å©çšå¯èœãªããŒã«ã䜿çšããŠMapReduceã¢ã«ãŽãªãºã ãå®è£ ããããšãèšç»ããŠããŸãã ã€ã³ã¿ãŒãã§ãŒã¹ãäœæãããšããGoogle MapReduceã®å ã®å®è£ ã«ã€ããŠåã®èšäºã§èª¬æããAPIã«åºå·ããããšããŸãããããã«å¿ããŠéžè±ãè¡šæãããŸãã
æœè±¡ããããŒãšã¬ãã¥ãŒãµãŒã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããããšããå§ããŸãããã
Class MR.Base.Mapper { Method Map(MapInput As MR.Base.Iterator, MapOutput As MR.Base.Emitter) [ Abstract ] { } } Class MR.Base.Reducer { Method Reduce(ReduceInput As MR.Base.Iterator, ReduceOutput As MR.Base.Emitter) [ Abstract ] { } }
æåã«ãæšæºçãªå®è£ ã®ããã«ã2ã€ã®å¥åã®ã€ã³ã¿ãŒãã§ã€ã¹MapInputãšReduceInputãäœæããŸããã ããããããããåãç®çãæãããåãã¡ãœãããæäŸããããšãããã«æããã«ãªããŸãã-圌ãã®ç®æšã¯ãããŒã¿ã¹ããªãŒã ãæåŸãŸã§ééããããšã§ãã ã©ã¡ããå埩åã§ãã ãããã£ãŠãæçµçã«ã¯ãããããMR.Base.Iteratorã®å ±éã€ã³ã¿ãŒãã§ãŒã¹ã«æžãããŸãã
Class MR.Base.Iterator { Method GetNext() As %String [Abstract ] { } Method IsAtEnd() As %Boolean [Abstract ] { } }
éä¿¡ãã£ãã«ãšããŠã°ããŒãã«ã䜿çšãã
å ã®Google MapReduceå®è£ ã§ã¯ãããŒããšã¢ã«ãŽãªãºã ã®ã¹ããŒãžéã®ãã©ã³ã¹ããŒããšããŠGoogle GFSãã¡ã€ã«ã·ã¹ãã ã䜿çšããŠããŸããã Cachéã«ã¯ãããŒãéã§ïŒã³ããŒã¬ã³ãïŒããŒã¿ãé åžããããã®ç¬èªã®ã¡ã«ããºã ããããŸãïŒãã¢TCP / UDPã䜿çšããªãå ŽåïŒ-ããã¯ECPïŒ ãšã³ã¿ãŒãã©ã€ãºãã£ãã·ã¥ãããã³ã« ïŒã§ãã éåžžãã¢ããªã±ãŒã·ã§ã³ãµãŒããŒããªã¢ãŒãããŒã¿ããŒã¹ãµãŒããŒããããŒã¿ãåä¿¡ããããã«äœ¿çšããŸãã ãããããã®ãããªãã¢ããŒãã¢ECPæ¥ç¶ã«åºã¥ããŠç¹å®ã®ä»®æ³å¶åŸ¡ãã¹ãæ§ç¯ããããŒã¿ã<keyãvalue>ãã¢ãŸãã¯åæ§ã®ããŒã¿ã®åœ¢åŒã§æ ŒçŽããããšã劚ãããã®ã¯äœããããŸããã ãã®ããŒã¿ã¯ãã¢ã«ãŽãªãºã ãã€ãã©ã€ã³ã«åå ããŠããã¢ã¯ã¿ãŒéã§è»¢éãããŸãïŒã€ãŸããããããŒãªããžã§ã¯ãã«ãã£ãŠéä¿¡ãããæŸåºã¯ãECPãã¹ã«æžã蟌ãŸããReducerãªããžã§ã¯ãã«ãã£ãŠèªã¿åãããŸãïŒã ã¢ã¯ã¿ãŒã1ã€ã®ããŒãå ã§åäœããå Žåãããšãã°ãå®è£ ãããã¢ã«ãŽãªãºã ãå€æ®µéã§ä¿¡é Œæ§ãšãžã£ãŒããªã³ã°ãå¿ èŠãªå ŽåãCACHETEMPã«è¡šç€ºãããé«éã°ããŒãã«ãŸãã¯éåžžã®ã°ããŒãã«ã䜿çšã§ããŸãã
ãããã®å Žåã§ããããŒã«ã«ã°ããŒãã«ïŒ1ã€ã®ããŒãã®æ§æçšïŒããŸãã¯ECPçµç±ã§æ¥ç¶ããããªã¢ãŒãããŒãã®ã°ããŒãã«ã«ããããããã°ããŒãã«ã¯ãCachéã¯ã©ã¹ã¿ãŒã®ããŒãéããã®å Žåã¯MapReduceã«é¢é£ããæ©èœéã§ããŒã¿ã転éããããã®äŸ¿å©ã§ç¢ºç«ããããã©ã³ã¹ããŒãã§ãããã³ã¯ã©ã¹ã
ãããã£ãŠãã·ã¹ãã ãç°¡çŽ åããèªç¶ãªè§£æ±ºçã¯ãGFSãŸãã¯HDFSãã¡ã€ã«ã·ã¹ãã ã®ä»£ããã«ãCachéç°å¢ã§ECPãããã³ã«ã䜿çšããŠã¯ã©ã¹ã¿ãŒããŒãéã§ããŒã¿ã転éããããšã§ãã ECPã®æ©èœç¹æ§ã«ãããä»ã®åçŽåãè¡ãããšãã§ããŸãïŒè©³çŽ°ã«ã€ããŠã¯åŸã§èª¬æããŸãïŒã
ãšããã¿ãŒãšé»éè¡
åã®ã·ãªãŒãºã§ãã§ã«è¿°ã¹ãããã«ãããŒã¿ãMapperãªããžã§ã¯ããé¢ããŠãããReducerå ¥åã«å°éãããŸã§ãåŸæ¥ã®å®è£ ã§ã¯ããŠã£ã¶ãŒãã¯ç§»åãšäžŠã¹æ¿ãã®é£ããæäœãçµéšããŸãã
ãã©ã³ã¹ããŒãã®å質ã«ã°ããŒãã«ã䜿çšããç°å¢ãMUMPS /CachéObjectScriptç°å¢ã§ã¯ããã®ãããªãœãŒãã®è¿œå ã³ã¹ããå®å šã«åé¿ã§ããŸãã éçŽãšãœãŒãã¯ãåºç€ãšãªãbtree *ãªããžããªã«ãã£ãŠè¡ãããŸãã
ãã®ãããªèšèšèŠä»¶ããããããåºæ¬çãªãšããã¿ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŸãã
Class MR.Base.Emitter Extends MR.Base.Iterator { /// emit $listbuild(key,value(s)) Method Emit(EmitList... As %String) [Abstract ] { } }
ãšããã¿ãŒã¯äžèšã®å ¥åã€ãã¬ãŒã¿ãŒã®ã€ã³ã¿ãŒãã§ãŒã¹ã«é¡äŒŒããŠããå¿ èŠããããŸãïŒãã®ãããMR.Base.Iteratorããç¶æ¿ããŸããïŒããããŒã¿ãã¹ã€ã³ã¿ãŒãã§ãŒã¹ã«å ããŠããšããã¿ãŒã¯äžéã¹ãã¬ãŒãžã«ããŒã¿ãéä¿¡ã§ããå¿ èŠããããŸãïŒã€ãŸããæŸå°æ©èœïŒã
æåã¯ãEmité¢æ°ã¯åŸæ¥ã®å®è£ ãšéåžžã«ãã䌌ãŠããŠã2ã€ã®åŒæ°ã®ã¿ã<keyãvalue>ãã¢ãšããŠåãåããŸãããããã®åŸãå€ã®ãã¢ãããé·ãå€æ¬¡å ã®ãã®ïŒããšãã°ãä»»æã®ã¢ãªãã£ã®ã¿ãã«ïŒãæž¡ãå¿ èŠããããŸããïŒãçŸæç¹ã§ã¯ãEmitã¯å¯å€æ°ã®åŒæ°ãåãé¢æ°ã«ãªã£ãŠããããã§ãã
ã»ãšãã©ã®å Žåãå®éã«ã¯ãåŸæ¥ã®å®è£ ã§èŠãããã«ã<keyãvalue>åŒæ°ã2ã3åããæ¥ãªãããšã«æ³šæããŠãã ããã
ããã¯ãŸã æœè±¡çãªã€ã³ã¿ãŒãã§ãŒã¹ã§ãããããå€ãã®èãããã«è¿œå ãããŸãã
åŠçäžã«ãåä¿¡ããèŠçŽ ã®é åºãç¶æããå¿ èŠãããå Žåã以äžã®å®è£ ã䜿çšããŸãã
/// Emitter which maintains the order of (key,value(s)) Class MR.Emitter.Ordered Extends (%RegisteredObject, MR.Base.Emitter) { /// global name serving as data channel Property GlobalName As %String; Method %OnNew(initval As %String) As %Status { $$$ThrowOnError($length(initval)>0) set ..GlobalName = initval quit $$$OK } Parameter AUTOCLEANUP = 1; Method %OnClose() As %Status { if ..#AUTOCLEANUP { if $data(@i%GlobalName) { kill @i%GlobalName } } Quit $$$OK } ... }
ããŒãžã³ã§ã¯ãCachéã§ã¯ãã°ããŒãã«ã¯äžè¬ã«ã°ããŒãã«:)ã§ãããããããäœæããããã»ã¹ã®çµäºæã«èªåçã«ã¯ãªã¢ãããªãããšã«æ³šæããŠãã ããã ããšãã°ã PPGïŒããã»ã¹ãã©ã€ããŒãã°ããŒãã«ïŒãšã¯ç°ãªããŸã ã ãã ããMapReduceãã€ãã©ã€ã³ã®ã¹ããŒãžéã®å¯Ÿè©±çšã«äœæãããäžéãã£ãã«ããããããäœæããã«ãŒãã³ã®æåŸã«åé€ãããå ŽåããããŸãã ãããã£ãŠããèªåã¯ãªãŒãã³ã°ãã¢ãŒãïŒã¯ã©ã¹ãã©ã¡ãŒã¿ãŒ#AUTOCLEANUPïŒãè¿œå ãããŸããããã®ã¢ãŒãã§ã¯ããªããžã§ã¯ããéãããããšãã«ïŒïŒ OnCloseãåŒã³åºãããæç¹ã§ïŒGlobalNameããããã£ã«ååãæ ŒçŽãããã°ããŒãã«ãåé€ãããŸãã
ïŒ Newã¡ãœããã§1ã€ã®å¿ é ãã©ã¡ãŒã¿ãŒã匷å¶ããããšã«æ³šæããŠãã ããïŒInïŒ OnNewã§ã¯ãInitvalã®ååãå®çŸ©ãããŠããªãå Žåã$$$ ThrowOnErrorãçæããŸãïŒã ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãããŒã¿ãã©ã³ã¹ããŒããšããŠåäœããã°ããŒãã«ã®ååãåãåãããšãæ³å®ããŠããŸãã
Class MR.Emitter.Ordered Extends MR.Base.Emitter { /// ... Method IsAtEnd() As %Boolean { quit ($data(@i%GlobalName)\10)=0 } /// emit $listbuild(key,value) Method Emit(EmitList... As %String) { #dim list As %String = "" for i=1:1:$get(EmitList) { set $li(list,i) = $get(EmitList(i)) } #dim name As %String = ..GlobalName set @name@($seq(@name)) = list } /// returns emitted $lb(key,value) Method GetNext() As %String { #dim value As %String #dim index As %String = $order(@i%GlobalName@(""), 1, value) if index '= "" { kill @i%GlobalName@(index) quit value } else { kill @i%GlobalName quit "" } } Method Dump() { zwrite @i%GlobalName } }
ãšããã¿ãã€ãã¬ãŒã¿ã€ãã¬ãŒã¿ã®åå«ã§ããããšããŸã èŠããŠãããŠãã ããã ãã®ããã圌ã¯IsAtEndãšGetNextãšãã2ã€ã®ã€ãã¬ãŒã¿é¢æ°ãå®è£ ããå¿ èŠããããŸãã
IsAtEndã¯åçŽã§ãïŒãµãŒãã¹ã°ããŒãã«ã«ããŒã¿ãå«ãŸããŠããªãå ŽåïŒã€ãŸãã $ dataïŒ.. GlobalNameïŒã10ãŸãã¯11ãè¿ããªãå Žåãã€ãŸããµãããªãŒã«ããŒã¿ãããããŒãããŸã ããå ŽåïŒãããŒã¿ã¹ããªãŒã ã®çµããã«éããŸããã
- Emitã¯ãçŸåšã®ãªã¹ãã®æåŸã«ããŒã¿ããŒããäœæããŸãã $ïŒlistbuildïŒ...ïŒïŒ [listbuild]ã®èŠçŽ ãšããŠãã¢ïŒãŸãã¯ã¢ãªãã£ã2xãã倧ããã¿ãã«ïŒãäœæããŸãã
ãåãã®ãšããã Sasha Koblovãããæžããããã«ã$ SEQUENCEã¯ã $ INCREMENTã䜿çšãããã»ãŒãã¹ãŠã®å Žæã§äœ¿çšã§ãããã«ãããã»ããµã¢ãŒããŸãã¯ãã«ããµãŒããŒã¢ãŒãïŒECPçµç±ïŒã§äœæ¥ããå Žåã«æé«ã®é床ãæäŸããŸãã 1ã€ã®ã°ããŒãã«ããŒãã«ã¢ã¯ã»ã¹ãããšãã®è¡çªã®æ°ãå°ãªãããã ãããã£ãŠãäžèšã®ã³ãŒãã§ã¯ã $ã·ãŒã±ã³ã¹ã䜿çšããŠãé åºä»ããªã¹ãã®æ¬¡ã®èŠçŽ ã®ã€ã³ããã¯ã¹ãéžæããŸãã
- ã¢ã«ãŽãªãºã ã®å察åŽã®ã¬ã·ãŒããŒã§ã¯ãGetNextïŒïŒã¯åçŽãª$ ORDERïŒ@ iïŒ GlobalNameïŒ ""ïŒïŒã䜿çšããŠã³ã¬ã¯ã·ã§ã³ããã¢ã€ãã ããã«ããŸãã ååŸããã€ã³ããã¯ã¹ãæã€èŠçŽ ã¯ãåŠçåŸã«ãªã¹ãããåé€ãããŸãã
ãªã¹ã/ã°ããŒãã«ããã¢ã€ãã ãåé€ãããã®ãªãã·ã§ã³ã¯ããã©ã¬ã«ã¢ãŒããšã®äºææ§ãããŸãé«ããªããããããã¯ãè¿œå ããããããŒã¿æ§é ãå€æŽããå¿ èŠãããããšã«æ³šæããŠãã ããã ããããä»¥æ¥ æ¬¡ã®ã·ãªãŒãºã§ã¯ãããããŒã®ã»ããå šäœã«å¯ŸããŠãReducerã1ã€ã ãã«ãªããŸãããã«ããµãŒããŒã®å®è£ ã«é²ãå Žåãå°æ¥çã«ã¯ãã®åé¡ã®è§£æ±ºã延æããŸãã
MR.Emitter.Orderedã«ãã£ãŠå®è£ ãããããŒã¿æ§é ã¯ãåºæ¬çã«åŸæ¥ã®FIFOã³ã¬ã¯ã·ã§ã³ïŒ "FirstIn-FirstOut"ïŒãå®è£ ããããšã«æ³šæããŠãã ããã ãªã¹ãã®æåŸã«æ°ããèŠçŽ ãè¿œå ãããªã¹ãã®å é ããåŒãåºããŸãã
ç¹å¥ãªå ŽåïŒèªåéçŽã䜿çšãããšããã¿
ã¯ãŒãã«ãŠã³ãã®äŸã§ãã€ãã©ã€ã³ã®ã¹ããŒãžéã§éä¿¡ããããŒã¿ãèŠããšïŒä»ã§ã¯ãªãããã®ãããªå®è£ ã瀺ããŠãããšãã«ïŒã次ã®ããšãããã«ããããŸãã
å®éããã¢<keyãvalue>ããæŸåºãããé åºã«ã¯é¢å¿ããããŸããã ããã«ãåºç€ãšãªãbtree *ãªããžããªã§ã¯ãããŒã®ãªã¹ããåžžã«ãœãŒããããŠãã°ããæ€çŽ¢ããããããåŸæ¥ã®å®è£ ã®ããã«ãŠã£ã¶ãŒãã§ãœãŒãããå¿ èŠããããŸããã
- ãããŠãç§ãã¡ã®å ŽåãããããŒåŽã§<keyã1>ãã¢ãèšè¿°ãããšããReducerã§åäœéã®åçŽãªéçŽãæ³å®ããŠããŸãã ã€ãŸã CachéObjectScriptã®å Žåã $ INCREMENTã®äœ¿çšã«äŸåããŸãã
ããã§ã¯ãéä¿¡æã«ãããããéçŽã§ããã®ã«ããªãäžå¿ èŠãªããŒã¿ã®ãã©ãã£ãã¯ã倧éã«éä¿¡ããã®ã§ããããïŒ
ããã¯ãMR.Emitter.SortedããŸãã«åäœããæ¹æ³ã§ãããMR.Emitter.Orderedã®åå«ã§ãïŒäžèšåç §ïŒã
/// Emitter which sorts by keys all emitted pairs or tuples (key, value(s)) Class MR.Emitter.Sorted Extends MR.Emitter.Ordered { Property AutoIncrement As %Boolean [ InitialExpression = 1 ]; /// emit $listbuild(key,value) Method Emit(EmitList... As %String) { #dim name As %String = ..GlobalName #dim key As %String #dim value As %String if $get(EmitList)=1 { // special case - only key name given, no value set key = $get(EmitList(1)) quit:key="" if ..AutoIncrement { #dim dummyX As %Integer = $increment(@name@(key)) ; $seq is non-deterministic } else { set @name@(key) = 1 } } else { set value = $get(EmitList(EmitList)) set EmitList = EmitList - 1 for i=1:1:$get(EmitList) { #dim index As %String = $get(EmitList(i)) quit:index="" set name = $name(@name@(index)) } if ..AutoIncrement { #dim dummyY As %Integer = $increment(@name,value) } else { set @name = value } } } /// ... }
æãåçŽãªå Žåããã¢<keyã1>ãçºè¡ããããå€ãçç¥ããã1ã€ã®ããŒ<key>ãããå Žåãèªåã€ã³ã¯ãªã¡ã³ãã¢ãŒãïŒAutoIncrement = 1ïŒã§åŒã³åºãããšãã«ãããŒã®å¯Ÿå¿ããã«ãŠã³ã¿ãŒãããã«ã€ã³ã¯ãªã¡ã³ããããšãã«ããŒã«ã«æé©åãå®è£ ããŸããã èªåã€ã³ã¯ãªã¡ã³ããæå¹ã«ãªã£ãŠããªãå Žåã¯ãããŒããŒãã1ã«ïŒåïŒå®çŸ©ããã ãã§ãããŒè»¢éã®äºå®ãä¿®æ£ããŸãã
ããäžè¬çãªå Žåã2ã€ã®èŠçŽ ãããŒãšå€ã®ãã¢<keyãvalue>ããŸãã¯å€æ°ã®èŠçŽ <keyãkey2ãkey3ã... keynãvalue>ïŒä»»æã®ã¢ãªãã£ã®ã¿ãã«ïŒã§ãã2ã€ã®åäœã¢ãŒãããããŸãã
èªåã€ã³ã¯ãªã¡ã³ãäžã«ãããŒã§ã¢ãã¬ã¹æå®ããã察å¿ããããŒãã®å€ãéä¿¡ãããå€ã§ããã«èŠçŽããŸãã
- autoãªã - å¢å -ãã®ããŒã®ãªã¹ãã§ã¢ãã¬ã¹æå®ããã察å¿ããããŒãã«ãæž¡ãããå€valueãå²ãåœãŠãŸãã
å¯å€æ°ã®åŒæ°ãèç©ããé åã«ã¿ãã«ãæž¡ãããšã«æ³šæããŠãã ããã æåŸãé€ããã®é åã®ãã¹ãŠã®èŠçŽ ã¯ã ãµãã€ã³ããã¯ã¹ã¢ãã¬ã¹ãšããŠäœ¿çšãããŸãã ã¿ãã«ã®æåŸã®èŠçŽ ãå€ãšèŠãªãããŸãã
ç§ãã¡ã®æ å ±ã«ããã°ãããããåã®ã¿ãã«ã®ããŒãšå€ã®ãã¢ã®ãã®ãããªç°åžžãªæ¡åŒµã¯ãéå®åã§ããããäžæã§ããå¯èœæ§ããããŸãã å³å¯ãªããŒå€ã¹ãã¬ãŒãžãããã°ããŒãã«ã¹ãã¬ãŒãžã䜿çšããå¿ èŠã¯ãããŸããããŸããéä¿¡èŠçŽ ã®å€æ¬¡å ããŒãç°¡åã«äœ¿çšã§ããŸãïŒãã§ãããããïŒãããã«ãããè¿œå ã®ããŒã¿ãã£ã¡ã³ã·ã§ã³ãå¿ èŠãšããã¢ã«ãŽãªãºã ã®å®è£ ãå€§å¹ ã«ä¿é²ãããå€§å¹ ã«æ¹åãããŸãã³ãŒããèªã¿ãããããç解ãç°¡çŽ åããŸãã çè«çã«ã¯...
IsAtEndãåå®çŸ©ãããMR.Emitter.Orderedããå®è£ ãç¶æ¿ãããããäžéã¹ãã¬ãŒãžãµãããŒãã®ããŒã¿ã®æåŸã§ãŒã以å€ã®å€ãè¿ãããšã«æ³šæããŠãã ããã
ãã ããGetNextãåå®çŸ©ããå¿ èŠããããŸãã éä¿¡ãããããŒã¿ã®é åºãšå éšã¹ãã¬ãŒãžã®åœ¢åŒãå€æŽãããããšãæãåºãããšã¯ããŠããŸããã
Class MR.Emitter.Sorted Extends MR.Emitter.Ordered { /// ... /// returns emitted $lb(key,value) Method GetNext() As %String { #dim name As %String = ..GlobalName #dim value As %String #dim ref As %String = $query(@name,1,value) if ref'="" { zkill @ref #dim i As %Integer #dim refLen As %Integer = $qlength(ref) #dim baseLen As %Integer = $qlength(name) #dim listbuild = "" for i=baseLen+1:1:refLen { set $li(listbuild,i-baseLen)=$qs(ref,i) } set $li(listbuild,*+1)=value quit listbuild } quit "" } }
GetNextïŒïŒã®æåŸã«ã $ LISTBUILD <>ãªã¹ããå¿ èŠã§ããããªããžããªå ã§ã¯ããã¢/ã¿ãã«ã®ããŒã¿ãéå±€ãªããžããªã®ããŒãã«æ£ãã°ã£ãŠããŸãã $ QUERYé¢æ°ã䜿çšãããšã$ LISTBUILD圢åŒã§ã®åŸç¶ã®åããã±ãŒãžåã®ããã«ãé åå ã®ããŒã¿ïŒãã¢/ã¿ãã«ã®å€ïŒãæã€ããŒãããã€ãã¹ã§ããŸããé åããã®ã€ã³ããã¯ã¹ã¯ã次ã®ãªã¹ãèŠçŽ ã«ãã£ãŠé 次远å ãããŸãïŒ $ LISTé¢æ°ãä»ããŠèŠçŽ ãå²ãåœãŠãããšã«ãã£ãŠãããŒãšå€ã®ãã¢ãŸãã¯ã¿ãã«ã®æåŸã®èŠçŽ ïŒã¯ãåãé¢æ°$ LISTïŒlistbuildã* + 1ïŒãä»ããŠçæããããªã¹ãã®æåŸã«è¿œå ãããŸãããã®å Žåã* + 1ã¯çŸåšã®æ«å°Ÿã«ç¶ããªã¹ãèŠçŽ ã®æ°ã瀺ããŸãã
ãã®äºæ³å€ã®å Žæã§ãCachéã®MapReduceã«é¢ãã話ãäžæããŸãã ãã®ã¹ããŒãªãŒã®ç¬¬2éšã§ã¯ãç¹å®ã®äŸãå®è£ ãããšãã«å°æ¥äœ¿çšãããåºæ¬çãªã€ã³ãã©ã¹ãã©ã¯ãã£ã€ã³ã¿ãŒãã§ã€ã¹ã瀺ããŸããã ãã§ã«æ¬¡ã®ã·ãªãŒãºã§ã¯ããã¹ãŠããŸãšããŠãWordCountã®å€å žçãªäŸãå®è£ ããŸãããæ¢ã«ObjectScriptã§å®è£ ããŠããŸãã é ããŸã§è¡ããªãã§ãã ããïŒ