é»ååååŒåžå Žã§ã¯èå³æ·±ãç¶æ³ãçºçããŠããŸãã ç·ãã£ãã·ã¥ãããŒã¯å¢å ããŠããŸããã売ãæã®æ°ãå¢å ããŠããŸãã ããã«ãããååºèã®ã·ã§ã¢ãäœäžãã競åãæ¿åããŠããŸãã å¹³åè³Œå ¥ãµã€ãºïŒãããã£ãŠå©çïŒãå¢ãã1ã€ã®æ¹æ³ã¯ã顧客ã«èå³ã®ããè¿œå ã®è£œåãæäŸããããšã§ãã
ãã®èšäºã§ã¯ãCloud Platformã«åºã¥ããŠç°å¢ãèšå®ããåºæ¬çãªæšå¥šã·ã¹ãã ããµããŒãããæ¹æ³ãåŠç¿ããŸããåºæ¬çãªæšå¥šã·ã¹ãã ã¯ãããã«éçºããã³æ¡åŒµã§ããŸãã
ãŠãŒã¶ãŒã«æšå¥šäºé ãéžæããŠæäŸã§ããäžåç£è³è²žä»£çåºã®Webãµã€ãã®ãœãªã¥ãŒã·ã§ã³ã«ã€ããŠèª¬æããŸãã

Google Cloud PlatformãåããŠäœ¿çšããå Žåã¯ãäžé£ã®ãŠã§ãããŒãã芧ãã ãã
[1æ19æ¥ãæšææ¥ã11ïŒ00ã¢ã¹ã¯ã¯æé]
Google Cloud Platformæ©èœã®æŠèŠ
ãŠã§ãããŒãšã³ããªãžã®ãªã³ã¯ [2æ3æ¥ãéææ¥ã11ïŒ00ã¢ã¹ã¯ã¯æé] Google Cloud Platformã€ã³ãã©ã¹ãã©ã¯ãã£ãµãŒãã¹
ãŠã§ãããŒãšã³ããªãžã®ãªã³ã¯ [2æ17æ¥ãéææ¥ã11ïŒ00ã¢ã¹ã¯ã¯æé] Google Cloud Platformã®ããã°ããŒã¿ãšæ©æ¢°åŠç¿ããŒã«
ãŠã§ãããŒãšã³ããªãžã®ãªã³ã¯ [3æ2æ¥ãæšææ¥ã11ïŒ00ã¢ã¹ã¯ã¯æé] ã¯ãŒã¯ã·ã§ããïŒGoogle Cloud PlatformãµãŒãã¹ã®ãã¥ãŒããªã¢ã«
|
ãŠã§ãããŒãªãŒã | |
---|---|
ãªã¬ã°ã»ã€ããã³@GoogleAmsterdam ![]() ã¯ã©ãŠãWebãœãªã¥ãŒã·ã§ã³ãšã³ãžã㢠Olegã¯ãæ§æã®ã³ã¹ããåæããGoogle Cloud Platformã«åºã¥ãã¯ã©ãŠããœãªã¥ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ãèšç»ããããã®ããŒã«ãéçºããŠããŸãã Olegã®éçºã¯ãGoogle Cloud Platform Pricing Calculatorãªã©ã®å ¬éãããŠããGCPããŒã«ã§äœ¿çšãããŠããŸã | ããããªãŒã»ããŽã¡ã³ãã¹ããŒ@GoogleAmsterdam ![]() ã«ã¹ã¿ããŒãšã³ãžã㢠Dmitryã¯ãGoogle Cloud Platformã®ããžãã¹é¡§å®¢åãã®è²©å£²ãµããŒããšã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ã«åŸäºããŠããŸãã Dmitryã®äž»ãªçŠç¹ã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ãµãŒãã¹ã®åéã«ãããŸãïŒGoogle Compute EngineïŒGCEïŒãGoogle App EngineïŒGAEïŒãGoogle Container EngineïŒGKE / KubernetesïŒã |
ããããããã®èšäºãèªãã§ãGoogle Cloud Platformã§ãã®ã·ããªãªãåäœæããããšããå§ãããŸãã ãªã³ã¯ãã¯ãªãã¯ãããšãGCPãµãŒãã¹ã60æ¥éãã¹ãããããã®300ãã«ãåãåããŸã |
ã¹ã¯ãªãã
ã¢ã³ãã¯å°çšãµã€ãã§å¥èãæ¢ããŠããŸãã 以åã¯ã圌女ã¯ãã§ã«ãã®ãµã€ãããäœå® ãåããŠããã€ãã®ã¬ãã¥ãŒãæ®ããŠãããããã·ã¹ãã ã«ã¯åœŒå¥³ã®å¥œã¿ã«åºã¥ããŠæšå¥šäºé ãéžæããã®ã«ååãªããŒã¿ããããŸãã ã¢ã³ãã®ãããã£ãŒã«ã®æšå®ããå€æãããšã圌女ã¯éåžžãã¢ããŒãã§ã¯ãªã家ãåããŠããŸãã ã·ã¹ãã ã¯ã圌女ã«åãã«ããŽãªã®äœããæäŸããå¿ èŠããããŸãã
ãœãªã¥ãŒã·ã§ã³ã®æŠèŠ
ãªã¢ã«ã¿ã€ã ïŒãµã€ãäžïŒãŸãã¯äºåŸïŒé»åã¡ãŒã«çµç±ïŒã§æšå¥šäºé ãéžæããã«ã¯ããœãŒã¹ããŒã¿ãå¿ èŠã§ãã ããã§ããŠãŒã¶ãŒã®èšå®ãããããªãå Žåã¯ããŠãŒã¶ãŒãéžæããææ¡ã«åºã¥ããŠæšå¥šäºé ãéžæã§ããŸãã ãã ããã·ã¹ãã ã¯çµ¶ããåŠç¿ãã顧客ã®å¥œã¿ã«é¢ããããŒã¿ãèç©ããå¿ èŠããããŸãã ååãªæ å ±ãåéããããšãæ©æ¢°åŠç¿ã·ã¹ãã ã䜿çšããŠé¢é£ããæšå¥šäºé ãåæããã³éžæã§ããããã«ãªããŸãã ããã«ãã·ã¹ãã ã¯ä»ã®ãŠãŒã¶ãŒã«é¢ããæ å ±ãéä¿¡ããããæã åãã¬ãŒãã³ã°ãããã§ããŸãã ãã®äŸã§ã¯ãæšå¥šã·ã¹ãã ã¯ãã§ã«æ©æ¢°åŠç¿ã¢ã«ãŽãªãºã ã䜿çšããã®ã«ååãªããŒã¿ãèç©ããŠããŸãã
ãã®ãããªã·ã¹ãã ã§ã®ããŒã¿åŠçã¯ãéåžžãåéãä¿ç®¡ãåæãæšå¥šäºé ã®éžæã®4段éã§å®è¡ãããŸãïŒäžå³ãåç §ïŒã

