ããã«ãããã§å ±éã®é«ã¬ãã«ã¯ãšãªèšèªã圹ç«ã¡ãæ¢åã®ã·ã¹ãã ãžã®åäžãªã¢ã¯ã»ã¹ãæäŸãããããã®ã·ã¹ãã ã§æ¡çšãããŠããäœã¬ãã«ããªããã£ãã®å žåçãªæœè±¡åãåå®è£ ããå¿ èŠããªããªãããšã«æ°ä»ããŸããã ãããã£ãŠãããŒã¿ã¹ãã¬ãŒãžããã³åŠçã·ã¹ãã çšã®æ±çšå®£èšåã¯ãšãªèšèªã§ããYandex Query LanguageïŒYQLïŒã®éçºãå§ãŸããŸããã ïŒããã¯YQLãšåŒã°ããäžçã§æåã®ãã®ã§ã¯ãªãããšãããã£ãŠãããšããã«èšããŸããããããåé¡ã劚ããªãããšã決å®ããååãæ®ããŸãããïŒ
Yandexã€ã³ãã©ã¹ãã©ã¯ãã£ã«ç¹åããäŒè°ãæåŸ ããŠãHabrahabrã®èªè ã«YQLã«ã€ããŠäŒããããšã«ããŸããã
建ç¯
ãã¡ãããHadoopãSparkãªã©ãäžçã§äººæ°ã®ãããªãŒãã³ãœãŒã¹ãšã³ã·ã¹ãã ã®æ¹åãèŠãããšãã§ããŸãã ãããã圌ãã¯çå£ã«èæ ®ãããŸããã§ããã å®éã«ã¯ãYandexã§ãã§ã«æ®åããŠããããŒã¿ãŠã§ã¢ããŠã¹ãšã³ã³ãã¥ãŒã¿ãŒã·ã¹ãã ã®ãµããŒããå¿ èŠã§ããã ãã®ãããYQLã¯ããããã¬ãã«ã§æ¡åŒµå¯èœã«èšèšããã³å®è£ ãããŸããã 以äžã®ãã¹ãŠã®ã¬ãã«ãé çªã«èŠãŠãããŸãã
å³ã§ã¯ããŠãŒã¶ãŒã¯ãšãªã¯äžããäžã«ç§»åããŸãããã¹ããŒãªãŒãããã€ãªããããããªãããã«ã圱é¿ãåããèŠçŽ ãäžããäžã«éã®é åºã§èª¬æããŸãã éå§ããã«ã¯ãçŸåšãµããŒããããŠããããã¯ãšã³ããŸãã¯ç§ãã¡ãåŒãã§ããããŒã¿ãããã€ããŒã«é¢ããããã€ãã®èšèïŒ
- 5幎以äžã«ããããYandexã¯MapReduceãã©ãã€ã ã®2ã€ã®å®è£
ãYaMRãšYTãéçºããŠããŸããããããã«ã€ããŠã¯ã æè¿ã®æçš¿ã§è©³ããèªãããšãã§ããŸãã æè¡çã«ã¯ããããã¯ãäºãã«ãHadoopã«ãã»ãšãã©å
±éç¹ã¯ãããŸããã ãã®ã¯ã©ã¹ã®ã·ã¹ãã ã®éçºã¯éåžžã«é«äŸ¡ãªåã³ã§ããããã1幎åã«ãMapReduce-tenderããéå¬ããããšã決å®ãããŸããã YTãåã¡ãçŸåšãYaMRãŠãŒã¶ãŒã¯åãæ¿ããçµããŠããŸãã YQLã®éçºã¯å
¥æã®éå§ãšã»ãŒåæã«å§ãŸããŸããããã®ãããäž»èŠãªèŠä»¶ã®1ã€ã¯ãYTãšYaMRã®äž¡æ¹ã®ãµããŒãã§ããã移è¡æéã®ãŠãŒã¶ãŒã®ç掻ã楜ã«ããããã«å®è£
ããå¿
èŠããããŸããã
- RTMRïŒReal Time MapReduceïŒã«ã€ããŠã¯ããã€ãŠå¥ã®æçš¿ããããŸãã ã 圌ã®ãµããŒãã¯éçºã®åæ段éã«ãããŸãã ãŸãããã®çµ±åãããžã§ã¯ãã«ãããæ°ãããŠãŒã¶ãŒã¯ç¹å¥ãªãã¬ãŒãã³ã°ãªãã§RTMRãå®è£
ã§ããŸãã 次ã«ãæ°ããããŒã¿ã®ã¹ããªãŒã ãšãé·æéã«ããã£ãŠåéãããåæ£YTãã¡ã€ã«ã·ã¹ãã ã«ããã¢ãŒã«ã€ãã®äž¡æ¹ãåäžã«åæã§ããããã«ãªããŸãã
- Yandexã§ã¯ãMapReduceãã©ãã€ã ã«åºã¥ãããã®ãããå€ãã®OLTPãã¿ãŒã³ãæã€ã¹ãã¬ãŒãžã·ã¹ãã ããããŸãã KiKiMRã¯ãYQLãšçµ±åããããã®ãã€ããããããžã§ã¯ããšããŠãããã®äžããéžã°ããŸããã å€ãã®ç¹ã§ãYQLã®äººæ°ãé«ãŸããšåæã«ãã¬ã³ããªãŒãªKiKiMRã€ã³ã¿ãŒãã§ã€ã¹ã®å¿
èŠæ§ã圢æãããããããã®éžæãè¡ãããŸããã ãã1ã€ã®çç±ã¯ããã®ãããžã§ã¯ãã®ããã®KiKiMRããŒã ã®ãªãœãŒã¹ã§ããã KiKiMRã®è©³çŽ°ãªè©±ã¯ããã§ã¯é©åã§ã¯ãããŸããããèŠããã«ãããã¯ããŒã¿ã»ã³ã¿ãŒéã§ã®åæ£ãå«ãåæ£ãã©ãŒã«ããã¬ã©ã³ãã®å³å¯ã§äžè²«æ§ã®ããããŒã¿ã¹ãã¬ãŒãžã§ãã è€æ°ã®ãã·ã³ãšæ°åã®ããŒãã§æ§æãããã€ã³ã¹ããŒã«ã§äœ¿çšã§ããŸãã KiKiMRã¹ãã¬ãŒãžã®ç¹åŸŽçãªæ©èœã¯ãåã
ã®ãªããžã§ã¯ãïŒåäžè¡ãã©ã³ã¶ã¯ã·ã§ã³ïŒãšåæ£ã¹ãã¬ãŒãžãªããžã§ã¯ãã®ã°ã«ãŒãïŒã¯ãã¹è¡/ã¯ãã¹ããŒãã«ãã©ã³ã¶ã¯ã·ã§ã³ïŒã®äž¡æ¹ã§ãã·ãªã¢ã«åå¯èœãªåé¢ã¬ãã«ã§æäœãå¹ççãã€ãã©ã³ã¶ã¯ã·ã§ã³çã«å®è¡ããçµã¿èŸŒã¿æ©èœã§ãã
- ãã®ãªã¹ãã«ã¯ããã§ã«å®è£ ãããŠãããã®ãŸãã¯é²è¡äžã®ãã®ã®ã¿ãå«ãŸããŸãã YQLã§ãµããŒããããã·ã¹ãã ã®ç¯å²ãããã«æ¡å€§ããèšç»ã§ãã ããšãã°ã ClickHouseã®ãµããŒãã¯éââåžžã«è«ççãªã€ãã³ãã®éçºã«ãªããŸãããçŸåšã¯ãªãœãŒã¹ã®å¶éãšç·æ¥ã®å¿ èŠæ§ã®äžè¶³ã«ãããããé ããŠããŸãã
ã³ã¢
æè¡çã«ã¯ãYQLã¯æ¯èŒçåé¢ãããã³ã³ããŒãã³ããšã©ã€ãã©ãªã§æ§æãããŠããŸãããäž»ã«ãµãŒãã¹ãšããŠå éšãŠãŒã¶ãŒã«æäŸãããŸãã ããã«ããã圌ãã¯ãã·ã³ã°ã«ãŠã£ã³ããŠãµãŒãã¹ããšããŠã®èŠ³ç¹ããèŠãŠãåããã¯ãšã³ãã®ã¢ã¯ã»ã¹ã®çºè¡ããã¡ã€ã¢ãŠã©ãŒã«ã®èšå®ãªã©ã®çµç¹ã®åé¡ã«å¯Ÿãã人件費ãæå°éã«æããããšãã§ããŸãã ããã«ãYandexã®åŸæ¥ã®MapReduceã®äž¡æ¹ã®å®è£ ã§ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®å®äºãåæçã«åŸ æ©ããã¯ã©ã€ã¢ã³ãããã»ã¹ãå¿ èŠã§ãããYQLãµãŒãã¹ããããåŠçãããŠãŒã¶ãŒããåŸã§çµæãæ±ããŠå®è¡ãã¢ãŒãã§äœæ¥ã§ããããã«ããŸãã ãã ãããµãŒãã¹ã®ã¢ãã«ãã©ã€ãã©ãªåœ¢åŒã®é åžãšæ¯èŒãããšãæ¬ ç¹ããããŸãã ããšãã°ãäºææ§ã®ãªãå€æŽããªãªãŒã¹ã«ã¯ããã«æ³šæãæãå¿ èŠããããŸããããã§ãªãå Žåã¯ãæãäžé©åãªç¬éã«ãŠãŒã¶ãŒããã»ã¹ãäžæãããå¯èœæ§ããããŸãã
YQLãµãŒãã¹ã®äž»ãªãšã³ããªãã€ã³ãã¯HTTP REST APIã§ããããã¯Nettyã® Javaã¢ããªã±ãŒã·ã§ã³ãšããŠå®è£ ãããèšç®ã®ããã®çä¿¡èŠæ±ã®èµ·åãåŠçããã ãã§ãªããå¹ åºãè£å©çãªåœ¹å²ãæã¡ãŸãã
- ããã€ãã®èªèšŒãªãã·ã§ã³ã
- ããã¯ãšã³ããå«ã䜿çšå¯èœãªã¯ã©ã¹ã¿ãŒã®ãªã¹ããšãããŒãã«ããã³ã¹ããŒã ã®ãªã¹ãã衚瀺ããããããããã²ãŒãããŸãã
- ãŠãŒã¶ãŒãä¿åãããªã¯ãšã¹ãã®ãªããžããªãããã³ãã¹ãŠã®èµ·åã®å±¥æŽïŒæŽå²çã«ã¯MongoDBã«ååšããŸãããããã¯å°æ¥å€æŽãããå¯èœæ§ããããŸãïŒã
- å®äºãããªã¯ãšã¹ãã®éç¥ïŒ
- REST APIã®æšªã«ããWebSocketãšã³ããã€ã³ãã¯ãã©ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ïŒåŸã§ãããã«ã€ããŠèª¬æããŸãïŒã䜿çšããŠãããã¢ããã¡ãã»ãŒãžããªã¢ã«ã¿ã€ã ã§è¡šç€ºã§ããŸãã
- Jabberã«ã¬ã¿ãŒãSMSãã¡ãã»ãŒãžãéä¿¡ããããã®å éšãµãŒãã¹ãšã®çµ±åã
- Telegramã®ãããçµç±ã®éç¥ã
Javaã䜿çšãããšãå¿ èŠãªãã¹ãŠã®ã·ã¹ãã ã§æ¢è£œã®éåæã¯ã©ã€ã¢ã³ãã䜿çšã§ããããããã®ãã¹ãŠã®ããžãã¹ããžãã¯ãè¿ éã«å®è£ ããããšãã§ããŸããã ããŸãã«ãå³å¯ãªé 延èŠä»¶ã¯ãŸã ãªãã®ã§ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«ã¯ã»ãšãã©åé¡ããªãã G1ã«åãæ¿ããåŸããããã¯ã»ãšãã©ãªããªããŸããã äžèšã«å ããŠãããŒãéã®åæã®ããã«ã ZooKeeperã䜿çšãããŸããããã«ã¯ãéç¥ãéä¿¡ãããšãã®ãããªãã·ã£ãŒ-ãµãã¹ã¯ã©ã€ããŒãã¿ãŒã³ãå«ãŸããŸãã
ã«ã¹ã¿ã èšç®ã¯ãšãªã®å®è¡èªäœã¯ãyqlworkerãšåŒã°ããå¥åã®C ++ããã»ã¹ã«ãã£ãŠèª¿æŽãããŸãã ãããã¯ãREST APIãšåããã·ã³äžã§ããªã¢ãŒãã§ãå®è¡ã§ããŸãã å®éã«ã¯ãYandexã§éçºããåºã䜿çšãããŠããMessageBusãããã³ã«ã䜿çšããŠããããã¯ãŒã¯äžã§éä¿¡ãè¡ãããŠããŸãã yqlworkerã®ã³ããŒã¯ãforkã·ã¹ãã ã³ãŒã«ïŒexecãªãïŒã䜿çšããŠããªã¯ãšã¹ãããšã«äœæãããŸãã ãã®ãããªã¹ããŒã ã«ããã ã³ããŒãªã³ã©ã€ãã¡ã«ããºã ã®ãããã§ãåæåã«æéãç¡é§ã«ããã«ãç°ãªããŠãŒã¶ãŒããã®ãªã¯ãšã¹ããååã«åé¢ããããšãã§ããŸãã
é«åºŠãªã¢ãŒããã¯ãã£ã®å³ãããããããã«ãYandexã¯ãšãªèšèªã«ã¯2ã€ã®è¡šçŸããããŸãã
- åºæ¬çãªæ§æã¯SQLã«åºã¥ããŠããããŠãŒã¶ãŒãäœæããããã®ãã®ã§ãã
- s-expressionsæ§æã¯ãã³ãŒãçæã«ãšã£ãŠãã䟿å©ã§ãã
éžæãããæ§æã«é¢ä¿ãªããã¯ãšãªãããé¢æ°åããã°ã©ãã³ã°ã§äžè¬çãªããªããã£ãã䜿çšããŠå¿ èŠãªããŒã¿åŠçãè«ççã«èšè¿°ããåŒã°ã©ããäœæãããŸãã ãã®ãããªããªããã£ãã«ã¯ãλé¢æ°ã衚瀺ïŒMapããã³FlatMapïŒããã£ã«ã¿ãªã³ã°ïŒFilterïŒãç³ã¿èŸŒã¿ïŒFoldïŒããœãŒãïŒSortïŒãã¢ããªã±ãŒã·ã§ã³ïŒApplyïŒãªã©ãå«ãŸããŸãã SQLæ§æã®å Žåã ANTLR v3ã«åºã¥ãã¬ã¯ãµãŒãšããŒãµãŒãæœè±¡æ§æããªãŒãæ§ç¯ããããã䜿çšããŠèšç®ã°ã©ããæ§ç¯ããŸãã s-expressionæ§æã®å Žåãææ³ã¯éåžžã«åçŽã§ãããããã°ã©ã ã¯ãããã«ãããããã®æœè±¡åã§åäœãããããããŒãµãŒã¯ã»ãšãã©èªæã§ãã
ããã«ãå¿ èŠãªçµæãåŸãããã«ãèŠæ±ã¯ããã€ãã®æ®µéãçµãŠãå¿ èŠã«å¿ããŠããã§ã«å®äºããç¶æ ã«æ»ããŸãã
- å ¥åããŸãã YQLã¯åºæ¬çã«åŒ·ãåä»ããããèšèªã§ãã ãããæ¯æããå€ãã®è°è«ããããŸãããSQLã®ã«ãŒãããå§ãŸããã¹ããŒãåãæ瀺ãããŠãããããšãã°ããã€ãã£ãã³ãŒãããªã³ã¶ãã©ã€ã§çæããããšã«ãããããåºãå éç¯å²ã§çµãããŸããã åçŽãªããŒã¿åã«å ããŠãããã€ãã®ã¿ã€ãã®ã³ã³ãããŒïŒãªãã·ã§ã³ããªã¹ããèŸæžãã¿ãã«ãããã³æ§é äœïŒããã³ç¹æ®ã¿ã€ãïŒäžéæãã€ã³ã¿ãŒïŒãªãœãŒã¹ïŒãªã©ïŒããµããŒããããŠããŸãã
- æé©å ã ãã®æ®µéã§ã¯ãå®è¡æéãççž®ããããã«èšèšãããåçã®å€æã ããçºçããããã§ã¯ãããŸããã ãããã«å ããŠãã¢ã¯ã·ã§ã³ãã©ã³ã¯ãããã¯ãšã³ããå®è¡ã§ãã圢åŒã«ãªããŸãã ç¹ã«ãããã¯ãšã³ãããã€ãã£ãã«å®è¡ã§ããè«çæäœã¯ç©çæäœã«çœ®ãæããããŸãã ãããã£ãŠãYQLã«ã¯ãªããã£ãã€ã¶ãŒçšã®ç¬èªã®ãã¬ãŒã ã¯ãŒã¯ããããæ¡ä»¶ä»ãã§3ã€ã®ã«ããŽãªãŒã«åããããšãã§ããŸãã
- è«ççãªæé©åã®äžè¬çãªã«ãŒã«ã
- ç¹å®ã®ããã¯ãšã³ãã«åºæã®äžè¬çãªã«ãŒã«ã
- å®è¡æã«ç¹å®ã®å®è¡æŠç¥ãéžæããæé©åïŒåŸã§ãããã«æ»ããŸãïŒã
- ãã«ãã£ã«ã¡ã³ã ã æé©ååŸã«ãšã©ãŒãæ®ã£ãŠããªãå Žåãã°ã©ãã¯ããã¯ãšã³ãAPIã䜿çšããŠå®è¡ã§ãã圢åŒã«ãªããŸãã ã»ãšãã©ã®å Žåãyqlworkerã¯ãŸãã«ãããè¡ããŸãã èšç®ã°ã©ãã«æ®ã£ãŠããè«çæŒç®ã¯ãããã¯ãšã³ãã®èšç®èœåã§ãå¯èœã§ããã°é«åºŠã«å°éåãããã€ã³ã¿ãŒããªã¿ãŒã䜿çšããŠå®è¡ãããŸãã
ãªã¯ãšã¹ãã®ã©ã€ããµã€ã¯ã«ã®ã©ã®æ®µéã§ããs-expressionsæ§æã«ã·ãªã¢ã«åããããšãã§ããŸããããã¯ãäœãèµ·ãã£ãŠãããã蚺æããŠç解ããã®ã«éåžžã«äŸ¿å©ã§ãã
ã€ã³ã¿ãŒãã§ãŒã¹
ã¯ããã«è¿°ã¹ãããã«ãYQLã®éèŠãªèŠä»¶ã®1ã€ã¯äœ¿ããããã§ããã ãããã£ãŠããããªãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ç¹å¥ãªæ³šæãæãããŠãããéåžžã«ç©æ¥µçã«éçºãããŠããŸãã
ã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ã
ãã®å³ã¯ãèªåè£å®ãæ§æã®åŒ·èª¿è¡šç€ºãè²ã®ããŒããéç¥ããã®ä»ã®è£ 食ãåããã€ã³ã¿ã©ã¯ãã£ãã¢ãŒãã瀺ããŠããŸãã ãã ããã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ãã¯ããã¡ã€ã«ãŸãã¯æšæºã¹ããªãŒã ããI / Oã¢ãŒãã§èµ·åããããšãã§ããŸããããã«ãããã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ããä»»æã®ã¹ã¯ãªãããéåžžã®ããã»ã¹ã«çµ±åã§ããŸãã æäœã®åæããã³éåæã®äž¡æ¹ã®èµ·åãã¯ãšãªãã©ã³ã®è¡šç€ºãããŒã«ã«ãã¡ã€ã«ã®æ·»ä»ãã¯ã©ã¹ã¿ãŒããã³ãã®ä»ã®åºæ¬æ©èœã®ããã²ãŒãããããŸãã
ãã®ãããªè±å¯ãªæ©èœã¯ã2ã€ã®çç±ã§ç»å ŽããŸããã äžæ¹ã§ãäž»ã«ã³ã³ãœãŒã«ã§äœæ¥ããããšã奜ãYandexã®äººã ã®é¡èãªå±€ããããŸãã äžæ¹ãããã¯ããã«æ©èœã®Webã€ã³ã¿ãŒãã§ã€ã¹ã®éçºã«æéããããããã«è¡ãããŸãããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
èå³æ·±ãæè¡çãã¥ã¢ã³ã¹ïŒã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ãã¯Pythonã§å®è£ ãããŸãããLinuxãOS Xãããã³Windowsçšã«ã³ã³ãã€ã«ãããçµã¿èŸŒã¿ã€ã³ã¿ãŒããªã¿ãŒã䜿çšããŠãäŸåé¢ä¿ã®ãªãéçã«ãªã³ã¯ããããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãšããŠé åžãããŸãã ããã«ãææ°ã®ãã©ãŠã¶ã®ãããªèªåæŽæ°ãå¯èœã§ãã ã³ãŒããæ§ç¯ããŠãªãªãŒã¹ãæºåããããã®Yandexã®å éšã€ã³ãã©ã¹ãã©ã¯ãã£ã®ãããã§ããããã¯ãã¹ãŠéåžžã«ç°¡åã«æŽçã§ããŸããã
Pythonã©ã€ãã©ãª
Pythonã¯Yandexã§C ++ã«æ¬¡ãã§2çªç®ã«åºã䜿çšãããŠããããã°ã©ãã³ã°èšèªã§ãããã®
ããšãã°ãå€ãã®ã¢ããªã¹ãã¯Jupyterç°å¢ã§ã®äœæ¥ã奜ããããããããïŒ yqlããžãã¯ããã®ã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªã«åºã¥ããŠäœæãããŠããŸãã
ã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ããšãšãã«ãäºåã«æ§æãããJupyterãŸãã¯IPythonãå®è¡ãã2ã€ã®ç¹å¥ãªã«ãŒãã³ãæäŸãããã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªãæ¢ã«å©çšå¯èœã§ãã ãããã¯äžã«ç€ºãããŠããŸãã
Webã€ã³ã¿ãŒãã§ãŒã¹
YQLèšèªãã¯ãšãªéçºãããã³åæãåŠç¿ããããã®äž»èŠãªããŒã«ã¯ãåå¿è åãã«æ®ããŸããã Webã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ãã³ã³ãœãŒã«ã®æè¡çãªå¶éããªãããããã¹ãŠã®YQLæ©èœã¯ããèŠèŠçãªåœ¢åŒã§å©çšã§ããåžžã«æå ã«ãããŸãã ã€ã³ã¿ãŒãã§ãŒã¹æ©èœã®äžéšã¯ãä»ã®ç»é¢ã®äŸã«ç€ºãããŠããŸãã
- ãªãŒãã³ã³ããªãŒããšãã¥ãŒããŒãã«ã¹ããŒã
ã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ããšWebã€ã³ã¿ãŒãã§ã€ã¹ããã®èŠæ±ã®èªåå®äºã®ããžãã¯ã¯äžè¬çã§ãã 圌女ã¯ãå ¥åãçºçããã³ã³ããã¹ããæ£ç¢ºã«èæ ®ããæ¹æ³ãç¥ã£ãŠããŸãã ããã«ããããã¹ãŠã®è¡ã§ã¯ãªããé¢é£ããããŒã¯ãŒããŸãã¯ããŒãã«ãåãé¢æ°ã®ååã®ã¿ãå ¥åããããšãã§ããŸãã
- ä¿åãããã¯ãšãªãæäœãã
èŠæ±ãååã§ä¿åãããšãå±¥æŽã衚瀺ããŠä»¥åã®ããŒãžã§ã³ã«æ»ãæ©èœãåããã³ãŒããªããžããªã®ããã¢ããã°ã«ãªããŸãã
- ãªã¯ãšã¹ãå®è¡èšç»
MapReduceã«é¢ããJOINã®æãåçŽã§æãæ®éçãªå®è£ ã以äžã«ç€ºããŸãã
...ã ãã§ãªã
REST APIèªäœã®ãã¹ãŠã®ãã³ã«ã¯ã³ãŒãã§æ³šéãä»ããããSwaggerã䜿çšããŠãããã®æ³šéã䜿çšããŠè©³çŽ°ãªãªã³ã©ã€ã³ããã¥ã¡ã³ããèªåçã«çæãããŸãã ãããããã³ãŒãã1è¡ã䜿ããã«ãªã¯ãšã¹ããè©Šã¿ãããšãã§ããŸãã ããã«ãããäœããã®çç±ã§äžèšã®æ¢è£œã®ãªãã·ã§ã³ãé©åããªãã£ãå Žåã§ããYQLãç°¡åã«äœ¿çšã§ããŸãã ããšãã°ãPerlã奜ããªå Žåã
ç¹åŸŽ
Yandex Query Languageã䜿çšããŠè§£æ±ºã§ããã¿ã¹ã¯ãã©ã³ã®çš®é¡ãšããŠãŒã¶ãŒã«æäŸãããæ©äŒã«ã€ããŠã話ããŸãã ãã§ã«é·ããã¹ãã延é·ããªãããã«ããã®éšåã¯ãããè«æã§ãã
SQL
- ã¡ã€ã³ã®YQLæ¹èšã¯SQLïŒ1992æšæºã«åºã¥ããŠãããæ°ãããšãã£ã·ã§ã³ãæ£åšããŠããŸãã ãã¹ãŠã®äž»èŠãªèšèšããµããŒããããŠããŸãããããŸã人æ°ããªãã£ãè€éãã®å®å šãªäºææ§ã¯ãŸã éçºäžã§ãã ããã«ããã以åã«SQLã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠããŒã¿ããŒã¹ãæäœããŠããå€ãã®æ°ãããŠãŒã¶ãŒã¯ãèšèªãäžããåŠã¶å¿ èŠããããŸãã
- MapReduceãã©ãã€ã ã§å®è¡ãããŠããããã¯ãšã³ãã§ã¯ãã¿ãŒã²ããããŒãã«ïŒç°¡åã«ããããïŒãèªåçã«äœæãããŸãã ã»ãšãã©ã®å Žåãã¯ãšãª
SELECT
ä»»æã®è€éãã®SELECT
æ§æããããªãã·ã§ã³ã§INSERT INTO
å«ã¿ãŸãã - ãã«æ©èœã®DDLïŒ
CREATE TABLE
ïŒããã³CRUDïŒããã³UPDATE
ãREPLACE
ãUPSERT
ããã³DELETE
ïŒã¯ãOLTPã¹ã¯ãªããã§äœ¿çšã§ããŸãã - æšæºSQLã§ãµããŒããããŠããªãããé¢åããããšæãããå€ãã®ç¶æ³ã«å¯ŸããŠãYQLã«ããŸããŸãªæ§ææ¡åŒµæ©èœãè¿œå ãããŸããã次ã«äŸã瀺ããŸãã
- ååä»ãåŒ
ãµãã¯ãšãªã®ãã¹ãã¬ãã«ãå€æ°ãããããæšæºã«åŸã£ãŠäºãã«æžã蟌ãããšã¯ã§ããŸããã ãŸããäžè¬çã«äœ¿çšãããåŒãã³ããŒã¢ã³ãããŒã¹ãããªãããšãå¯èœã§ãã
- ã³ã³ããã¿ã€ãã®æäœ
ããŒãŸãã¯ã€ã³ããã¯ã¹ãããã³äžé£ã®ç¹æ®ãªçµã¿èŸŒã¿é¢æ°ã«ãã£ãŠèŠçŽ ãååŸããããã«äœ¿çšå¯èœãªæ§æã
-
FLATTEN BY
ãã®ããŒã¯ãŒãã«ã¯ã察å¿ããããŒã¿åã®åããå¯å€é·ã®ã³ã³ããïŒãªã¹ããŸãã¯ãã£ã¯ã·ã§ããªïŒãåçŽæ¹åã«å±éããŠãœãŒã¹ããŒãã«ã®è¡ãäŒæããæ©èœããããŸãã
å°ããããã«ãããããããŸããããäŸã䜿ã£ãŠè¡šç€ºããæ¹ãç°¡åã§ãã 次ã®åœ¢åŒã®è¡šã䜿çšããŸãã
å·Šåã«[aãbãc] 1 [d] 2 [] 3 FLATTEN BY
ãé©çšãããšã次ã®è¡šãåŸãããŸãã
ãã®ãããªå€æã¯ãã³ã³ããåã®ã»ã«ã§çµ±èšãèšç®ããå¿ èŠãããå ŽåïŒããšãã°ãa 1 b 1 c 1 d 2 GROUP BY
ãä»ããŠïŒããŸãã¯ã»ã«ã«JOIN
ãäœæããå¥ã®ããŒãã«ã®èå¥åãå«ãŸããŠããå Žåã«äŸ¿å©ã§ãã
FLATTEN BY
ã®é¢çœãç¹ã¯ããã§ãããããè¡ãããšãã§ãããã¹ãŠã®ã·ã¹ãã ã§ç°ãªãæ¹æ³ã§åŒã³åºãããŸãã ç§ãã¡ãçºèŠããããšãããåäžã®ç¹°ãè¿ãã¯ãããŸããïŒ
-
ARRAY JOIN
-ClickHouseã -
unnest
ã -
$unwind
æ»ã-MongoDBã -
LATERAL VIEW
-ãã€ãã -
FLATTEN
-Google BigQueryã
-
- æ瀺çãª
PROCESS
ïŒãããïŒããã³REDUCE
ïŒãªãã¥ãŒã¹ïŒã
MapReduceãã©ãã€ã ã§èšè¿°ãããæ¢åã®ã³ãŒããã以äžã§èª¬æãããŠãŒã¶ãŒå®çŸ©é¢æ°ã¡ã«ããºã ãšçµã¿åãããŠYQLã¯ãšãªã«åã蟌ãããšãã§ããŸãã
- ååä»ãåŒ
ãŠãŒã¶ãŒå®çŸ©é¢æ°
ãã¹ãŠã®ã¿ã€ãã®ããŒã¿å€æã宣èšçã«äŸ¿å©ã«è¡šçŸãããããã§ã¯ãããŸããã ã«ãŒããæžããããæ¢è£œã®ã©ã€ãã©ãªã䜿çšããã»ããç°¡åãªå ŽåããããŸãã ãã®ãããªç¶æ³ã«å¯ŸããŠãYQLã¯ãŠãŒã¶ãŒé¢æ°ã®ã¡ã«ããºã ãæäŸããŸãããããã¯ãŠãŒã¶ãŒå®çŸ©é¢æ°ã§ãããUDFã§ããããŸãã
- C ++ UDF
- ããã«äœ¿çšã§ããC ++é¢æ°ã¯100å以äžããã15å以äžã®ã¢ãžã¥ãŒã«ã«åãããŠããŸãã ã¢ãžã¥ãŒã«ã®äŸïŒStringãDateTimeãPireãRe2ãProtobufãJsonãªã©ã
- ç©ççã«ãC ++ UDFã¯ãé¢æ°ãåŒã³åºããŠç»é²ããããã®ABIã»ãŒããããã³ã«ãåããåçã«ããŒããããã©ã€ãã©ãªïŒ.soïŒã§ãã
- C ++ UDFãèšè¿°ããããŒã«ã«ã§ã¢ã»ã³ãã«ããããšãã§ããŸãïŒãã«ãã·ã¹ãã ã«ã¯UDFã®ãã«ãèšå®ã®æ¢è£œã»ããããããŸãïŒããããæšæºçãªæ¹æ³ã§ãªããžããªã«ããŒãããURLã§æ·»ä»ããããšã§ãªã¯ãšã¹ãã§ããã«äœ¿çšãéå§ã§ããŸãã
- åçŽãªUDFã®å Žåã詳现ãé ãæ¢è£œã®C ++ãã¯ãã䜿çšãããšäŸ¿å©ã§ããå¿ èŠã«å¿ããŠãããŸããŸãªããŒãºã«åãããŠäœæãããæè»ãªã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšã§ããŸãã
- Python UDF
- ããã©ãŒãã³ã¹ãããã»ã©éèŠã§ã¯ãªãå Žåãããã³åœä»€åããžãã¹ããžãã¯ã§æ¿å ¥ããã°ããè¡ãå¿ èŠãããåé¡ã解決ããã«ã¯ã宣èšåã¯ãšãªãPythonã³ãŒãã§åžéãããšéåžžã«äŸ¿å©ã§ãã ã»ãšãã©ã®Yandexã®åŸæ¥å¡ã¯Pythonãç¥ã£ãŠããŸãã誰ããåºæ¬ã¬ãã«ã§ç¥ããªãå Žåã¯ãæ°æ¥ã§ç 究ãããŸãã
- Pythonã¹ã¯ãªããã¯ãSQLãŸãã¯s-expressionsãšçµã¿åãããŠã€ã³ã©ã€ã³ã§äœæããããå¥ã®ãã¡ã€ã«ãšããŠãªã¯ãšã¹ãã«æ·»ä»ããããšãã§ããŸãã äžè¬ã«ãã¯ã©ã€ã¢ã³ããããŸãã¯URLãä»ããŠèšç®ã®å Žæã«ãã¡ã€ã«ãé ä¿¡ããããã®ã¡ã«ããºã ã¯æ±çšçã§ãããèŸæžãã¡ã€ã«ãªã©ãå¿ èŠãªãã®ãã¹ãŠã«äœ¿çšã§ããŸãã
- Pythonã¯åçåä»ãã䜿çšããYQLã¯éçåä»ãã䜿çšããããããŠãŒã¶ãŒã¯å¢çã§é¢æ°ã·ã°ããã£ã宣èšããå¿ èŠããããŸãã ããã¯ãè¿œå ã®ããèšèªã䜿çšããŠå€éšçã«èª¬æãããŠããŸããäºå®ãã¿ã€ãã³ã°æ®µéã§ã¯ãã€ã³ã¿ãŒããªã¿ãŒãèµ·åããããªããšããããšã§ãã å°æ¥çã«ã¯ãããããPython 3åã®ãã³ãã®ãµããŒããå°ç¡ãã«ããã§ãããã
- æè¡çã«ã¯ãYQLã®PythonãµããŒãã¯ãçµã¿èŸŒã¿ã®Pythonã€ã³ã¿ãŒããªã¿ãŒãšãããåŒã³åºãSQLããŒãµãŒã®å°ããªæ§æã·ã¥ã¬ãŒãåããC ++ UDFãä»ããŠå®è£ ãããŸãã
- ã¹ããªãŒãã³ã°UDFã ãã®ãããä»ã®ãã¯ãããžãŒããã¹ã ãŒãºã«åãæ¿ããããšãã§ããç¹å¥ãªå Žåã«ã¯ãã¹ããªãŒãã³ã°ã¢ãŒãã§ä»»æã®ã¹ã¯ãªãããŸãã¯å®è¡å¯èœãã¡ã€ã«ãå®è¡ããæ¹æ³ããããŸãã ãã®çµæãæååã®ãªã¹ããå¥ã®ãªã¹ãã«å€æããUDFãååŸããŸãã
éèšé¢æ°
å éšã§ã¯ãéèšé¢æ°ã¯ã
DISTINCT
ãµããŒãããæäžäœãš
GROUP BY
äž¡æ¹ã§å®è¡ãããå ±éãã¬ãŒã ã¯ãŒã¯ã䜿çšã
DISTINCT
ïŒSQLïŒ1999æšæºã®
ROLLUP/CUBE/GROUPING SETS
ãå«ãïŒã ãããŠããããã®æ©èœã¯ããžãã¹ããžãã¯ã®ã¿ãç°ãªããŸãã 以äžã«äŸã瀺ããŸãã
- æšæºïŒ
COUNT
ãSUM
ãMIN
ãMAX
ãAVG
ãVARIANCE
ãVARIANCE
; - è¿œå ïŒ
COUNT_IF
ãSOME
ãLIST
ãMIN_BY/MAX_BY
ãBIT_AND/OR/XOR
ãBOOL_AND/OR
; - çµ±èšïŒ
-
MEDIAN
ããã³PERCENTILE
ïŒ TDigestã¢ã«ãŽãªãºã ã«ããïŒ; -
HISTOGRAM
ååžã®ç¥èãå¿ èŠãšããªãæ°å€ã«ããé©å¿ãã¹ãã°ã©ã ïŒ ã¹ããªãŒãã³ã°äžŠå決å®ããªãŒã«åºã¥ãã¢ã«ãŽãªãºã ã«ããïŒã
-
- ãŠãŒã¶ãŒå®çŸ©ã®éèšé¢æ°ïŒéåžžã«ç¹å®ã®ã¿ã¹ã¯ã®å Žåãããšãã°Pythonã§äžèšã®UDFã¡ã«ããºã ã䜿çšããŠç¹å®ã®ã·ã°ããã£ã§è€æ°ã®åŒã³åºãå€ãäœæããããšã«ãããããžãã¹ããžãã¯ãéèšé¢æ°ãã¬ãŒã ã¯ãŒã¯ã«è»¢éã§ããŸãã
ããã©ãŒãã³ã¹äžã®çç±ãããéèšé¢æ°ã®MapReduceã®èŠ³ç¹ãããMapãµã€ãã³ã³ãã€ããŒãèªåçã«äœæãããReduceã®äžééèšçµæã®éèšãè¡ãããŸãã
DISTINCT
ã¯åžžã«ïŒè¿äŒŒèšç®ãªãã§ïŒæ£ç¢ºã«æ©èœããããã«ãªã£ããããäžæã®å€ãããŒã¯ããã«ã¯è¿œå ã®Reduceãå¿ èŠã§ãã
ããŒãã«ãçµåãã
ããŒã«ããããŒãã«ã®ããŒãžã¯ãåé¡ã解決ããããã«ãã°ãã°å¿ èŠãšãããæãäžè¬çãªæäœã®1ã€ã§ãããMapReduceã®èŠ³ç¹ããæ£ããå®è£ ãããã®ã¯ã»ãšãã©ç§åŠã§ãã è«ççã«ãYandexã¯ãšãªèšèªã§ã¯ããã¹ãŠã®æšæºã¢ãŒãã«å ããŠãããã€ãã®è¿œå ã¢ãŒããå©çšã§ããŸãã
ãŠãŒã¶ãŒãã詳现ãé ãããã«ãMapReduceã«åºã¥ãããã¯ãšã³ãã®å Žåãåå ããŒãã«ã®å¿ èŠãªè«çã¿ã€ããšç©çããããã£ã«å¿ããŠãJOINå®è¡æŠç¥ããªã³ã¶ãã©ã€ã§éžæãããŸãïŒããã¯ããããã³ã¹ãããŒã¹ã®æé©åã§ãïŒã
æŠç¥ | ç°¡åãªèª¬æ | ããŒã«åã«å©çšå¯èœ |
å ±éåå | 1-2ããã+åæž | å šéš |
ãããåŽã®çµå | 1å°å³ | å åŽãå·Šãå·Šã®ã¿ãå·Šã»ããã¯ãã¹ |
ã·ã£ãŒããããåŽã®çµå | k䞊åãããïŒããã©ã«ãã§ã¯k <= 4ïŒ | å åŽãå·Šã»ãããŠããŒã¯ãªå³ãã¯ãã¹ |
ãœãŒãããã«åæž | 1åæžããŸãããäºåã«ãœãŒããããå ¥åãå¿ èŠã§ã | éçºäž |
éçºæ¹å
Yandex Query Languageã®äžæããã³äžæèšç»ã®äžã§ïŒ
- æ¬çªã¹ããŒã¿ã¹ã®ããã¯ãšã³ããå¢ããŸããã
- ç¹æ®ãªã€ã³ã¿ãŒããªã¿ãŒã§ã¯ãªãããã€ãã£ãã³ãŒãã®çæãšãã¯ãã«åã
- ããŒãã«ã®ç©ççç¹æ§ã«å¿ããŠãI / Oã®ç¶ç¶çãªæé©åãšãªã³ã¶ãã©ã€ã§ã®å®è¡æŠç¥ã®éžæã
- SQLïŒ2003æšæºã«åºã¥ããŠã£ã³ããŠé¢æ°ã
- SQLã®ãµããŒãïŒ1992幎ãODBC / JDBCãã©ã€ããŒã®äœæãããã«ç¶ããŠäžè¬çãªORMããã³ããžãã¹ã€ã³ããªãžã§ã³ã¹ããŒã«ãšã®çµ±åã
- æäœã®é²æç¶æ³ã®æ確ãªãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã
- UDFã§å©çšå¯èœãªããã°ã©ãã³ã°èšèªã®ç¯å²ã®æ¡å€§-JavaScriptïŒ V8 ïŒãLuaïŒ LuaJIT ïŒãPython 3ãèŠãŠãã ããã
- ãšã®çµ±åïŒ
- åæ£ãã©ãŒã«ããã¬ã©ã³ãã®ã¹ã±ãžã¥ãŒã«ãããã¿ã¹ã¯èµ·åãµãŒãã¹ïŒcronïŒãŸãã¯ã€ãã³ãã®çºçã
- èŠèŠåããŒã«ïŒ Yandex.Statisticsã®å éšã¢ããã°ïŒã
ãŸãšãããš
- æ°åã瀺ãããã«ïŒçµ±èšãåç §ïŒãYQLã¯Yandexã®åŸæ¥å¡ã®éã§éåžžã«äººæ°ã®ãã補åã«ãªããŸããã ããã§ãããã®å©ããåããŠåŠçãããããŒã¿ã®éã¯ããã»ã©å€ããããŸããã ããã¯ãæŽå²çã«ãã¹ãŠã®çç£ããã»ã¹ããããããã®ã·ã¹ãã ã®èŠä»¶ã«é©ããäœã¬ãã«ã®ã€ã³ã¿ãŒãã§ã€ã¹ã§åäœããããã§ãã ã€ãŸããYQLãžã®æ®µéçãªç§»è¡ã¯å§ãŸã£ãã°ããã§ãã
- åœåãYandexå ã§ã¯ã次ã®ã¿ã€ãã®æµæã«çŽé¢ããŠããŸãããMapReduceãã©ãã€ã ã§é·å¹ŽåããŠãããããå€ãã®äººãæ £ããŠããŸããååŠç¿ãæãŸãªããªããŸããã ã¡ã€ã³ã®ã¢ããªã·ãã¯ãªYandexã³ãŒããªããžããªã§ããArcadiaã§ã¯ãååŸæ¥å¡ãç¬èªã®ã³ãŒããŒãæã£ãŠããŸãã æŽå²çã«ãæåéãäœçŸãã®C ++ããã°ã©ã ãååšããç¹å®ã®ã¿ã¹ã¯ã®ããã«MapReduceã®ç¹å®ã®ãã°ãŸãã¯ããŒãã«ã®ã¿ãé€å€ããããã ãã«èšè¿°ãããŠããŸãã ããããæºè¶³ã®ãããŠãŒã¶ãŒã®ã¯ãªãã£ã«ã«ãã¹ãç²åŸããåŸããã®ãããªæçè«ã¯äžè¬çã§ã¯ãªããªãã€ã€ãããŸãã
- ããªãHive ã Spark SQLããŸãã¯ãã®ä»ã®
SQL over ***
ã¯ãªãã®ãããšãã質åã«æ»ãSQL over ***
ããŸããYandexã§ã¢ã¯ãã£ãã«äœ¿çšãããã·ã¹ãã ã®ãµããŒãã«é¢å¿ããããŸããã ãããžã§ã¯ãã®ç§»è¡ãç°¡çŽ åãããã£ãã®ã§ããã€ãŸããæçš¿ã®æåã®å³ã«ãããã¹ãŠã®ã³ã³ããŒãã³ããéçºããã³/ãŸãã¯å®æãããå¿ èŠããããŸãã ãã®å ŽåããªãŒãã³ãœãŒã¹ã³ãã¥ããã£ã®åºç€ã«é©å¿ããå¿ èŠããããŸãã ããã«ãYandexã®Javaéçºè ã¯C ++éçºè ãããæ¡éãã«å°ããããããã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®äžæ žãéçºããçµéšã®ãã人ã ã¯ç±³åœã§ãäžè¶³ããŠãããšããäºå®ã«ã¯å°é£ã䌎ããŸãã ãããŠãçµæãšããŠããããããè¯ããŸãã¯ããéããªããšããäºå®ã¯ãŸã£ãããããŸããã YQLã¯ãã»ãŒ10人ã®ããŒã ã«ãã£ãŠ1幎ã®ã©ãããããŒãããäœæãããŸããããã®ã»ãšãã©ã¯ãã«ã¿ã€ã ã§ã¯ãããŸããã§ããã - SQLã®æ¹èšã ãã«çŠç¹ãåœãŠããšã1ã€ã®ããã°ã©ãã³ã°èšèªã§ããŒã¿ãã¯ããšããžãã¹ããžãã¯ãçµ±äžãããæ¹æ³ã§èª¬æããããšã«æ £ããŠãããç®ç«ã€ã¯ã©ã¹ã®äººã ãžã®æãéããŸãã Yandexã«ã¯ãæ¢ã«NileãšããPythonçšã®ãã®ã¯ã©ã¹ã®ã©ã€ãã©ãªããããŸããããã®äžã®ã©ã³ã¿ã€ã ã§ã¯ãªããs-expressionã§ã®YQLã¯ãšãªã®çæãšèµ·åãå®è£ ããŸããïŒãããªãã¯APIçšïŒã çŸåšãããã©ã«ãã§åãæ¿ããããã®æ¹åãé²ããŠããŸãã ãã®ãããªã€ã³ã¿ãŒãã§ã€ã¹ãå¿ èŠãšãããä»ã®ããã°ã©ãã³ã°èšèªã¯ãYandexã§ã¯ããŸãäžè¬çã§ã¯ãããŸããããå°æ¥ãããšãã°Javaã®ã¢ããã°ã®åºçŸã¯æé€ãããŸããã
- Apache Software Foundationã®ãšã³ã·ã¹ãã ã§ããHadoopãšSparkã«å¯Ÿæããããã«ããªãŒãã³ãœãŒã¹ããã¯ãšã³ãã®ãµãã»ããã䜿çšããŠYQLãã¬ã€ã¢ãŠãããããšã¯éåžžã«èå³æ·±ãã§ãããã æ®å¿µãªãããããã¯ããŸããŸãªçš®é¡ã®å°é£ã«ãããè¿ãå°æ¥ã«ã¯çºçããŸãããããšãã°ãã¢ã«ã«ãã£ã¢ã®éšåçãªå ¬éã®ããã®ããŒã«ã®æ¬ åŠããŸãã¯å éšã€ã³ãã©ã¹ãã©ã¯ãã£ãšã®å€æ°ã®çµã³ã€ãã§ãã ããããç§ãã¡ã¯ãã§ã«ãã®æ¹åã«ãã£ãããšåãå§ããŠããŸãã
æåŸã«ã10æ15æ¥ã®æ¬¡ã®åææ¥ã«ãªãã£ã¹ã§ã®äŒè°ã«æåŸ ããŸããããã§ã¯ãYandexã€ã³ãã©ã¹ãã©ã¯ãã£ã®ããŸããŸãªåŽé¢ã«ã€ããŠè©³ãã説æããŸãã