ãã®ãããªã·ã¹ãã ã®ã¢ãŒããã¯ãã£ã¯ã次ã®ããã«æŠç¥çã«è¡šãããšãã§ããŸãã

åã¹ãããã¯ãç¹å®ã®èŠä»¶ã«åãããŠã«ã¹ã¿ãã€ãºã§ããŸãã ã·ã¹ãã ã¯æ¬¡ã®èŠçŽ ã§æ§æãããŠããŸãã
- ããã³ããšã³ã ãã¹ãŠã®ãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãèšé²ããããã€ãŸãããŒã¿ãåéãããã¹ã±ãŒã©ãã«ã€ã³ã¿ãŒãã§ã€ã¹ããŒãã
- ä¿ç®¡ æ©æ¢°åŠç¿ãã©ãããã©ãŒã ã§äœ¿çšå¯èœãªæ°žç¶ã¹ãã¬ãŒãžã ããŒã¿ã®èªã¿èŸŒã¿ã«ã¯ãããŒã¿ã®ã€ã³ããŒãããšã¯ã¹ããŒããå€æãªã©ãããã€ãã®æé ãå«ãŸããŸãã
- æ©æ¢°åŠç¿ã åéãããããŒã¿ã®åæãšæšå¥šäºé ã®éžæãå®è¡ãããæ©æ¢°åŠç¿ãã©ãããã©ãŒã ã
- 2çªç®ã®èŠçŽ ã¯ã¹ãã¬ãŒãžã§ãã ããã³ããšã³ãéšåããªã¢ã«ã¿ã€ã ãŸãã¯äºåŸçã«äœ¿çšããå¥ã®ãªããžããª-æšå¥šäºé ãæäŸããå¿ èŠãããå Žåã«å¿ããŠã
ã³ã³ããŒãã³ãã®éžæ
é«éã§äŸ¿å©ãå®äŸ¡ã§æ£ç¢ºãªãœãªã¥ãŒã·ã§ã³ãåŸãããã«ã Google App Engine ã Google Cloud SQL ãããã³Google Compute EngineããŒã¹ã®Apache SparkãéžæãããŸããã æ§æã¯ãbdutilã¹ã¯ãªããã䜿çšããŠäœæãããŸããã
App EngineãµãŒãã¹ã䜿çšãããšã1ç§ãããäœäžãã®ãªã¯ãšã¹ããåŠçã§ããŸãã ããã«ã管çã容æã§ããµã€ãã®äœæããå éšã¹ãã¬ãŒãžãžã®ããŒã¿ã®æžã蟌ã¿ãŸã§ãããããã¿ã¹ã¯ãå®è¡ããã³ãŒãããã°ããèšè¿°ããŠå®è¡ã§ããŸãã
Cloud SQLã¯ããœãªã¥ãŒã·ã§ã³ã®äœæãç°¡çŽ åããŸãã æ倧208 GBã®RAMãæèŒãã32ã³ã¢ã®ä»®æ³ãã·ã³ãå±éããGBãããæ¯ç§30ã®I / Oæäœãšæ°åã®åææ¥ç¶ã«ããããªã³ããã³ãã§æ倧10 TBã®ã¹ãã¬ãŒãžãå¢ããããšãã§ããŸãã ããã¯ãæ€èšäžã®ã·ã¹ãã ããã³ä»ã®å€ãã®å®éã®ã±ãŒã¹ã«ãšã£ãŠååãããã»ã©ã§ãã ããã«ãCloud SQLã¯Sparkããã®çŽæ¥ã¢ã¯ã»ã¹ããµããŒãããŠããŸãã
Sparkã¯ãåŸæ¥ã®Hadoopããã»ããµãšæ¯èŒããŠåªããŠããŸããå ·äœçãªãœãªã¥ãŒã·ã§ã³ã«ããããŸãããããã©ãŒãã³ã¹ã¯10ã100åé«ããªããŸãã Spark MLlibã©ã€ãã©ãªã䜿çšãããšãæ°åã®è©äŸ¡ãæ°åã§åæããã¢ã«ãŽãªãºã ãããé »ç¹ã«å®è¡ããŠãæšå¥šäºé ãææ°ã®ç¶æ ã«ä¿ã€ããšãã§ããŸãã Sparkã¯ãããã·ã³ãã«ãªããã°ã©ãã³ã°ã¢ãã«ããã䟿å©ãªAPIãããã³ããæ±çšçãªèšèªãç¹åŸŽã§ãã èšç®ã®ããã«ããã®ãã¬ãŒã ã¯ãŒã¯ã¯RAMãæ倧éã«äœ¿çšããŠããã£ã¹ã¯ã¢ã¯ã»ã¹ã®åæ°ãæžãããŸãã ãŸããI / Oæäœã®æ°ãæå°éã«æããããŸãã åæã€ã³ãã©ã¹ãã©ã¯ãã£ããã¹ããããã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãCompute Engineã䜿çšãããŸãã ããã«ããã䜿çšã®äºå®ã«å¿ããŠæ¯åæ¯æããè¡ããããããã³ã¹ããå€§å¹ ã«åæžã§ããŸãã
次ã®å³ã¯ãåãã·ã¹ãã ã¢ãŒããã¯ãã£ã瀺ããŠããŸãããçŸåšã¯äœ¿çšãããŠãããã¯ãããžãå«ãŸããŠããŸãã

ããŒã¿åé
æšå¥šã·ã¹ãã ã¯ãæé»çãªæ å ±ïŒåäœïŒãŸãã¯æ瀺çãªæ å ±ïŒè©äŸ¡ãšã¬ãã¥ãŒïŒã«åºã¥ããŠãŠãŒã¶ãŒããŒã¿ãåéã§ããŸãã
ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ãŠãŒã¶ãŒã®ä»å ¥ãªãã«ãã°ã«èšé²ã§ãããããåäœããŒã¿ã®åéã¯éåžžã«ç°¡åã§ãã ãã®ã¢ãããŒãã®æ¬ ç¹ã¯ãåéãããããŒã¿ãåæããã®ãé£ãããªãããšã§ããããšãã°ãæãéèŠãªããŒã¿ãèå¥ããããšãã§ããŸãã ãã°ãšã³ããªã䜿çšããŠæ瀺çãªã¢ã¯ãã£ããã£ããŒã¿ãåæããäŸã¯ã ããããå ¥æã§ããŸã ã
è©äŸ¡ãšã¬ãã¥ãŒãåéããããšã¯ãå€ãã®ãŠãŒã¶ãŒãããããæ®ãããšã«æ¶æ¥µçã§ãããããããå°é£ã§ãã ãã ãã顧客ã®å¥œã¿ãç解ããã®ã«æã圹ç«ã€ã®ã¯ãã®ãããªããŒã¿ã§ãã
ããŒã¿ä¿å
ã¢ã«ãŽãªãºã ã§äœ¿çšã§ããããŒã¿ãå€ãã»ã©ãæšå¥šäºé ã¯ããæ£ç¢ºã«ãªããŸãã ã€ãŸããããã«ããã°ããŒã¿ã®æäœãéå§ããå¿ èŠããããŸãã
䜿çšããã¹ãã¬ãŒãžã®ã¿ã€ãã®éžæã¯ãæšå¥šããŒã¿ãäœæããããŒã¿ã«åºã¥ããŠç°ãªããŸãã NoSQLããŒã¿ããŒã¹ãSQLããŸãã¯ãªããžã§ã¯ãã¹ãã¢ã§ãããŸããŸããã ããŒã¿ã®éãšçš®é¡ã«å ããŠãå®è£ ã®å®¹æããç°å¢ã«çµ±åããæ©èœã移è¡ã®ãµããŒããªã©ã®èŠå ãèæ ®ããå¿ èŠããããŸãã
ã¹ã±ãŒã©ãã«ãªç®¡çãããããŒã¿ããŒã¹ã¯ããŠãŒã¶ãŒã®è©äŸ¡ãšã¢ã¯ã·ã§ã³ãä¿åããã®ã«æé©ã§ããã䜿ãããããããå€ãã®æéãè²»ããããšãã§ããŸãã Cloud SQLã¯ãããã®èŠä»¶ãæºããã ãã§ãªããSparkããããŒã¿ãç°¡åã«ããŠã³ããŒãã§ããããã«ããŸãã
次ã®ã³ãŒãäŸã¯ãCloud SQLããŒãã«ã¹ããŒãã瀺ããŠããŸãã è³è²žç©ä»¶ã¯ã宿æ³æœèšãããŒãã«ã«å ¥åããããã®ç©ä»¶ã®ãŠãŒã¶ãŒè©äŸ¡ã¯ãè©äŸ¡ãããŒãã«ã«å ¥åãããŸãã
CREATE TABLE Accommodation ( id varchar(255), title varchar(255), location varchar(255), price int, rooms int, rating float, type varchar(255), PRIMARY KEY (ID) ); CREATE TABLE Rating ( userId varchar(255), accoId varchar(255), rating int, PRIMARY KEY(accoId, userId), FOREIGN KEY (accoId) REFERENCES Accommodation(id) );
Sparkã¯ãHadoop HDFSãCloud Storageãªã©ã®ããŸããŸãªãœãŒã¹ããããŒã¿ãååŸã§ããŸãã ãã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŒã¿ã¯JDBCã³ãã¯ã¿ãŒã䜿çšã㊠Cloud SQLããçŽæ¥æœåºãããŸã ã Sparkãžã§ãã¯äžŠè¡ããŠå®è¡ãããããããã®ã³ãã¯ã¿ãŒã¯ã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§äœ¿çšå¯èœã§ãªããã°ãªããŸããã
ããŒã¿åæ
åæãæåãããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®èŠä»¶ãæ確ã«çå®ããå¿ èŠããããŸãã
- é©ææ§ ã ã¢ããªã¯ã©ããããæ©ãæšå¥šäºé ãäœæããå¿ èŠããããŸããïŒ
- ããŒã¿ãã£ã«ã¿ãªã³ã° ã ã¢ããªã±ãŒã·ã§ã³ã¯ããŠãŒã¶ãŒã®å¥œã¿ãä»ã®ãŠãŒã¶ãŒã®æèŠããŸãã¯è£œåã®é¡äŒŒæ§ã®ã¿ã«åºã¥ããŠæšå¥šäºé ãäœæããŸããïŒ
é©ææ§
æåã«æ±ºå®ããããšã¯ããŠãŒã¶ãŒãã©ãã ãæ©ãæšå¥šäºé ãåãåããã§ãã ããã«ããµã€ãã衚瀺ãããšãããŸãã¯åŸã§ãã¡ãŒã«ã§ïŒ æåã®ã±ãŒã¹ã§ã¯ããã¡ãããåæã¯ããå¹ççã§ãªããã°ãªããŸããã
- ãªã¢ã«ã¿ã€ã åæã«ã¯ãäœææã®ããŒã¿ã®åŠçãå«ãŸããŸãã ãã®ã¿ã€ãã®ã·ã¹ãã ã§ã¯ãååãšããŠãã€ãã³ããããŒãåŠçããã³åæã§ããããŒã«ã䜿çšãããŸãã ãã®å Žåã®æšå¥šäºé
ã¯ããã«äœæãããŸãã
- ãããåæã«ã¯ãå®æçãªããŒã¿åŠçãå«ãŸããŸãã ãã®ã¢ãããŒãã¯ãå®éã®çµæãåŸãããã«ååãªããŒã¿ãåéããå¿
èŠãããå Žåãããšãã°1æ¥ãããã®è²©å£²éã調ã¹ãå Žåã«é©ããŠããŸãã ãã®å Žåã®æšå¥šäºé
ã¯äºåŸçã«éçºãããé»åã¡ãŒã«åœ¢åŒã§æäŸãããŸãã
- ã»ãŒãªã¢ã«ã¿ã€ã ã®åæã§ã¯ãæ°åãŸãã¯æ°ç§ããšã«åæããŒã¿ãæŽæ°ããŸãã ãã®ã¢ãããŒãã«ããã1ã€ã®ãŠãŒã¶ãŒã»ãã·ã§ã³å ã§æšå¥šäºé ãæäŸã§ããŸãã
ä»»æã®ã«ããŽãªã®é©ææ§ãéžæã§ããŸããããªã³ã©ã€ã³è²©å£²ã®å Žåããã©ãã£ãã¯ã®éãšåŠçãããããŒã¿ã®ã¿ã€ãã«å¿ããŠããããåæãšã»ãŒãªã¢ã«ã¿ã€ã ã®åæã®ã¯ãã¹ãæé©ã§ãã åæãã©ãããã©ãŒã ã¯ãããŒã¿ããŒã¹ãšçŽæ¥é£æºããããšããæ°žç¶ã¹ãã¬ãŒãžã«å®æçã«ä¿åããããã³ããšé£æºããããšãã§ããŸãã
ããŒã¿ãã£ã«ã¿ãªã³ã°
ãã£ã«ã¿ãªã³ã°ã¯ãæšå¥šã·ã¹ãã ã®éèŠãªã³ã³ããŒãã³ãã§ãã ãã£ã«ã¿ãªã³ã°ã®äž»ãªã¢ãããŒãã¯æ¬¡ã®ãšããã§ãã
- æšå¥šäºé ãå±æ§ãã€ãŸããŠãŒã¶ãŒã衚瀺ãŸãã¯è©äŸ¡ããååãšã®é¡äŒŒæ§ã«ãã£ãŠéžæãããå Žåã®ã³ã³ãã³ãã
- ã¯ã©ã¹ã¿ãŒãäºãã«ããŸãçµã¿åããããååãéžæããããšãã ãã ããä»ã®ãŠãŒã¶ãŒã®æèŠãè¡åã¯èæ ®ãããŸããã
- 奜ã¿ã䌌ãŠãããŠãŒã¶ãŒã衚瀺ãŸãã¯éžæãã補åãéžæãããå Žåã®å ±åäœæ¥ã
Cloud Platformã¯3ã€ã®ã¿ã€ããã¹ãŠããµããŒãããŠããŸããããã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãApache Sparkã«åºã¥ãå調ãã£ã«ã¿ãªã³ã°ã¢ã«ãŽãªãºã ãéžæãããŸããã ã³ã³ãã³ããšã¯ã©ã¹ã¿ãŒãã£ã«ã¿ãªã³ã°ã®è©³çŽ°ã«ã€ããŠã¯ã ä»é²ãåç §ããŠãã ããã
å調ãã£ã«ã¿ãªã³ã°ã«ããã補åã®å±æ§ããæœè±¡åãããŠãŒã¶ãŒã®å¥œã¿ãèæ ®ããäºæž¬ãè¡ãããšãã§ããŸãã ãã®ã¢ãããŒãã¯ãåã補åã奜ã2人ã®ãŠãŒã¶ãŒã®å奜ãåããŸãŸã§ãããšããåæã«åºã¥ããŠããŸãã
è©äŸ¡ãšã¢ã¯ã·ã§ã³ã«é¢ããããŒã¿ã¯ãããªãã¯ã¹ã®ã»ãããšããŠã補åãšãŠãŒã¶ãŒã¯æ°éãšããŠæ瀺ã§ããŸãã ã·ã¹ãã ã¯ãããªãã¯ã¹å ã®æ¬ èœã»ã«ãåãã補åã«å¯ŸãããŠãŒã¶ãŒã®æ 床ãäºæž¬ããããšããŸãã 以äžã¯ã1ã€ã®ãããªãã¯ã¹ã®2ã€ã®ãªãã·ã§ã³ã§ããæåã®ãªãã·ã§ã³ã¯ãæ¢åã®æšå®å€ã瀺ããŠããŸãã 2çªç®ã§ã¯ããããã¯åäžæ§ã§ç€ºãããæ¬ èœããè©äŸ¡ã¯ãŒãã§ç€ºãããŸãã ã€ãŸãã2çªç®ã®ãªãã·ã§ã³ã¯ççå€è¡šã§ããããŠãããã¯ãŠãŒã¶ãŒãšè£œåãšã®å¯Ÿè©±ã瀺ããŸãã

å調ãã£ã«ã¿ãªã³ã°ã§ã¯ãäž»ã«2ã€ã®æ¹æ³ã䜿çšãããŸãã
- anamnestic-ã·ã¹ãã ã¯è£œåãŸãã¯ãŠãŒã¶ãŒéã®äžèŽãèšç®ããŸãã
- ã¢ãã« -ã·ã¹ãã ã¯ããŠãŒã¶ãŒã補åãè©äŸ¡ããæ¹æ³ãšå®è¡ããã¢ã¯ã·ã§ã³ãèšè¿°ããã¢ãã«ã«åºã¥ããŠåäœããŸãã
ãã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ããŠãŒã¶ãŒè©äŸ¡ã«åºã¥ãã¢ãã«ææ³ã䜿çšãããŸãã
ãã®ãœãªã¥ãŒã·ã§ã³ã«å¿ èŠãªãã¹ãŠã®åæããŒã«ã¯ãSparkã®Pythonããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã§ããPySparkã§å©çšã§ããŸãã ScalaãšJavaã¯è¿œå ã®æ©äŒãæäŸããŸãã Sparkã®ããã¥ã¡ã³ããåç §ããŠãã ããã
ã¢ãã«ãã¬ãŒãã³ã°
Spark MLlibã¯ãALSïŒAlternating Least SquaresïŒã¢ã«ãŽãªãºã ã䜿çšããŠã¢ãã«ããã¬ãŒãã³ã°ããŸãã å€äœãšåæ£ã®æé©ãªæ¯çãå®çŸããã«ã¯ã次ã®ãã©ã¡ãŒã¿ãŒã®å€ã調æŽããå¿ èŠããããŸãã
- ã©ã³ã¯ -ãŠãŒã¶ãŒãè©äŸ¡ããéã«ã¬ã€ãããããç§ãã¡ã«ãšã£ãŠæªç¥ã®èŠå ã®æ°ã ç¹ã«ãããã«ã¯å¹Žéœ¢ãæ§å¥ãå Žæãå«ãŸããŸãã ããçšåºŠãã©ã³ã¯ãé«ãã»ã©ãæšå¥šã®ç²ŸåºŠã¯é«ããªããŸãã ãã®ãã©ã¡ãŒã¿ãŒã®æå°å€ã¯5ã§ãã æšå¥šã®å質ã®å·®ãæžå°ãå§ãããŸã§ïŒãŸãã¯ååãªã¡ã¢ãªãšããã»ããµã®é»åãåŸããããŸã§ïŒã5ãã€å¢åããŸãã
- ã©ã ãã¯ã åãã¬ãŒãã³ã°ãåé¿ããæ£ååãã©ã¡ãŒã¿ãŒã§ããã€ãŸãã倧ããªåæ£ãšå°ããªãã€ã¢ã¹ã®ããç¶æ³ã§ãã åæ£ã¯ãç¹å®ã®ãã€ã³ãã®çè«çã«æ£ããå€ã«é¢ããŠïŒæ°åã®ãã¹ã®åŸïŒè¡ãããäºæž¬ã®ã°ãã€ãã§ãã ãªãã»ãã-çã®å€ããã®äºæž¬ã®è·é¢ã åãã¬ãŒãã³ã°ã¯ãã¢ãã«ãæ¢ç¥ã®ãã€ãºã¬ãã«ã®ãã¬ãŒãã³ã°ããŒã¿ã§é©åã«æ©èœããå Žåã«èŠ³å¯ãããŸãããå®éã«ã¯äžååãªçµæã瀺ããŸãã ã©ã ãã倧ããã»ã©ãåãã¬ãŒãã³ã°ã¯å°ãªããªããŸããããã€ã¢ã¹ã¯é«ããªããŸãã ãã¹ãã«ã¯ã0.01ã1ãããã³10ã®å€ããå§ãããŸãã
ãã®å³ã¯ãããŸããŸãªåæ£ããã³å€äœæ¯ã瀺ããŠããŸãã ã¿ãŒã²ããã®äžå¿ã¯ãã¢ã«ãŽãªãºã ã䜿çšããŠäºæž¬ããå€ã§ãã

- å埩 -ãã¬ãŒãã³ã°ãã¹ã®æ°ã ãã®äŸã§ã¯ããã©ã³ã¯ããã©ã¡ãŒã¿ãŒãšãã©ã ãããã©ã¡ãŒã¿ãŒã®ããŸããŸãªçµã¿åããã«å¯ŸããŠã5ã10ãããã³20åã®å埩ãå®è¡ããå¿ èŠããããŸãã
以äžã¯ãSparkã§ALSãã¬ãŒãã³ã°ã¢ãã«ãå®è¡ãããµã³ãã«ã³ãŒãã§ãã
from pyspark.mllib.recommendation import ALS model = ALS.train(training, rank = 10, iterations = 5, lambda_=0.01)
ã¢ãã«éžæ
ALSã¢ã«ãŽãªãºã ã«åºã¥ãå調ãã£ã«ã¿ãªã³ã°ã§ã¯ã3ã€ã®ããŒã¿ã»ããã䜿çšãããŸãã
- ãã¬ãŒãã³ã°ã»ããã«ã¯ãæ¢ç¥ã®å€ãæã€ããŒã¿ãå«ãŸããŠããŸãã ãããçæ³çãªçµæã§ãã ãã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ããã®ãµã³ãã«ã«ã¯ãŠãŒã¶ãŒè©äŸ¡ãå«ãŸããŠããŸãã
- ãã¹ãã»ããã«ã¯ããã©ã¡ãŒã¿ãŒã®æé©ãªçµã¿åãããååŸããæé©ãªã¢ãã«ãéžæããããã«ãã¬ãŒãã³ã°ã»ããã調æŽã§ããããŒã¿ãå«ãŸããŠããŸãã
- ãã¹ããµã³ãã«ã«ã¯ãæé©ãªã¢ãã«ã®åäœã確èªã§ããããŒã¿ãå«ãŸããŠããŸãã ããã¯ãå®éã®åæãšåçã§ãã
æé©ãªã¢ãã«ãéžæããã«ã¯ãèšç®ãããã¢ãã«ããã¹ããµã³ãã«ãããã³ãã®ãµã€ãºãåºç€ãšããŠãäºä¹å¹³åå¹³æ¹æ ¹èª€å·®ïŒRMSEïŒãèšç®ããå¿ èŠããããŸãã RMSEãå°ããã»ã©ãã¢ãã«ã®ç²ŸåºŠã¯é«ããªããŸãã
å§åã®çµè«
åæçµæã®åºåãé«éåããã«ã¯ãããããããŒã¿ããŒã¹ã«ããŒãããŠããªã³ããã³ãã§ã¯ãšãªãå®è¡ã§ããããã«ããå¿ èŠããããŸãã ããã«ã¯Cloud SQLãæé©ã§ãã Spark 1.4ã䜿çšãããšãPySparkããããŒã¿ããŒã¹ã«åæçµæãçŽæ¥æžã蟌ãããšãã§ããŸãã
æšå¥šè¡šã®æŠèŠã¯æ¬¡ã®ãšããã§ãã
CREATE TABLE Recommendation ( userId varchar(255), accoId varchar(255), prediction float, PRIMARY KEY(userId, accoId), FOREIGN KEY (accoId) REFERENCES Accommodation(id) );
ã³ãŒãåââæ
次ã«ããã¬ãŒãã³ã°ã¢ãã«ã®ã³ãŒããæ€èšããŸãã
Cloud SQLããããŒã¿ãååŸãã
Spark SQLã³ã³ããã¹ãã䜿çšãããšãJDBCã³ãã¯ã¿ãä»ããŠCloud SQLã€ã³ã¹ã¿ã³ã¹ã«ç°¡åã«æ¥ç¶ã§ããŸãã ããŒã¿ã¯DataFrame圢åŒã§ããŒããããŸãã
pyspark / app_collaborative.py
jdbcDriver = 'com.mysql.jdbc.Driver' jdbcUrl = 'jdbc:mysql://%s:3306/%s?user=%s&password=%s' % (CLOUDSQL_INSTANCE_IP, CLOUDSQL_DB_NAME, CLOUDSQL_USER, CLOUDSQL_PWD) dfAccos = sqlContext.load(source='jdbc', driver=jdbcDriver, url=jdbcUrl, dbtable=TABLE_ITEMS) dfRates = sqlContext.load(source='jdbc', driver=jdbcDriver, url=jdbcUrl, dbtable=TABLE_RATINGS)
DataFrameãRDDã«å€æããããŒã¿ã»ãããäœæããŸã
Sparkã¯RDDïŒResilient Distributed DatasetïŒã®æŠå¿µã«åºã¥ããŠããŸããããã¯ãèŠçŽ ã䞊è¡ããŠæäœã§ããæœè±¡åã§ãã RDDã¯ãæ°žç¶ã¹ãã¬ãŒãžã«åºã¥ãèªã¿åãå°çšã®ããŒã¿ã³ã¬ã¯ã·ã§ã³ã§ãã ãã®ãããªã³ã¬ã¯ã·ã§ã³ã¯ã¡ã¢ãªå ã§åæã§ãããããå埩åŠçãå¯èœã§ãã
èŠããŠããããã«ãæé©ãªã¢ãã«ãéžæããã«ã¯ãããŒã¿ã»ããã3ã€ã®ãµã³ãã«ã«åå²ããå¿ èŠããããŸãã 次ã®ã³ãŒãã§ã¯ãéè€ããªãå€ãã©ã³ãã ã«60/20/20ã®å²åã§åé¢ããè£å©é¢æ°ã䜿çšããŠããŸãã
pyspark / app_collaborative.py
rddTraining, rddValidating, rddTesting = dfRates.rdd.randomSplit([6,2,2])
ã泚æ RatingããŒãã«ã®åã¯ãaccoIdãuserIdãratingã®é åºã§é 眮ããå¿ èŠããããŸãã ããã¯ãALSã¢ã«ãŽãªãºã ãç¹å®ã®è£œå/ãŠãŒã¶ãŒã®ãã¢ã«åºã¥ããŠäºæž¬ãè¡ããšããäºå®ã«ãããã®ã§ãã é åºãçã£ãŠããå Žåã¯ãRDDã®ãããæ©èœã䜿çšããŠããŒã¿ããŒã¹ãå€æŽããããåã䞊ã¹æ¿ããããšãã§ããŸãã
ãã¬ãŒãã³ã°ã¢ãã«ã®ãã©ã¡ãŒã¿ãŒã®éžæ
ãã§ã«è¿°ã¹ãããã«ãALSã¡ãœããã§ã¯ãæé©ãªã¢ãã«ãæçµçã«ååŸã§ããããã«ãã©ã³ã¯ãæ£ååãããã³å埩ã調æŽããããšãã¿ã¹ã¯ã§ãã ã·ã¹ãã ã«ã¯ãã§ã«ãŠãŒã¶ãŒã®è©äŸ¡ãããããããã¬ã€ã³æ©èœã®çµæããã¹ãéžæãšæ¯èŒããå¿ èŠããããŸãã ãã¬ãŒãã³ã°ãµã³ãã«ããŠãŒã¶ãŒã®å¥œã¿ãèæ ®ã«å ¥ããŠããããšã確èªããå¿ èŠããããŸãã
pyspark / find_model_collaborative.py
for cRank, cRegul, cIter in itertools.product(ranks, reguls, iters): model = ALS.train(rddTraining, cRank, cIter, float(cRegul)) dist = howFarAreWe(model, rddValidating, nbValidating) if dist < finalDist: print("Best so far:%f" % dist) finalModel = model finalRank = cRank finalRegul = cRegul finalIter = cIter finalDist = dist
ã泚æ howFarAreWeé¢æ°ã¯ãã¢ãã«ã䜿çšããŠã補å/ãŠãŒã¶ãŒã®ãã¢ã®ã¿ã«åºã¥ããŠãã¹ãã»ããã®æšå®å€ãäºæž¬ããŸãã
pyspark / find_model_collaborative.py
def howFarAreWe(model, against, sizeAgainst): # Ignore the rating column againstNoRatings = against.map(lambda x: (int(x[0]), int(x[1])) ) # Keep the rating to compare against againstWiRatings = against.map(lambda x: ((int(x[0]),int(x[1])), int(x[2])) ) # Make a prediction and map it for later comparison # The map has to be ((user,product), rating) not ((product,user), rating) predictions = model.predictAll(againstNoRatings).map(lambda p: ( (p[0],p[1]), p[2]) ) # Returns the pairs (prediction, rating) predictionsAndRatings = predictions.join(againstWiRatings).values() # Returns the variance return sqrt(predictionsAndRatings.map(lambda s: (s[0] - s[1]) ** 2).reduce(add) / float(sizeAgainst))
ãŠãŒã¶ãŒã«ãšã£ãŠæãæ£ç¢ºãªäºæž¬ã®èšç®
æé©ãªã¢ãã«ãéžæãããšãåæ§ã®è¶£å³ãæã€ä»ã®ãŠãŒã¶ãŒã®å¥œã¿ã«åºã¥ããŠããŠãŒã¶ãŒãäœã«èå³ãæã€ããäºæž¬ããå¯èœæ§ãéåžžã«é«ããªããŸãã 以äžã¯ãåè¿°ã®ãããªãã¯ã¹å³ã§ãã
pyspark / app_collaborative.py
# Build our model with the best found values # Rating, Rank, Iteration, Regulation model = ALS.train(rddTraining, BEST_RANK, BEST_ITERATION, BEST_REGULATION) # Calculate all predictions predictions = model.predictAll(pairsPotential).map(lambda p: (str(p[0]), str(p[1]), float(p[2]))) # Take the top 5 ones topPredictions = predictions.takeOrdered(5, key=lambda x: -x[2]) print(topPredictions) schema = StructType([StructField("userId", StringType(), True), StructField("accoId", StringType(), True), StructField("prediction", FloatType(), True)]) dfToSave = sqlContext.createDataFrame(topPredictions, schema) dfToSave.write.jdbc(url=jdbcUrl, table=TABLE_RECOMMENDATIONS, mode='overwrite')
æãæ£ç¢ºãªäºæž¬ãä¿åãã
ãã¹ãŠã®äºæž¬ã®ãªã¹ããåãåã£ãåŸãæåã®10åã®äºæž¬ãCloud SQLã«ä¿åããå¿ èŠããããŸããããã«ãããããšãã°ãµã€ãã«å ¥ããšãã«ã·ã¹ãã ããŠãŒã¶ãŒã«æšå¥šãçºè¡ãå§ããŸã
pyspark / app_collaborative.py
dfToSave = sqlContext.createDataFrame(topPredictions, schema) dfToSave.write.jdbc(url=jdbcUrl, table=TABLE_RECOMMENDATIONS, mode='overwrite')
ãœãªã¥ãŒã·ã§ã³ã®çºå£²
åã ã®ãŠãŒã¶ãŒåãã®æšå¥šäºé ãéçºããã³è¡šç€ºã§ãããœãªã¥ãŒã·ã§ã³ãèµ·åããããã®æ®µéçãªæé ã¯ã GitHubã§å ¥æã§ããŸã ã
SQLã¯ãšãªã³ãŒãã®æåŸã®ãã©ã°ã¡ã³ãã¯ãããŒã¿ããŒã¹ããæãé¢é£æ§ã®é«ãæšå¥šäºé ãåãåããAnnaã®éå§ããŒãžã«è¡šç€ºããŸãã
Cloud Platformã³ã³ãœãŒã«ãŸãã¯MySQLã¯ã©ã€ã¢ã³ãã§ãã®ã¯ãšãªãå®è¡ããçµæã®äŸïŒ

ãã®ã¯ãšãªã®çµæããµã€ãã®ã¹ã¿ãŒãããŒãžã«è¿œå ããŠããŠãŒã¶ãŒã®é¢å¿ãé«ããã³ã³ããŒãžã§ã³ã¬ãã«ãé«ããããšãã§ããŸãã

ã¢ã³ãã«é¢ããå©çšå¯èœãªæ å ±ãèšè¿°ãããã·ããªãªã«åºã¥ããŠãã·ã¹ãã ã¯ã¢ã³ãã«èå³ãããææ¡ãéžæããŸããã
ã¿ã¹ã¯ç£èŠ
bdutilæ§æã§ã®ç£èŠ
以åã«SSHçµç±ã§èŠªã€ã³ã¹ã¿ã³ã¹ã«æ¥ç¶ããŸããã Sparkã«ã¯ãWebã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠé²è¡äžã®ã¿ã¹ã¯ãç£èŠã§ãã管çã³ã³ãœãŒã«ããããŸãã
ããã©ã«ãã§ã¯ãããŒã8080ããã³ã³ãœãŒã«ã«ã¢ã¯ã»ã¹ã§ããŸããã€ã³ã¹ã¿ã³ã¹ããšã«ãã®ããŒããžã®ã¢ã¯ã»ã¹ãéãå¿ èŠããããŸãã ãã¡ã€ã¢ãŠã©ãŒã«ã«ãŒã«ãè¿œå ããæé ã«ã€ããŠã¯ã ãã¡ããã芧ãã ãã ã ã³ã³ãœãŒã«ãéãã«ã¯ããã©ãŠã¶ã®ã¢ãã¬ã¹ããŒã«ã€ã³ã¹ã¿ã³ã¹ã®å€éšIPã¢ãã¬ã¹ãå ¥åããŸã ïŒããšãã°ã 1.2.3.4 ïŒ8080ïŒã äžã®ã¹ã¯ãªãŒã³ã·ã§ããã®Sparkã³ã³ãœãŒã«ã«ã¯ãäœæ¥ããŒããå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ãå®äºããã¢ããªã±ãŒã·ã§ã³ã«é¢ããæ å ±ãå«ã3ã€ã®ã»ã¯ã·ã§ã³ããããŸãã

Sparkã³ã³ãœãŒã«
Cloud Dataprocã§ã®ç£èŠ
åºåãšWebã€ã³ã¿ãŒãã§ãŒã¹ã®è©³çŽ°ã«ã€ããŠã¯ãCloud Dataprocã®ããã¥ã¡ã³ããåç §ããŠãã ããã
ã¬ã€ã
ã»ããã¢ããæé ãšãµã³ãã«ãœãŒã¹ã³ãŒããå«ãå®å šãªã¬ã€ãã¯ãGitHubã§å ¥æã§ããŸã ã
ã¢ããª
ã¯ãã¹ãã£ã«ã¿ãªã³ã°
äžèšã®äŸãããå調ãã£ã«ã¿ãªã³ã°ã«åºã¥ããŠæšå¥šäºé ãéžæããããã®å¹æçã§ã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ãäœæããæ¹æ³ãåŠã³ãŸããã æšå¥šäºé ãããã«æ£ç¢ºã«ããããã«ãä»ã®æ¹æ³ã䜿çšããŠçµæããã£ã«ã¿ãªã³ã°ã§ããŸãã ããã¯ãã³ã³ãã³ããã£ã«ã¿ãªã³ã°ãšã¯ã©ã¹ã¿ãŒãã£ã«ã¿ãªã³ã°ã®2ã€ã®äž»èŠãªãã£ã«ã¿ãªã³ã°ã¿ã€ãã«ãªããŸãã ãããã®ã¢ãããŒãã®çµã¿åããã«ããããŠãŒã¶ãŒã¯ããè¯ãæšå¥šäºé ãæäŸã§ããŸãã

ã³ã³ãã³ããã£ã«ã¿ãªã³ã°
ãã®ã¿ã€ãã®ãã£ã«ã¿ãªã³ã°ã«ãããå±æ§ãšå°æ°ã®ãŠãŒã¶ãŒè©äŸ¡ãæã€ãªããžã§ã¯ãã®æšå¥šäºé ãéžæã§ããŸãã ãªããžã§ã¯ãã®é¡äŒŒæ§ã¯ããã®å±æ§ã«åºã¥ããŠæ±ºå®ãããŸãã ãŠãŒã¶ãŒããŒã¹ã倧ããå Žåã§ããåŠçãããå±æ§ã®æ°ã¯èš±å®¹ã¬ãã«ã®ãŸãŸã§ãã
ã³ã³ãã³ããã£ã«ã¿ãªã³ã°ãè¿œå ããã«ã¯ããã£ã¬ã¯ããªå ã®ãªããžã§ã¯ãã«å¯ŸããŠä»ã®ãŠãŒã¶ãŒãèšå®ããæ¢åã®è©äŸ¡ã䜿çšã§ããŸãã ãããã®è©äŸ¡ã«åºã¥ããŠããŠãŒã¶ãŒã衚瀺ããŠãã補åã«æãè¿ã補åãéžæãããŸãã
ååãšããŠã2ã€ã®è£œåã®é¡äŒŒæ§ã決å®ããããã«ãOtiaiä¿æ°ãæåã«èšç®ããã次ã«æãè¿ããã®ãæ€çŽ¢ãããŸãã


çµæã¯0ã1ã®ç¯å²ã®æ°å€ã«ãªããŸãã1ã«è¿ãã»ã©ãååã®é¡äŒŒæ§ã¯é«ããªããŸãã

次ã®ãããªãã¯ã¹ãæ€èšããŠãã ããã

P1ãšP2ã®é¡äŒŒæ§ã¯ã次ã®åŒã䜿çšããŠèšç®ãããŸãã

ã³ã³ãã³ããã£ã«ã¿ãªã³ã°ã·ã¹ãã ã¯ãããŸããŸãªããŒã«ã䜿çšããŠäœæã§ããŸãã 以äžã«2ã€ã®äŸã瀺ããŸãã
- ãã¢ã¯ã€ãºé¡äŒŒæ³ã䜿çšããŠãTwitterã§æšå¥šäºé ãéžæããŸã ã MLlibã«è¿œå ãããScala CosineSimilaritiesæ©èœã¯ãSparkç°å¢ã§å®è¡ã§ããŸãã
- Mahoutã©ã€ãã©ãªãŒ ã MLlibã¢ã«ãŽãªãºã ã®1ã€ã眮æãŸãã¯æ¡åŒµããã«ã¯ãbdutilæ§æã«Mahoutãã€ã³ã¹ããŒã«ããŸãã çŸåšã®æ§æã«Mahoutãè¿œå ããã«ã¯ãGitHubãããžã§ã¯ãã®ã¯ããŒã³ãäœæããŸãã
git clone https://github.com/apache/mahout.git mahout export MAHOUT_HOME=/path/to/mahout export MAHOUT_LOCAL=false #For cluster operation export SPARK_HOME=/path/to/spark export MASTER=spark://hadoop-m:7077 #Found in Spark console
ã泚æ Mahoutã©ã€ãã©ãªã䜿çšããã«ã¯ãMavenãå¿ èŠã§ãã
ã¯ã©ã¹ã¿ãªã³ã°
æ€çŽ¢ã³ã³ããã¹ããç解ãããŠãŒã¶ãŒã衚瀺ããŠãã補åãç¹å®ããããšãéèŠã§ãã ç°ãªãç¶æ³ã§ã¯ãåã人ãå®å šã«ç°ãªã補åãæ¢ãããšãã§ããŸãããå¿ ãããèªåã§ã¯ãããŸããã ãã®ããããŠãŒã¶ãŒã衚瀺ããŠãã補åãšäŒŒãŠãã補åãç¥ãå¿ èŠããããŸãã k-meansã¯ã©ã¹ã¿ãªã³ã°ã䜿çšããå Žåãã·ã¹ãã ã¯ãäž»èŠãªå±æ§ã«åºã¥ããŠé¡äŒŒã®ãªããžã§ã¯ããã»ã°ã¡ã³ãã«çµåããŸãã
çŸåšããã³ãã³ã§å®¶ãæ¢ããŠãããŠãŒã¶ãŒã¯ããªãŒã¯ã©ã³ãã®äœå® ã«èå³ãæã€å¯èœæ§ãäœãããããã®äŸã§ã¯ãã·ã¹ãã ã¯ãã®ãããªãªãã¡ãŒãé€å€ããå¿ èŠããããŸãã
from pyspark.mllib.clustering import KMeans, KMeansModel clusters = KMeans.train(parsedData, 2, maxIterations=10, runs=10, initializationMode="random")
çµæãæ¹åããã«ã¯ïŒ
æšå¥šäºé ãããã«æ£ç¢ºã«ããããã«ãåæã§ã¯ã泚æã®å±¥æŽããµããŒãèŠæ±ã人å£çµ±èšæ å ±ïŒå¹Žéœ¢ãå Žæãæ§å¥ãªã©ïŒãªã©ã®è¿œå èŠå ãèæ ®ããããšãã§ããŸãã å€ãã®å Žåããã®ããŒã¿ã¯é¡§å®¢é¢ä¿ç®¡çïŒCRMïŒãŸãã¯ããžãã¹ãªãœãŒã¹ãã©ã³ãã³ã°ïŒERPïŒã·ã¹ãã ã«æ¢ã«ä¿åãããŠããŸãã
ãŸããå€éšèŠå ããŠãŒã¶ãŒã®æ±ºå®ã«åœ±é¿ãäžããå¯èœæ§ãããããšã«æ³šæããå¿ èŠããããŸãã ã¬ã¯ãªãšãŒã·ã§ã³ã®å Žæãéžæãããšããå€ãã®é¡§å®¢ãç¹ã«å°ããªåäŸãæã€å®¶æã¯ãçæ åŠçã«æž æœãªå°åãæ¢ããŠããŸãã ãã®äŸã§ã¯ã Breezometerãªã©ã®ãµãŒãããŒãã£APIãCloud PlatformããŒã¹ã®æšå¥šã·ã¹ãã ã«çµ±åãããšã競äºäžã®åªäœæ§ãããã«åŸãããšãã§ããŸãã
Softline-Google Cloud PremierããŒãããŒ
Softlineã¯ããã·ã¢ããã³CISè«žåœã§æ倧ã®äŒæ¥ãµãŒãã¹ãããã€ããŒã§ãããGoogleããã³Google Cloud PremierããŒãããŒã®ã¹ããŒã¿ã¹ãæã€å¯äžã®ããŒãããŒã§ãã å瀟ã¯é·å¹Žã«ãããããšã³ã¿ãŒãã©ã€ãºã»ã°ã¡ã³ãã®å¹Žéæåªç§ããŒãããŒãSMBã»ã°ã¡ã³ãã®EMEAå°åã®å¹Žéæåªç§ããŒãããŒãšããŠèªããããŸããã
![]() |