ÐÑÑоÑиÑеÑки во многиÑ
ÑголкаÑ
ЯндекÑа ÑазÑабаÑÑвалиÑÑ Ñвои ÑиÑÑÐµÐ¼Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸ обÑабоÑки болÑÑиÑ
обÑемов даннÑÑ
â Ñ ÑÑеÑом ÑпеÑиÑики конкÑеÑнÑÑ
пÑоекÑов. ÐÑи Ñакой ÑазÑабоÑке в пÑиоÑиÑеÑе вÑегда бÑла ÑÑÑекÑивноÑÑÑ, маÑÑÑабиÑÑемоÑÑÑ Ð¸ надежноÑÑÑ, поÑÑÐ¾Ð¼Ñ Ð½Ð° ÑдобнÑе инÑеÑÑейÑÑ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½ÑÑ
ÑиÑÑем вÑемени, как пÑавило, не оÑÑавалоÑÑ. ÐолÑоÑа года назад ÑазÑабоÑÐºÑ ÐºÑÑпнÑÑ
инÑÑаÑÑÑÑкÑÑÑнÑÑ
компоненÑов вÑделили из пÑодÑкÑовÑÑ
команд в оÑделÑное напÑавление. Цели бÑли ÑледÑÑÑими: наÑаÑÑ Ð´Ð²Ð¸Ð³Ð°ÑÑÑÑ Ð±ÑÑÑÑее, ÑменÑÑиÑÑ Ð´ÑблиÑование ÑÑеди ÑÑ
ожиÑ
ÑиÑÑем и ÑнизиÑÑ Ð¿Ð¾Ñог вÑ
ода новÑÑ
внÑÑÑенниÑ
полÑзоваÑелей.

ÐÑÐµÐ½Ñ ÑкоÑо Ð¼Ñ Ð¿Ð¾Ð½Ñли, ÑÑо ÑÑÑ Ð¼Ð¾Ð³ Ð±Ñ Ð·Ð´Ð¾Ñово помоÑÑ Ð¾Ð±Ñий вÑÑокоÑÑовневÑй ÑзÑк запÑоÑов, коÑоÑÑй Ð±Ñ Ð¿ÑедоÑÑавлÑл единообÑазнÑй доÑÑÑп к Ñже имеÑÑимÑÑ ÑиÑÑемам, а Ñакже избавлÑл Ð¾Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи заново ÑеализовÑваÑÑ ÑиповÑе абÑÑÑакÑии на низкоÑÑовневÑÑ Ð¿ÑимиÑÐ¸Ð²Ð°Ñ , пÑинÑÑÑÑ Ð² ÑÑÐ¸Ñ ÑиÑÑÐµÐ¼Ð°Ñ . Так наÑалаÑÑ ÑазÑабоÑка Yandex Query Language (YQL) â ÑнивеÑÑалÑного деклаÑаÑивного ÑзÑка запÑоÑов к ÑиÑÑемам Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸ обÑабоÑки даннÑÑ . (СÑÐ°Ð·Ñ ÑкажÑ, ÑÑо Ð¼Ñ Ð·Ð½Ð°ÐµÐ¼, ÑÑо ÑÑо Ñже не пеÑÐ²Ð°Ñ ÑÑÑка в миÑе, коÑоÑÐ°Ñ Ð½Ð°Ð·ÑваеÑÑÑ YQL, но Ð¼Ñ ÑеÑили, ÑÑо ÑÑо Ð´ÐµÐ»Ñ Ð½Ðµ меÑаеÑ, и оÑÑавили название.)
РпÑеддвеÑии наÑей вÑÑÑеÑи, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾ÑвÑÑена инÑÑаÑÑÑÑкÑÑÑе ЯндекÑа, Ð¼Ñ ÑеÑили ÑаÑÑказаÑÑ Ð¾ YQL ÑиÑаÑелÑм ХабÑÐ°Ñ Ð°Ð±Ñа.
ÐÑ, конеÑно, могли Ð±Ñ Ð²Ð·Ð³Ð»ÑнÑÑÑ Ð² ÑÑоÑÐ¾Ð½Ñ Ð¿Ð¾Ð¿ÑлÑÑнÑÑ Ð² миÑе open source-ÑкоÑиÑÑем â ÑÐ°ÐºÐ¸Ñ ÐºÐ°Ðº Hadoop или Spark. Ðо вÑеÑÑез они даже не ÑаÑÑмаÑÑивалиÑÑ. Ðело в Ñом, ÑÑо ÑÑебовалаÑÑ Ð¿Ð¾Ð´Ð´ÐµÑжка Ñже ÑаÑпÑоÑÑÑаненнÑÑ Ð² ЯндекÑе Ñ ÑÐ°Ð½Ð¸Ð»Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ вÑÑиÑлиÑелÑнÑÑ ÑиÑÑем. Ðо многом из-за ÑÑого YQL бÑл ÑпÑоекÑиÑован и Ñеализован ÑаÑÑиÑÑемÑм на лÑбом из ÑÑовней. ÐÑе ÑÑовни Ð¼Ñ Ð¿Ð¾ оÑеÑеди ÑазбеÑем ниже.

Ðа диагÑамме полÑзоваÑелÑÑкие запÑоÑÑ Ð¿ÐµÑемеÑаÑÑÑÑ ÑвеÑÑ Ñ Ð²Ð½Ð¸Ð·, но обÑÑждаÑÑ Ð·Ð°ÑÑагиваемÑе ÑлеменÑÑ Ð¼Ñ Ð±Ñдем в обÑаÑном поÑÑдке, cÐ½Ð¸Ð·Ñ Ð²Ð²ÐµÑÑ , ÑÑÐ¾Ð±Ñ ÑаÑÑказ полÑÑилÑÑ Ð±Ð¾Ð»ÐµÐµ ÑвÑзнÑм. ÐÐ»Ñ Ð½Ð°Ñала паÑÑ Ñлов о поддеÑживаемÑÑ Ð½Ð° даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð±ÑÐºÐµÐ½Ð´Ð°Ñ Ð¸Ð»Ð¸, как Ð¼Ñ Ð¸Ñ Ð½Ð°Ð·Ñваем, пÑовайдеÑÐ°Ñ Ð´Ð°Ð½Ð½ÑÑ :
Ð¢ÐµÑ Ð½Ð¸ÑеÑки YQL, Ñ Ð¾ÑÑ Ð¾Ð½ и ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· оÑноÑиÑелÑно изолиÑованнÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñов и библиоÑек, внÑÑÑенним полÑзоваÑелÑм пÑедоÑÑавлÑеÑÑÑ Ð² пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ ÐºÐ°Ðº ÑеÑвиÑ. ÐÑо позволÑÐµÑ Ð²ÑглÑдеÑÑ Ñ Ð¸Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Â«ÑлÑжбой одного окна» и минимизиÑоваÑÑ ÑÑÑдозаÑÑаÑÑ Ð½Ð° оÑганизаÑионнÑе вопÑоÑÑ Ð²Ñоде вÑдаÑи доÑÑÑпов или наÑÑÑоек ÑаеÑвола Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из бÑкендов. ÐÑоме Ñого, обе ÑеализаÑии клаÑÑиÑеÑкого MapReduce в ЯндекÑе ÑÑебÑÑÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ ÑÐ¸Ð½Ñ Ñонно ожидаÑÑего завеÑÑÐµÐ½Ð¸Ñ ÑÑанзакÑии клиенÑÑкого пÑоÑеÑÑа, а ÑеÑÐ²Ð¸Ñ YQL беÑÐµÑ ÑÑо на ÑÐµÐ±Ñ Ð¸ позволÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑм ÑабоÑаÑÑ Ð² Ñежиме «запÑÑÑил изабÑл пÑиÑел за ÑезÑлÑÑаÑами позже». Ðо еÑли ÑÑавниÑÑ Ð¼Ð¾Ð´ÐµÐ»Ñ Ð¿ÑедоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑеÑвиÑа Ñ ÑаÑпÑоÑÑÑанением в виде библиоÑеки, минÑÑÑ Ñоже найдÑÑÑÑ. ÐапÑимеÑ, ÑледÑÐµÑ Ð³Ð¾Ñаздо более аккÑÑаÑно оÑноÑиÑÑÑÑ Ðº неÑовмеÑÑимÑм изменениÑм и Ñелизам â инаÑе можно в ÑамÑй неподÑ
одÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑломаÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкие пÑоÑеÑÑÑ.
ÐÑновной ÑоÑкой Ð²Ñ Ð¾Ð´Ð° в ÑеÑÐ²Ð¸Ñ YQL ÑвлÑеÑÑÑ HTTP REST API, коÑоÑÑй Ñеализован как Java-пÑиложение на Netty и не ÑолÑко занимаеÑÑÑ Ð·Ð°Ð¿ÑÑком поÑÑÑпаÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов на вÑÑиÑление, но и Ð¸Ð¼ÐµÐµÑ ÑиÑокий ÑпекÑÑ Ð²ÑпомогаÑелÑнÑÑ Ð¾Ð±ÑзанноÑÑей:
ÐÑполÑзование Java позволило доÑÑаÑоÑно бÑÑÑÑо ÑеализоваÑÑ Ð²ÑÑ ÑÑÑ Ð±Ð¸Ð·Ð½ÐµÑ-Ð»Ð¾Ð³Ð¸ÐºÑ Ð±Ð»Ð°Ð³Ð¾Ð´Ð°ÑÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð³Ð¾ÑовÑÑ Ð°ÑÐ¸Ð½Ñ ÑоннÑÑ ÐºÐ»Ð¸ÐµÐ½Ñов Ð´Ð»Ñ Ð²ÑÐµÑ Ð½ÑжнÑÑ ÑиÑÑем. ÐоÑколÑÐºÑ ÑлиÑком ÑÑÑÐ¾Ð³Ð¸Ñ ÑÑебований по latency пока неÑ, Ñо пÑоблем Ñо ÑбоÑкой мÑÑоÑа бÑло мало, а поÑле пеÑÐµÑ Ð¾Ð´Ð° на G1 они пÑакÑиÑеÑки иÑÑезли. ÐÑе, помимо ÑпомÑнÑÑого вÑÑе, Ð´Ð»Ñ ÑÐ¸Ð½Ñ ÑонизаÑии Ð¼ÐµÐ¶Ð´Ñ Ñзлами иÑполÑзÑеÑÑÑ ZooKeeper, в Ñом ÑиÑле в паÑÑеÑне publisher-subscriber пÑи оÑпÑавке Ñведомлений.
Само вÑполнение полÑзоваÑелÑÑÐºÐ¸Ñ Ð·Ð°Ð¿ÑоÑов на вÑÑиÑление оÑкеÑÑÑиÑÑеÑÑÑ Ð¾ÑделÑнÑми пÑоÑеÑÑами на С++ под названием yqlworker. Ðни могÑÑ Ð±ÑÑÑ Ð·Ð°Ð¿ÑÑÐµÐ½Ñ ÐºÐ°Ðº на ÑÐµÑ Ð¶Ðµ маÑÐ¸Ð½Ð°Ñ , ÑÑо и REST API, Ñак и Ñдаленно. Ðело в Ñом, ÑÑо Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ Ð¸Ð´ÐµÑ Ð¾Ð±Ñение по ÑеÑи Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑазÑабоÑанного и ÑиÑоко ÑаÑпÑоÑÑÑаненного в ЯндекÑе пÑоÑокола MessageBus. Ðод каждÑй запÑÐ¾Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑиÑÑемного вÑзова fork (без exec) ÑоздаеÑÑÑ ÐºÐ¾Ð¿Ð¸Ñ yqlworker. Ð¢Ð°ÐºÐ°Ñ ÑÑ ÐµÐ¼Ð° позволÑÐµÑ Ð´Ð¾ÑÑиÑÑ Ð´Ð¾ÑÑаÑоÑной изолÑÑии Ð¼ÐµÐ¶Ð´Ñ Ð·Ð°Ð¿ÑоÑами ÑазнÑÑ Ð¿Ð¾Ð»ÑзоваÑелей и пÑи ÑÑом â благодаÑÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ñ copy-on-write â не поÑÑаÑиÑÑ Ð²ÑÐµÐ¼Ñ Ð½Ð° иниÑиализаÑиÑ.
Ðак видно из диагÑÐ°Ð¼Ð¼Ñ Ñ Ð²ÑÑокоÑÑовневой аÑÑ Ð¸ÑекÑÑÑой, Yandex Query Language Ð¸Ð¼ÐµÐµÑ Ð´Ð²Ð° пÑедÑÑавлениÑ:
Ðз запÑоÑа, вне завиÑимоÑÑи Ð¾Ñ Ð²ÑбÑанного ÑинÑакÑиÑа, ÑоздаеÑÑÑ Ð³ÑÐ°Ñ Ð²ÑÑиÑлений (Expression Graph), коÑоÑÑй логиÑеÑки опиÑÑÐ²Ð°ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð¾Ð±ÑабоÑÐºÑ Ð´Ð°Ð½Ð½ÑÑ Ñ Ð¸ÑполÑзованием пÑимиÑивов, попÑлÑÑнÑÑ Ð² ÑÑнкÑионалÑном пÑогÑаммиÑовании. Ð Ñаким пÑимиÑивам оÑноÑÑÑÑÑ: λ-ÑÑнкÑии, оÑобÑажение (Map и FlatMap), ÑилÑÑÑаÑÐ¸Ñ (Filter), ÑвÑÑÑка (Fold), ÑоÑÑиÑовка (Sort), пÑименение (Apply) и многие дÑÑгие. ÐÐ»Ñ SQL-ÑинÑакÑиÑа лекÑÐµÑ Ð¸ паÑÑеÑ, оÑнованнÑе на ANTLR v3, ÑÑÑоÑÑ Abstract Syntax Tree, по коÑоÑÐ¾Ð¼Ñ Ð·Ð°Ñем ÑÑÑоиÑÑÑ Ð³ÑÐ°Ñ Ð²ÑÑиÑлений. ÐÐ»Ñ ÑинÑакÑиÑа s-expression паÑÑÐµÑ Ð¿ÑакÑиÑеÑки ÑÑивиален, поÑколÑÐºÑ Ð³ÑаммаÑика кÑайне пÑоÑÑа, а пÑогÑÐ°Ð¼Ð¼Ñ Ð¸ Ñак опеÑиÑÑÑÑ ÑÑими абÑÑÑакÑиÑми.
Ðалее Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑÑебÑемого ÑезÑлÑÑаÑа запÑÐ¾Ñ Ð¿ÑÐ¾Ñ Ð¾Ð´Ð¸Ñ ÑеÑез неÑколÑко ÑÑадий, пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи возвÑаÑаÑÑÑ Ðº Ñже пÑойденнÑм:
Ðа лÑбой из ÑÑадий жизни запÑоÑа он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑеÑиализован обÑаÑно в ÑинÑакÑиÑе s-expressions, ÑÑо кÑайне Ñдобно Ð´Ð»Ñ Ð´Ð¸Ð°Ð³Ð½Ð¾ÑÑики и Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¿ÑоиÑÑ Ð¾Ð´ÑÑего.
Ðак ÑпоминалоÑÑ Ð²Ð¾ введении, одним из клÑÑевÑÑ ÑÑебований к YQL ÑвлÑлоÑÑ ÑдобÑÑво иÑполÑзованиÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¿ÑблиÑнÑм инÑеÑÑейÑам ÑделÑеÑÑÑ Ð¾Ñобое внимание и они кÑайне акÑивно ÑазвиваÑÑÑÑ.

Ðа каÑÑинке показан инÑеÑакÑивнÑй Ñежим Ñ Ð°Ð²Ñодополнением, подÑвеÑкой ÑинÑакÑиÑа, ÑвеÑовÑми Ñемами, ÑведомлениÑми и пÑоÑими ÑкÑаÑаÑелÑÑÑвами. Ðо конÑолÑнÑй ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑÑкаÑÑÑÑ Ð¸ в Ñежиме ввода-вÑвода из Ñайлов или ÑÑандаÑÑнÑÑ Ð¿Ð¾Ñоков, ÑÑо позволÑÐµÑ Ð¸Ð½ÑегÑиÑоваÑÑ ÐµÐ³Ð¾ в пÑоизволÑнÑе ÑкÑипÑÑ Ð¸ ÑегÑлÑÑнÑе пÑоÑеÑÑÑ. ÐÑÑÑ ÐºÐ°Ðº ÑÐ¸Ð½Ñ ÑоннÑй, Ñак и аÑÐ¸Ð½Ñ ÑоннÑй запÑÑк опеÑаÑий, пÑоÑмоÑÑ Ð¿Ð»Ð°Ð½Ð° запÑоÑа, пÑикÑепление локалÑнÑÑ Ñайлов, навигаÑÐ¸Ñ Ð¿Ð¾ клаÑÑеÑам и пÑоÑие оÑновнÑе возможноÑÑи.
Ð¢Ð°ÐºÐ°Ñ Ð±Ð¾Ð³Ð°ÑÐ°Ñ ÑÑнкÑионалÑноÑÑÑ Ð¿Ð¾ÑвилаÑÑ Ð¿Ð¾ двÑм пÑиÑинам. С одной ÑÑоÑонÑ, в ЯндекÑе еÑÑÑ Ð·Ð°Ð¼ÐµÑнÑй плаÑÑ Ð»Ñдей, пÑедпоÑиÑаÑÑÐ¸Ñ ÑабоÑаÑÑ Ð¿ÑеимÑÑеÑÑвенно в конÑоли. С дÑÑгой, ÑÑо бÑло Ñделано, ÑÑÐ¾Ð±Ñ Ð²ÑигÑаÑÑ Ð²ÑÐµÐ¼Ñ Ð½Ð° ÑазÑабоÑÐºÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑнкÑионалÑного веб-инÑеÑÑейÑа, о коÑоÑом Ð¼Ñ ÐµÑе поговоÑим.
ÐÑбопÑÑнÑй ÑÐµÑ Ð½Ð¸ÑеÑкий нÑанÑ: конÑолÑнÑй ÐºÐ»Ð¸ÐµÐ½Ñ Ñеализован на Python, но ÑаÑпÑоÑÑÑанÑеÑÑÑ ÐºÐ°Ðº ÑÑаÑиÑеÑки Ñлинкованное наÑивное пÑиложение без завиÑимоÑÑей Ñо вÑÑÑоеннÑм инÑеÑпÑеÑаÑоÑом, коÑоÑое компилиÑÑеÑÑÑ Ð¿Ð¾Ð´ Linux, OS X и Windows. ÐÑоме Ñого, он ÑÐ¼ÐµÐµÑ Ð°Ð²ÑомаÑиÑеÑки ÑамоÑÑоÑÑелÑно обновлÑÑÑÑÑ â пÑимеÑно как ÑовÑеменнÑе бÑаÑзеÑÑ. ÐÑе ÑÑо бÑло доÑÑаÑоÑно пÑоÑÑо оÑганизоваÑÑ Ð±Ð»Ð°Ð³Ð¾Ð´Ð°ÑÑ Ð²Ð½ÑÑÑенней инÑÑаÑÑÑÑкÑÑÑе ЯндекÑа Ð´Ð»Ñ ÑбоÑки кода и подгоÑовки Ñелизов.

Python ÑвлÑеÑÑÑ Ð²ÑоÑÑм по ÑаÑпÑоÑÑÑаненноÑÑи ÑзÑком пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² ЯндекÑе поÑле C++,поÑÑÐ¾Ð¼Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑÐºÐ°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека YQL Ñеализована именно на нем. Ðа Ñамом деле она изнаÑалÑно ÑазÑабаÑÑвалаÑÑ ÐºÐ°Ðº ÑаÑÑÑ ÐºÐ¾Ð½ÑолÑного клиенÑа, а заÑем бÑла вÑделена в незавиÑимÑй пÑодÑкÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÑвилаÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¸ÑполÑзоваÑÑ ÐµÐµ в дÑÑгиÑ
Python-окÑÑжениÑÑ
, не изобÑеÑÐ°Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ÑнÑй код заново.
ÐапÑимеÑ, многие аналиÑики лÑбÑÑ ÑабоÑаÑÑ Ð² ÑÑеде Jupyter, Ð´Ð»Ñ ÐºÐ¾ÑоÑой на оÑнове данной клиенÑÑкой библиоÑеки бÑл Ñоздан Ñак назÑваемÑй %yql magic:

ÐмеÑÑе Ñ ÐºÐ¾Ð½ÑолÑнÑм клиенÑом поÑÑавлÑÑÑÑÑ Ð´Ð²Ðµ ÑпеÑиалÑнÑе подпÑогÑаммÑ, коÑоÑÑе запÑÑкаÑÑ Ð¿ÑеднаÑÑÑоеннÑй Jupyter или IPython Ñ Ñже доÑÑÑпной клиенÑÑкой библиоÑекой. Ðменно онии Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð²ÑÑе.

ÐÑновной инÑÑÑÑÐ¼ÐµÐ½Ñ Ð¸Ð·ÑÑÐµÐ½Ð¸Ñ ÑзÑка YQL, ÑазÑабоÑки запÑоÑов и аналиÑики Ð¼Ñ Ð¾ÑÑавили на закÑÑкÑ. Рвеб-инÑеÑÑейÑе, благодаÑÑ Ð¾ÑÑÑÑÑÑÐ²Ð¸Ñ ÑÐµÑ Ð½Ð¸ÑеÑÐºÐ¸Ñ Ð¾Ð³ÑаниÑений конÑоли, вÑе ÑÑнкÑии YQL доÑÑÑÐ¿Ð½Ñ Ð² более наглÑдной ÑоÑме и вÑегда Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð¿Ð¾Ð´ ÑÑкой. ЧаÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑей инÑеÑÑейÑа показана на пÑимеÑÐ°Ñ Ð´ÑÑÐ³Ð¸Ñ ÑкÑанов:
ÐÑе ÑÑÑки в Ñамом REST API анноÑиÑÑÑÑÑÑ Ð¿Ð¾ кодÑ, и на оÑнове ÑÑÐ¸Ñ Ð°Ð½Ð½Ð¾ÑаÑий Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Swagger авÑомаÑиÑеÑки генеÑиÑÑеÑÑÑ Ð¿Ð¾Ð´ÑÐ¾Ð±Ð½Ð°Ñ Ð¾Ð½Ð»Ð°Ð¹Ð½-докÑменÑаÑиÑ. Ðз нее можно попÑобоваÑÑ Ð¿Ð¾Ð·Ð°Ð´Ð°Ð²Ð°ÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð±ÐµÐ· единой ÑÑÑоÑки кода. ÐÑо позволÑÐµÑ Ð»ÐµÐ³ÐºÐ¾ иÑполÑзоваÑÑ YQL, даже еÑли пеÑеÑиÑленнÑе вÑÑе гоÑовÑе ваÑианÑÑ Ð¿Ð¾ каким-Ñо пÑиÑинам не подоÑли. ÐапÑÐ¸Ð¼ÐµÑ â еÑли Ð²Ñ Ð»ÑбиÑе Perl.
ÐаÑÑала поÑа поговоÑиÑÑ Ð¾ Ñом, какого плана задаÑи можно ÑеÑаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Yandex Query Language и какие возможноÑÑи пÑедоÑÑавлÑÑÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑм. ÐÑа ÑаÑÑÑ Ð±ÑÐ´ÐµÑ ÑкоÑее ÑезиÑной, ÑÑÐ¾Ð±Ñ Ð½Ðµ ÑдлинÑÑÑ Ð¸ без Ñого длиннÑй поÑÑ.
Ðе вÑе Ð²Ð¸Ð´Ñ Ð¿ÑеобÑазований даннÑÑ Ñдобно вÑÑажаÑÑ Ð´ÐµÐºÐ»Ð°ÑаÑивно. Ðногда пÑоÑе напиÑаÑÑ Ñикл или воÑполÑзоваÑÑÑÑ ÐºÐ°ÐºÐ¾Ð¹-нибÑÐ´Ñ Ð³Ð¾Ñовой библиоÑекой. ÐÐ»Ñ ÑÐ°ÐºÐ¸Ñ ÑиÑÑаÑий YQL пÑедоÑÑавлÑÐµÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ полÑзоваÑелÑÑÐºÐ¸Ñ ÑÑнкÑий, они же User Defined Functions, они же UDF:
ÐнÑÑÑи Ñ Ð°Ð³ÑегаÑионнÑÑ ÑÑнкÑий иÑполÑзÑеÑÑÑ Ð¾Ð±Ñий ÑÑеймвоÑк Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой
Ðз ÑообÑажений пÑоизводиÑелÑноÑÑи, в ÑеÑÐ¼Ð¸Ð½Ð°Ñ MapReduce Ð´Ð»Ñ Ð°Ð³ÑегаÑионнÑÑ ÑÑнкÑий авÑомаÑиÑеÑки ÑоздаеÑÑÑ Map-side Combiner Ñ Ð¾Ð±Ñединением пÑомежÑÑоÑнÑÑ ÑезÑлÑÑаÑов агÑегаÑии в Reduce.
СлиÑние ÑÐ°Ð±Ð»Ð¸Ñ Ð¿Ð¾ клÑÑам â одна из ÑамÑÑ Ð¿Ð¾Ð¿ÑлÑÑнÑÑ Ð¾Ð¿ÐµÑаÑий, коÑоÑÐ°Ñ ÑаÑÑо нÑжна Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ, но пÑавилÑно ÑеализоваÑÑ ÐºÐ¾ÑоÑÑÑ Ð² ÑеÑÐ¼Ð¸Ð½Ð°Ñ MapReduce â поÑÑи ÑÐµÐ»Ð°Ñ Ð½Ð°Ñка. ÐогиÑеÑки в Yandex Query Language доÑÑÑÐ¿Ð½Ñ Ð²Ñе ÑÑандаÑÑнÑе ÑÐµÐ¶Ð¸Ð¼Ñ Ð¿Ð»ÑÑ Ð½ÐµÑколÑко дополниÑелÑнÑÑ :

ЧÑÐ¾Ð±Ñ ÑкÑÑÑÑ Ð´ÐµÑали Ð¾Ñ Ð¿Ð¾Ð»ÑзоваÑелей, Ð´Ð»Ñ Ð±Ñкендов, оÑнованнÑÑ Ð½Ð° MapReduce, ÑÑÑаÑÐµÐ³Ð¸Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ JOIN вÑбиÑаеÑÑÑ Ð½Ð° леÑÑ Ð² завиÑимоÑÑи Ð¾Ñ ÑÑебÑемого логиÑеÑкого Ñипа и ÑизиÑеÑÐºÐ¸Ñ ÑвойÑÑв ÑÑаÑÑвÑÑÑÐ¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ (ÑÑо Ñак назÑÐ²Ð°ÐµÐ¼Ð°Ñ cost based optimization):
СÑеди наÑÐ¸Ñ Ð±Ð»Ð¸Ð¶Ð°Ð¹ÑÐ¸Ñ Ð¸ ÑÑеднеÑÑоÑнÑÑ Ð¿Ð»Ð°Ð½Ð¾Ð² по Yandex Query Language:

ÐапоÑледок â еÑе Ñаз пÑиглаÑаем на вÑÑÑеÑÑ Ð² наÑем оÑиÑе в ближайÑÑÑ ÑÑббоÑÑ, 15 окÑÑбÑÑ, где Ð¼Ñ Ð¿Ð¾Ð´Ñобнее ÑаÑÑкажем о ÑазнÑÑ Ð°ÑпекÑÐ°Ñ Ð¸Ð½ÑÑаÑÑÑÑкÑÑÑÑ Ð¯Ð½Ð´ÐµÐºÑа.


ÐÑÐµÐ½Ñ ÑкоÑо Ð¼Ñ Ð¿Ð¾Ð½Ñли, ÑÑо ÑÑÑ Ð¼Ð¾Ð³ Ð±Ñ Ð·Ð´Ð¾Ñово помоÑÑ Ð¾Ð±Ñий вÑÑокоÑÑовневÑй ÑзÑк запÑоÑов, коÑоÑÑй Ð±Ñ Ð¿ÑедоÑÑавлÑл единообÑазнÑй доÑÑÑп к Ñже имеÑÑимÑÑ ÑиÑÑемам, а Ñакже избавлÑл Ð¾Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи заново ÑеализовÑваÑÑ ÑиповÑе абÑÑÑакÑии на низкоÑÑовневÑÑ Ð¿ÑимиÑÐ¸Ð²Ð°Ñ , пÑинÑÑÑÑ Ð² ÑÑÐ¸Ñ ÑиÑÑÐµÐ¼Ð°Ñ . Так наÑалаÑÑ ÑазÑабоÑка Yandex Query Language (YQL) â ÑнивеÑÑалÑного деклаÑаÑивного ÑзÑка запÑоÑов к ÑиÑÑемам Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸ обÑабоÑки даннÑÑ . (СÑÐ°Ð·Ñ ÑкажÑ, ÑÑо Ð¼Ñ Ð·Ð½Ð°ÐµÐ¼, ÑÑо ÑÑо Ñже не пеÑÐ²Ð°Ñ ÑÑÑка в миÑе, коÑоÑÐ°Ñ Ð½Ð°Ð·ÑваеÑÑÑ YQL, но Ð¼Ñ ÑеÑили, ÑÑо ÑÑо Ð´ÐµÐ»Ñ Ð½Ðµ меÑаеÑ, и оÑÑавили название.)
РпÑеддвеÑии наÑей вÑÑÑеÑи, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾ÑвÑÑена инÑÑаÑÑÑÑкÑÑÑе ЯндекÑа, Ð¼Ñ ÑеÑили ÑаÑÑказаÑÑ Ð¾ YQL ÑиÑаÑелÑм ХабÑÐ°Ñ Ð°Ð±Ñа.
ÐÑÑ Ð¸ÑекÑÑÑа
ÐÑ, конеÑно, могли Ð±Ñ Ð²Ð·Ð³Ð»ÑнÑÑÑ Ð² ÑÑоÑÐ¾Ð½Ñ Ð¿Ð¾Ð¿ÑлÑÑнÑÑ Ð² миÑе open source-ÑкоÑиÑÑем â ÑÐ°ÐºÐ¸Ñ ÐºÐ°Ðº Hadoop или Spark. Ðо вÑеÑÑез они даже не ÑаÑÑмаÑÑивалиÑÑ. Ðело в Ñом, ÑÑо ÑÑебовалаÑÑ Ð¿Ð¾Ð´Ð´ÐµÑжка Ñже ÑаÑпÑоÑÑÑаненнÑÑ Ð² ЯндекÑе Ñ ÑÐ°Ð½Ð¸Ð»Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ вÑÑиÑлиÑелÑнÑÑ ÑиÑÑем. Ðо многом из-за ÑÑого YQL бÑл ÑпÑоекÑиÑован и Ñеализован ÑаÑÑиÑÑемÑм на лÑбом из ÑÑовней. ÐÑе ÑÑовни Ð¼Ñ Ð¿Ð¾ оÑеÑеди ÑазбеÑем ниже.

Ðа диагÑамме полÑзоваÑелÑÑкие запÑоÑÑ Ð¿ÐµÑемеÑаÑÑÑÑ ÑвеÑÑ Ñ Ð²Ð½Ð¸Ð·, но обÑÑждаÑÑ Ð·Ð°ÑÑагиваемÑе ÑлеменÑÑ Ð¼Ñ Ð±Ñдем в обÑаÑном поÑÑдке, cÐ½Ð¸Ð·Ñ Ð²Ð²ÐµÑÑ , ÑÑÐ¾Ð±Ñ ÑаÑÑказ полÑÑилÑÑ Ð±Ð¾Ð»ÐµÐµ ÑвÑзнÑм. ÐÐ»Ñ Ð½Ð°Ñала паÑÑ Ñлов о поддеÑживаемÑÑ Ð½Ð° даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð±ÑÐºÐµÐ½Ð´Ð°Ñ Ð¸Ð»Ð¸, как Ð¼Ñ Ð¸Ñ Ð½Ð°Ð·Ñваем, пÑовайдеÑÐ°Ñ Ð´Ð°Ð½Ð½ÑÑ :
- Так ÑложилоÑÑ, ÑÑо в ЯндекÑе Ñже болÑÑе пÑÑи Ð»ÐµÑ ÑазÑабаÑÑваÑÑÑÑ Ð´Ð²Ðµ ÑеализаÑии паÑÐ°Ð´Ð¸Ð³Ð¼Ñ MapReduce â YaMR и YT, о коÑоÑой можно подÑобнее поÑиÑаÑÑ Ð² недавнем поÑÑе. ТеÑ
ниÑеÑки они не имеÑÑ Ð¿Ð¾ÑÑи ниÑего обÑего ни дÑÑг Ñ Ð´ÑÑгом, ни Ñ Hadoop. ÐоÑколÑÐºÑ ÑазÑабоÑка ÑиÑÑем Ñакого клаÑÑа â доÑÑаÑоÑно доÑогое ÑдоволÑÑÑвие, год назад бÑло пÑинÑÑо ÑеÑение пÑовеÑÑи «MapReduce-ÑендеÑ». YT победил, и ÑейÑÐ°Ñ Ð¿Ð¾Ð»ÑзоваÑели YaMR заканÑиваÑÑ Ð½Ð° него пеÑеÑ
одиÑÑ. РазÑабоÑка YQL наÑалаÑÑ Ð¿Ð¾ÑÑи одновÑеменно Ñо ÑÑаÑÑом ÑендеÑа, поÑÑÐ¾Ð¼Ñ Ð¾Ð´Ð½Ð¸Ð¼ из оÑновнÑÑ
ÑÑебований ÑÑала поддеÑжка и YT, и YaMR, коÑоÑÑÑ Ð½Ñжно бÑло ÑеализоваÑÑ Ð´Ð»Ñ Ð¾Ð±Ð»ÐµÐ³ÑÐµÐ½Ð¸Ñ Ð¶Ð¸Ð·Ð½Ð¸ полÑзоваÑелей в пеÑеÑ
однÑй пеÑиод.
â - ÐÑо RTMR (Real Time MapReduce) Ñоже когда-Ñо бÑл оÑделÑнÑй поÑÑ. Ðго поддеÑжка ÑейÑÐ°Ñ Ð½Ð°Ñ
одиÑÑÑ Ð½Ð° Ñанней ÑÑадии ÑазÑабоÑки. Ðо-пеÑвÑÑ
, ÑÑÐ¾Ñ Ð¿ÑÐ¾ÐµÐºÑ Ð¿Ð¾ инÑегÑаÑии Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð½Ð¾Ð²Ñм полÑзоваÑелÑм внедÑÑÑÑ RTMR без ÑпеÑподгоÑовки. Ðо-вÑоÑÑÑ
, они ÑмогÑÑ ÐµÐ´Ð¸Ð½Ð¾Ð¾Ð±Ñазно анализиÑоваÑÑ ÐºÐ°Ðº поÑок ÑвежиÑ
даннÑÑ
, Ñак и аÑÑ
ив, ÑобÑаннÑй за длиÑелÑнÑй пеÑиод и наÑ
одÑÑийÑÑ Ð² ÑаÑпÑеделенной Ñайловой ÑиÑÑеме YT.
â - РЯндекÑе ÑиÑÑем Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
Ñ OLTP-паÑÑеÑном иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐµÑе болÑÑе, Ñем оÑнованнÑÑ
на паÑадигме MapReduce. РкаÑеÑÑве пилоÑного пÑоекÑа по инÑегÑаÑии Ñ YQL ÑÑеди ниÑ
бÑл вÑбÑан KiKiMR. Ðо многом Ñакой вÑÐ±Ð¾Ñ Ð±Ñл Ñделан поÑомÑ, ÑÑо поÑÑебноÑÑÑ Ð² дÑÑжелÑбном инÑеÑÑейÑе KiKiMR ÑÑоÑмиÑовалаÑÑ Ð² одно вÑÐµÐ¼Ñ Ñ Ð°ÐºÑивнÑм ÑоÑÑом попÑлÑÑноÑÑи YQL. ÐÑе одна пÑиÑина бÑла в налиÑии Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ KiKiMR ÑеÑÑÑÑов на ÑÑÐ¾Ñ Ð¿ÑоекÑ. ÐеÑалÑнÑй ÑаÑÑказ пÑо KiKiMR здеÑÑ Ð½Ðµ ÑмеÑÑиÑÑ, но еÑли вкÑаÑÑе, ÑÑо ÑаÑпÑеделенное оÑказоÑÑÑойÑивое strict consistent-Ñ
ÑанилиÑе даннÑÑ
, в Ñом ÑиÑле ÑаÑпÑеделенное Ð¼ÐµÐ¶Ð´Ñ Ð´Ð°Ñа-ÑенÑÑами. Ðно Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² инÑÑаллÑÑиÑÑ
, ÑоÑÑоÑÑиÑ
и из неÑколÑкиÑ
маÑин, и из ÑÑÑÑÑ Ñзлов. ÐÑлиÑиÑелÑной оÑобенноÑÑÑÑ Ñ
ÑанилиÑа KiKiMR ÑвлÑеÑÑÑ Ð²ÑÑÑÐ¾ÐµÐ½Ð½Ð°Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²ÑполнÑÑÑ Ð¾Ð¿ÐµÑаÑии ÑÑÑекÑивно и ÑÑанзакÑионно c ÑÑовнем изолÑÑии serializable как над оÑделÑнÑми обÑекÑами (single-row transactions), Ñак и над гÑÑппами ÑаÑпÑеделеннÑÑ
обÑекÑов Ñ
ÑанилиÑа (cross-row/cross-table transactions).
â - ÐÑÐ¾Ñ ÑпиÑок ÑодеÑÐ¶Ð¸Ñ Ð»Ð¸ÑÑ Ñо, ÑÑо Ñже Ñеализовано или Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² ÑабоÑе. Ð Ð¿Ð»Ð°Ð½Ð°Ñ â ÑаÑÑиÑÑÑÑ Ð°ÑÑоÑÑÐ¸Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаемÑÑ Ð² YQL ÑиÑÑем и далÑÑе. ÐапÑимеÑ, оÑÐµÐ½Ñ Ð»Ð¾Ð³Ð¸ÑнÑм ÑазвиÑием ÑобÑÑий ÑÑÐ°Ð½ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑжка ClickHouse, коÑоÑÐ°Ñ ÑейÑÐ°Ñ Ð½ÐµÑколÑко оÑложена лиÑÑ Ð¸Ð·-за огÑаниÑенноÑÑи ÑеÑÑÑÑов и оÑÑÑÑÑÑÐ²Ð¸Ñ Ð¾ÑÑÑой Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи.
ЯдÑо
Ð¢ÐµÑ Ð½Ð¸ÑеÑки YQL, Ñ Ð¾ÑÑ Ð¾Ð½ и ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· оÑноÑиÑелÑно изолиÑованнÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñов и библиоÑек, внÑÑÑенним полÑзоваÑелÑм пÑедоÑÑавлÑеÑÑÑ Ð² пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ ÐºÐ°Ðº ÑеÑвиÑ. ÐÑо позволÑÐµÑ Ð²ÑглÑдеÑÑ Ñ Ð¸Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Â«ÑлÑжбой одного окна» и минимизиÑоваÑÑ ÑÑÑдозаÑÑаÑÑ Ð½Ð° оÑганизаÑионнÑе вопÑоÑÑ Ð²Ñоде вÑдаÑи доÑÑÑпов или наÑÑÑоек ÑаеÑвола Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из бÑкендов. ÐÑоме Ñого, обе ÑеализаÑии клаÑÑиÑеÑкого MapReduce в ЯндекÑе ÑÑебÑÑÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ ÑÐ¸Ð½Ñ Ñонно ожидаÑÑего завеÑÑÐµÐ½Ð¸Ñ ÑÑанзакÑии клиенÑÑкого пÑоÑеÑÑа, а ÑеÑÐ²Ð¸Ñ YQL беÑÐµÑ ÑÑо на ÑÐµÐ±Ñ Ð¸ позволÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑм ÑабоÑаÑÑ Ð² Ñежиме «запÑÑÑил и
ÐÑновной ÑоÑкой Ð²Ñ Ð¾Ð´Ð° в ÑеÑÐ²Ð¸Ñ YQL ÑвлÑеÑÑÑ HTTP REST API, коÑоÑÑй Ñеализован как Java-пÑиложение на Netty и не ÑолÑко занимаеÑÑÑ Ð·Ð°Ð¿ÑÑком поÑÑÑпаÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов на вÑÑиÑление, но и Ð¸Ð¼ÐµÐµÑ ÑиÑокий ÑпекÑÑ Ð²ÑпомогаÑелÑнÑÑ Ð¾Ð±ÑзанноÑÑей:
- ÐеÑколÑко ваÑианÑов аÑÑенÑиÑикаÑии.
- ÐÑоÑмоÑÑ ÑпиÑка доÑÑÑпнÑÑ ÐºÐ»Ð°ÑÑеÑов Ñ Ð±Ñкендами, а Ñакже ÑпиÑков ÑÐ°Ð±Ð»Ð¸Ñ Ð¸ ÑÑ ÐµÐ¼, навигаÑÐ¸Ñ Ð¿Ð¾ ним.
- РепозиÑоÑий ÑÐ¾Ñ ÑаненнÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑми запÑоÑов, а Ñакже иÑÑоÑÐ¸Ñ Ð²ÑÐµÑ Ð·Ð°Ð¿ÑÑков (иÑÑоÑиÑеÑки Ð¶Ð¸Ð²ÐµÑ Ð² MongoDB, но возможно, в бÑдÑÑем ÑÑо измениÑÑÑ).
- Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ завеÑÑеннÑÑ
запÑоÑаÑ
:
- Ð Ñдом Ñ REST API доÑÑÑпен WebSocket endpoint, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾ÑоÑого полÑзоваÑелÑÑкие инÑеÑÑейÑÑ (о Ð½Ð¸Ñ Ð¿Ð¾Ð³Ð¾Ð²Ð¾Ñим ÑÑÑÑ Ð½Ð¸Ð¶Ðµ) ÑпоÑÐ¾Ð±Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·ÑваÑÑ Ð²ÑплÑваÑÑие ÑообÑÐµÐ½Ð¸Ñ Ð² ÑеалÑном вÑемени;
- ÐнÑегÑаÑÐ¸Ñ Ñ Ð²Ð½ÑÑÑенними ÑеÑвиÑами Ð´Ð»Ñ Ð¾ÑпÑавки пиÑем, ÑÐ¼Ñ Ð¸ ÑообÑений в Jabber;
- ÐповеÑÐµÐ½Ð¸Ñ ÑеÑез боÑа в Telegram.
ÐÑполÑзование Java позволило доÑÑаÑоÑно бÑÑÑÑо ÑеализоваÑÑ Ð²ÑÑ ÑÑÑ Ð±Ð¸Ð·Ð½ÐµÑ-Ð»Ð¾Ð³Ð¸ÐºÑ Ð±Ð»Ð°Ð³Ð¾Ð´Ð°ÑÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð³Ð¾ÑовÑÑ Ð°ÑÐ¸Ð½Ñ ÑоннÑÑ ÐºÐ»Ð¸ÐµÐ½Ñов Ð´Ð»Ñ Ð²ÑÐµÑ Ð½ÑжнÑÑ ÑиÑÑем. ÐоÑколÑÐºÑ ÑлиÑком ÑÑÑÐ¾Ð³Ð¸Ñ ÑÑебований по latency пока неÑ, Ñо пÑоблем Ñо ÑбоÑкой мÑÑоÑа бÑло мало, а поÑле пеÑÐµÑ Ð¾Ð´Ð° на G1 они пÑакÑиÑеÑки иÑÑезли. ÐÑе, помимо ÑпомÑнÑÑого вÑÑе, Ð´Ð»Ñ ÑÐ¸Ð½Ñ ÑонизаÑии Ð¼ÐµÐ¶Ð´Ñ Ñзлами иÑполÑзÑеÑÑÑ ZooKeeper, в Ñом ÑиÑле в паÑÑеÑне publisher-subscriber пÑи оÑпÑавке Ñведомлений.
Само вÑполнение полÑзоваÑелÑÑÐºÐ¸Ñ Ð·Ð°Ð¿ÑоÑов на вÑÑиÑление оÑкеÑÑÑиÑÑеÑÑÑ Ð¾ÑделÑнÑми пÑоÑеÑÑами на С++ под названием yqlworker. Ðни могÑÑ Ð±ÑÑÑ Ð·Ð°Ð¿ÑÑÐµÐ½Ñ ÐºÐ°Ðº на ÑÐµÑ Ð¶Ðµ маÑÐ¸Ð½Ð°Ñ , ÑÑо и REST API, Ñак и Ñдаленно. Ðело в Ñом, ÑÑо Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ Ð¸Ð´ÐµÑ Ð¾Ð±Ñение по ÑеÑи Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑазÑабоÑанного и ÑиÑоко ÑаÑпÑоÑÑÑаненного в ЯндекÑе пÑоÑокола MessageBus. Ðод каждÑй запÑÐ¾Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑиÑÑемного вÑзова fork (без exec) ÑоздаеÑÑÑ ÐºÐ¾Ð¿Ð¸Ñ yqlworker. Ð¢Ð°ÐºÐ°Ñ ÑÑ ÐµÐ¼Ð° позволÑÐµÑ Ð´Ð¾ÑÑиÑÑ Ð´Ð¾ÑÑаÑоÑной изолÑÑии Ð¼ÐµÐ¶Ð´Ñ Ð·Ð°Ð¿ÑоÑами ÑазнÑÑ Ð¿Ð¾Ð»ÑзоваÑелей и пÑи ÑÑом â благодаÑÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ñ copy-on-write â не поÑÑаÑиÑÑ Ð²ÑÐµÐ¼Ñ Ð½Ð° иниÑиализаÑиÑ.
Ðак видно из диагÑÐ°Ð¼Ð¼Ñ Ñ Ð²ÑÑокоÑÑовневой аÑÑ Ð¸ÑекÑÑÑой, Yandex Query Language Ð¸Ð¼ÐµÐµÑ Ð´Ð²Ð° пÑедÑÑавлениÑ:
- ÐÑновной ÑинÑакÑÐ¸Ñ Ð±Ð°Ð·Ð¸ÑÑеÑÑÑ Ð½Ð° SQL и пÑедназнаÑен Ð´Ð»Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð»ÑдÑми.
- СинÑакÑÐ¸Ñ s-expressions, в ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, более Ñдобен Ð´Ð»Ñ ÐºÐ¾Ð´Ð¾Ð³ÐµÐ½ÐµÑаÑии.
Ðз запÑоÑа, вне завиÑимоÑÑи Ð¾Ñ Ð²ÑбÑанного ÑинÑакÑиÑа, ÑоздаеÑÑÑ Ð³ÑÐ°Ñ Ð²ÑÑиÑлений (Expression Graph), коÑоÑÑй логиÑеÑки опиÑÑÐ²Ð°ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð¾Ð±ÑабоÑÐºÑ Ð´Ð°Ð½Ð½ÑÑ Ñ Ð¸ÑполÑзованием пÑимиÑивов, попÑлÑÑнÑÑ Ð² ÑÑнкÑионалÑном пÑогÑаммиÑовании. Ð Ñаким пÑимиÑивам оÑноÑÑÑÑÑ: λ-ÑÑнкÑии, оÑобÑажение (Map и FlatMap), ÑилÑÑÑаÑÐ¸Ñ (Filter), ÑвÑÑÑка (Fold), ÑоÑÑиÑовка (Sort), пÑименение (Apply) и многие дÑÑгие. ÐÐ»Ñ SQL-ÑинÑакÑиÑа лекÑÐµÑ Ð¸ паÑÑеÑ, оÑнованнÑе на ANTLR v3, ÑÑÑоÑÑ Abstract Syntax Tree, по коÑоÑÐ¾Ð¼Ñ Ð·Ð°Ñем ÑÑÑоиÑÑÑ Ð³ÑÐ°Ñ Ð²ÑÑиÑлений. ÐÐ»Ñ ÑинÑакÑиÑа s-expression паÑÑÐµÑ Ð¿ÑакÑиÑеÑки ÑÑивиален, поÑколÑÐºÑ Ð³ÑаммаÑика кÑайне пÑоÑÑа, а пÑогÑÐ°Ð¼Ð¼Ñ Ð¸ Ñак опеÑиÑÑÑÑ ÑÑими абÑÑÑакÑиÑми.
Ðалее Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑÑебÑемого ÑезÑлÑÑаÑа запÑÐ¾Ñ Ð¿ÑÐ¾Ñ Ð¾Ð´Ð¸Ñ ÑеÑез неÑколÑко ÑÑадий, пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи возвÑаÑаÑÑÑ Ðº Ñже пÑойденнÑм:
- ТипизаÑиÑ. YQL â пÑинÑипиалÑно ÑÑÑого ÑипизиÑованнÑй ÑзÑк. Ðоводов в полÑÐ·Ñ ÑÑого бÑло много, наÑÐ¸Ð½Ð°Ñ Ð¾Ñ ÐºÐ¾Ñней в SQL, где подÑазÑмеваеÑÑÑ ÑÑ ÐµÐ¼Ð°ÑизаÑиÑ, и заканÑÐ¸Ð²Ð°Ñ Ð±Ð¾Ð»ÐµÐµ ÑиÑоким пÑоÑÑоÑом Ð´Ð»Ñ ÑÑкоÑÐµÐ½Ð¸Ñ â напÑимеÑ, за ÑÑÐµÑ Ð³ÐµÐ½ÐµÑаÑии наÑивного кода на леÑÑ. ÐÑоме пÑоÑÑÑÑ Ñипов даннÑÑ , поддеÑживаеÑÑÑ Ð½ÐµÑколÑко видов конÑейнеÑов (Optional, List, Dict, Tuple и Struct) и ÑпеÑиалÑнÑÑ Ñипов, напÑÐ¸Ð¼ÐµÑ Ð½ÐµÐ¿ÑозÑаÑнÑй ÑказаÑÐµÐ»Ñ (Resource).
- ÐпÑимизаÑиÑ. Ðа ÑÑой ÑÑадии пÑоиÑÑ
одÑÑ Ð½Ðµ ÑолÑко ÑквиваленÑнÑе пÑеобÑазованиÑ, пÑизваннÑе ÑокÑаÑиÑÑ Ð²ÑÐµÐ¼Ñ Ð²ÑполнениÑ. Ðомимо ниÑ
вÑполнÑеÑÑÑ Ð¿Ñиведение плана дейÑÑвий к видÑ, коÑоÑÑй бÑкенд ÑпоÑобен иÑполниÑÑ. Ð ÑаÑÑноÑÑи, логиÑеÑкие опеÑаÑии, коÑоÑÑе бÑкенд Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°Ñивно вÑполниÑÑ, заменÑÑÑÑÑ Ð½Ð° ÑизиÑеÑкие. Таким обÑазом, в YQL еÑÑÑ Ñвой ÑÑеймвоÑк Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑоÑов, коÑоÑÑе можно ÑÑловно ÑазделиÑÑ Ð½Ð° ÑÑи каÑегоÑии:
- обÑие пÑавила логиÑеÑÐºÐ¸Ñ Ð¾Ð¿ÑимизаÑий;
- обÑие пÑавила, ÑпеÑиÑиÑнÑе Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑнÑÑ Ð±Ñкендов;
- опÑимизаÑии, вÑбиÑаÑÑие ÑÑ Ð¸Ð»Ð¸ инÑÑ ÑÑÑаÑÐµÐ³Ð¸Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð² runtimе (к ним Ð¼Ñ ÐµÑе веÑнемÑÑ).
- ÐÑполнение. ÐÑли поÑле опÑимизаÑии не оÑÑалоÑÑ Ð¾Ñибок, гÑÐ°Ñ Ð¿ÑиобÑеÑÐ°ÐµÑ Ð²Ð¸Ð´, вÑполнимÑй Ñ Ð¸ÑполÑзованием API бÑкенда. ÐолÑÑÑÑ ÑаÑÑÑ Ð²Ñемени yqlworker именно ÑÑо и делаеÑ. ÐÑÑавÑиеÑÑ Ð² гÑаÑе вÑÑиÑлений логиÑеÑкие опеÑаÑии иÑполнÑÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑзкоÑпеÑиализиÑованного инÑеÑпÑеÑаÑоÑа, по возможноÑÑи â на вÑÑиÑлиÑелÑнÑÑ Ð¼Ð¾ÑноÑÑÑÑ Ð±Ñкендов.
Ðа лÑбой из ÑÑадий жизни запÑоÑа он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑеÑиализован обÑаÑно в ÑинÑакÑиÑе s-expressions, ÑÑо кÑайне Ñдобно Ð´Ð»Ñ Ð´Ð¸Ð°Ð³Ð½Ð¾ÑÑики и Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¿ÑоиÑÑ Ð¾Ð´ÑÑего.
ÐнÑеÑÑейÑÑ
Ðак ÑпоминалоÑÑ Ð²Ð¾ введении, одним из клÑÑевÑÑ ÑÑебований к YQL ÑвлÑлоÑÑ ÑдобÑÑво иÑполÑзованиÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¿ÑблиÑнÑм инÑеÑÑейÑам ÑделÑеÑÑÑ Ð¾Ñобое внимание и они кÑайне акÑивно ÑазвиваÑÑÑÑ.
ÐонÑолÑнÑй клиенÑ

Ðа каÑÑинке показан инÑеÑакÑивнÑй Ñежим Ñ Ð°Ð²Ñодополнением, подÑвеÑкой ÑинÑакÑиÑа, ÑвеÑовÑми Ñемами, ÑведомлениÑми и пÑоÑими ÑкÑаÑаÑелÑÑÑвами. Ðо конÑолÑнÑй ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑÑкаÑÑÑÑ Ð¸ в Ñежиме ввода-вÑвода из Ñайлов или ÑÑандаÑÑнÑÑ Ð¿Ð¾Ñоков, ÑÑо позволÑÐµÑ Ð¸Ð½ÑегÑиÑоваÑÑ ÐµÐ³Ð¾ в пÑоизволÑнÑе ÑкÑипÑÑ Ð¸ ÑегÑлÑÑнÑе пÑоÑеÑÑÑ. ÐÑÑÑ ÐºÐ°Ðº ÑÐ¸Ð½Ñ ÑоннÑй, Ñак и аÑÐ¸Ð½Ñ ÑоннÑй запÑÑк опеÑаÑий, пÑоÑмоÑÑ Ð¿Ð»Ð°Ð½Ð° запÑоÑа, пÑикÑепление локалÑнÑÑ Ñайлов, навигаÑÐ¸Ñ Ð¿Ð¾ клаÑÑеÑам и пÑоÑие оÑновнÑе возможноÑÑи.
Ð¢Ð°ÐºÐ°Ñ Ð±Ð¾Ð³Ð°ÑÐ°Ñ ÑÑнкÑионалÑноÑÑÑ Ð¿Ð¾ÑвилаÑÑ Ð¿Ð¾ двÑм пÑиÑинам. С одной ÑÑоÑонÑ, в ЯндекÑе еÑÑÑ Ð·Ð°Ð¼ÐµÑнÑй плаÑÑ Ð»Ñдей, пÑедпоÑиÑаÑÑÐ¸Ñ ÑабоÑаÑÑ Ð¿ÑеимÑÑеÑÑвенно в конÑоли. С дÑÑгой, ÑÑо бÑло Ñделано, ÑÑÐ¾Ð±Ñ Ð²ÑигÑаÑÑ Ð²ÑÐµÐ¼Ñ Ð½Ð° ÑазÑабоÑÐºÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑнкÑионалÑного веб-инÑеÑÑейÑа, о коÑоÑом Ð¼Ñ ÐµÑе поговоÑим.
ÐÑбопÑÑнÑй ÑÐµÑ Ð½Ð¸ÑеÑкий нÑанÑ: конÑолÑнÑй ÐºÐ»Ð¸ÐµÐ½Ñ Ñеализован на Python, но ÑаÑпÑоÑÑÑанÑеÑÑÑ ÐºÐ°Ðº ÑÑаÑиÑеÑки Ñлинкованное наÑивное пÑиложение без завиÑимоÑÑей Ñо вÑÑÑоеннÑм инÑеÑпÑеÑаÑоÑом, коÑоÑое компилиÑÑеÑÑÑ Ð¿Ð¾Ð´ Linux, OS X и Windows. ÐÑоме Ñого, он ÑÐ¼ÐµÐµÑ Ð°Ð²ÑомаÑиÑеÑки ÑамоÑÑоÑÑелÑно обновлÑÑÑÑÑ â пÑимеÑно как ÑовÑеменнÑе бÑаÑзеÑÑ. ÐÑе ÑÑо бÑло доÑÑаÑоÑно пÑоÑÑо оÑганизоваÑÑ Ð±Ð»Ð°Ð³Ð¾Ð´Ð°ÑÑ Ð²Ð½ÑÑÑенней инÑÑаÑÑÑÑкÑÑÑе ЯндекÑа Ð´Ð»Ñ ÑбоÑки кода и подгоÑовки Ñелизов.
Python-библиоÑека

Python ÑвлÑеÑÑÑ Ð²ÑоÑÑм по ÑаÑпÑоÑÑÑаненноÑÑи ÑзÑком пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² ЯндекÑе поÑле C++,
ÐапÑимеÑ, многие аналиÑики лÑбÑÑ ÑабоÑаÑÑ Ð² ÑÑеде Jupyter, Ð´Ð»Ñ ÐºÐ¾ÑоÑой на оÑнове данной клиенÑÑкой библиоÑеки бÑл Ñоздан Ñак назÑваемÑй %yql magic:

ÐмеÑÑе Ñ ÐºÐ¾Ð½ÑолÑнÑм клиенÑом поÑÑавлÑÑÑÑÑ Ð´Ð²Ðµ ÑпеÑиалÑнÑе подпÑогÑаммÑ, коÑоÑÑе запÑÑкаÑÑ Ð¿ÑеднаÑÑÑоеннÑй Jupyter или IPython Ñ Ñже доÑÑÑпной клиенÑÑкой библиоÑекой. Ðменно онии Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð²ÑÑе.
Ðеб-инÑеÑÑейÑ

ÐÑновной инÑÑÑÑÐ¼ÐµÐ½Ñ Ð¸Ð·ÑÑÐµÐ½Ð¸Ñ ÑзÑка YQL, ÑазÑабоÑки запÑоÑов и аналиÑики Ð¼Ñ Ð¾ÑÑавили на закÑÑкÑ. Рвеб-инÑеÑÑейÑе, благодаÑÑ Ð¾ÑÑÑÑÑÑÐ²Ð¸Ñ ÑÐµÑ Ð½Ð¸ÑеÑÐºÐ¸Ñ Ð¾Ð³ÑаниÑений конÑоли, вÑе ÑÑнкÑии YQL доÑÑÑÐ¿Ð½Ñ Ð² более наглÑдной ÑоÑме и вÑегда Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð¿Ð¾Ð´ ÑÑкой. ЧаÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑей инÑеÑÑейÑа показана на пÑимеÑÐ°Ñ Ð´ÑÑÐ³Ð¸Ñ ÑкÑанов:
- ÐвÑодополнение и пÑоÑмоÑÑ ÑÑ
ÐµÐ¼Ñ ÑаблиÑ
Ðогика авÑÐ¾Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов Ñ ÐºÐ¾Ð½ÑолÑного клиенÑа и веб-инÑеÑÑейÑа обÑаÑ. Ðна ÑÐ¼ÐµÐµÑ Ð´Ð¾ÑÑаÑоÑно ÑоÑно ÑÑиÑÑваÑÑ ÐºÐ¾Ð½ÑекÑÑ, в коÑоÑом пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð²Ð²Ð¾Ð´. ÐÑо позволÑÐµÑ ÐµÐ¹ подÑказÑваÑÑ ÑолÑко ÑелеванÑнÑе клÑÑевÑе Ñлова или имена ÑаблиÑ, колонок и ÑÑнкÑий, а не вÑÑ Ð¿Ð¾Ð´ÑÑд.
â - РабоÑа Ñ ÑоÑ
ÑаненнÑми запÑоÑами
ÐÑи ÑÐ¾Ñ Ñанении запÑоÑа под именем они попадаÑÑ Ð² мини-аналог ÑепозиÑоÑÐ¸Ñ ÐºÐ¾Ð´Ð° Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑÑ Ð¿ÑоÑмоÑÑа иÑÑоÑии и возвÑаÑа к пÑедÑдÑÑим веÑÑиÑм.
â - Ðлан вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа
ÐдеÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð° наиболее пÑоÑÑÐ°Ñ Ð¸ ÑнивеÑÑалÑÐ½Ð°Ñ ÑеализаÑÐ¸Ñ JOIN в ÑеÑÐ¼Ð¸Ð½Ð°Ñ MapReduce.
â
⦠и не ÑолÑко
ÐÑе ÑÑÑки в Ñамом REST API анноÑиÑÑÑÑÑÑ Ð¿Ð¾ кодÑ, и на оÑнове ÑÑÐ¸Ñ Ð°Ð½Ð½Ð¾ÑаÑий Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Swagger авÑомаÑиÑеÑки генеÑиÑÑеÑÑÑ Ð¿Ð¾Ð´ÑÐ¾Ð±Ð½Ð°Ñ Ð¾Ð½Ð»Ð°Ð¹Ð½-докÑменÑаÑиÑ. Ðз нее можно попÑобоваÑÑ Ð¿Ð¾Ð·Ð°Ð´Ð°Ð²Ð°ÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð±ÐµÐ· единой ÑÑÑоÑки кода. ÐÑо позволÑÐµÑ Ð»ÐµÐ³ÐºÐ¾ иÑполÑзоваÑÑ YQL, даже еÑли пеÑеÑиÑленнÑе вÑÑе гоÑовÑе ваÑианÑÑ Ð¿Ð¾ каким-Ñо пÑиÑинам не подоÑли. ÐапÑÐ¸Ð¼ÐµÑ â еÑли Ð²Ñ Ð»ÑбиÑе Perl.
ÐозможноÑÑи
ÐаÑÑала поÑа поговоÑиÑÑ Ð¾ Ñом, какого плана задаÑи можно ÑеÑаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Yandex Query Language и какие возможноÑÑи пÑедоÑÑавлÑÑÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑм. ÐÑа ÑаÑÑÑ Ð±ÑÐ´ÐµÑ ÑкоÑее ÑезиÑной, ÑÑÐ¾Ð±Ñ Ð½Ðµ ÑдлинÑÑÑ Ð¸ без Ñого длиннÑй поÑÑ.
SQL
- ÐÑновной Ð´Ð¸Ð°Ð»ÐµÐºÑ YQL оÑнован на ÑÑандаÑÑе SQL:1992 Ñ Ð²ÐºÑаплениÑми из более новÑÑ ÑедакÑий. ÐÑе оÑновнÑе конÑÑÑÑкÑии поддеÑживаÑÑÑÑ, но Ð¿Ð¾Ð»Ð½Ð°Ñ ÑовмеÑÑимоÑÑÑ Ð² ÑонкоÑÑÑÑ , коÑоÑÑе оказалиÑÑ Ð½Ðµ оÑÐµÐ½Ñ Ð²Ð¾ÑÑÑебованÑ, â еÑе в ÑазÑабоÑке. ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð¼Ð½Ð¾Ð³Ð¸Ð¼ новÑм полÑзоваÑелÑм, коÑоÑÑе ÑанÑÑе ÑабоÑали Ñ ÐºÐ°ÐºÐ¸Ð¼Ð¸-либо базами даннÑÑ Ñ SQL-инÑеÑÑейÑом, пÑÐ¸Ñ Ð¾Ð´Ð¸ÑÑÑ Ð¸Ð·ÑÑаÑÑ ÑзÑк далеко не Ñ Ð½ÑлÑ.
- Ðа бÑкендаÑ
, ÑабоÑаÑÑиÑ
в паÑадигме MapReduce, ÑелевÑе ÑаблиÑÑ (Ð´Ð»Ñ Ð¿ÑоÑÑоÑÑ) ÑоздаÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки. ÐапÑоÑÑ ÑаÑе вÑего ÑоÑÑоÑÑ Ð¸Ð·
SELECT
пÑоизволÑного ÑÑÐ¾Ð²Ð½Ñ ÑложноÑÑи и опÑионалÑно ÑодеÑжаÑINSERT INTO
. - Ð OLTP-ÑÑенаÑиÑÑ
доÑÑÑÐ¿Ð½Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑеннÑе DDL (
CREATE TABLE
) и CRUD (плÑÑUPDATE
,REPLACE
,UPSERT
иDELETE
). - ÐÐ»Ñ Ð¼Ð½Ð¾Ð³Ð¸Ñ
ÑиÑÑаÑий, коÑоÑÑе в ÑÑандаÑÑном 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
â PostgreSQL,$unwind
â MongoDB,LATERAL VIEW
â Hive,FLATTEN
â Google BigQuery.
â- ЯвнÑе
PROCESS
(Map) иREDUCE
(Reduce).
ÐозволÑÑÑ Ð²ÑÑÑаиваÑÑ Ð² запÑоÑÑ Ð½Ð° YQL cÑÑеÑÑвÑÑÑий код, напиÑаннÑй в паÑадигме MapReduce, в ÑоÑеÑании Ñ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð¼ полÑзоваÑелÑÑÐºÐ¸Ñ ÑÑнкÑий, о коÑоÑом Ð¿Ð¾Ð¹Ð´ÐµÑ ÑеÑÑ Ð½Ð¸Ð¶Ðµ.
- ÐменованнÑе вÑÑажениÑ
User Defined Functions
Ðе вÑе Ð²Ð¸Ð´Ñ Ð¿ÑеобÑазований даннÑÑ Ñдобно вÑÑажаÑÑ Ð´ÐµÐºÐ»Ð°ÑаÑивно. Ðногда пÑоÑе напиÑаÑÑ Ñикл или воÑполÑзоваÑÑÑÑ ÐºÐ°ÐºÐ¾Ð¹-нибÑÐ´Ñ Ð³Ð¾Ñовой библиоÑекой. ÐÐ»Ñ ÑÐ°ÐºÐ¸Ñ ÑиÑÑаÑий YQL пÑедоÑÑавлÑÐµÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ полÑзоваÑелÑÑÐºÐ¸Ñ ÑÑнкÑий, они же User Defined Functions, они же UDF:
- С++ UDF
- «Ðз коÑобки» доÑÑÑпно более 100 ÑÑнкÑий на C++, ÑазделеннÑÑ Ð±Ð¾Ð»ÐµÐµ Ñем на 15 модÑлей. ÐÑимеÑÑ Ð¼Ð¾Ð´Ñлей: String, DateTime, Pire, Re2, Protobuf, Json и дÑ.
- ФизиÑеÑки C++ UDF пÑедÑÑавлÑÑÑ Ñобой динамиÑеÑки подгÑÑжаемÑе библиоÑеки (.so) Ñ ABI-safe-пÑоÑоколом вÑзова и ÑегиÑÑÑаÑии ÑÑнкÑий.
- ÐÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð½Ð°Ð¿Ð¸ÑаÑÑ ÑÐ²Ð¾Ñ C++ UDF, ÑобÑаÑÑ ÐµÐµ локалÑно (ÑиÑÑема ÑбоÑки Ð¸Ð¼ÐµÐµÑ Ð³Ð¾ÑовÑй Ð½Ð°Ð±Ð¾Ñ Ð½Ð°ÑÑÑоек ÑбоÑки Ð´Ð»Ñ UDF), загÑÑзиÑÑ ÑÑандаÑÑнÑм обÑазом в Ñ ÑанилиÑе и ÑÑÐ°Ð·Ñ Ð¶Ðµ наÑаÑÑ Ð¸ÑполÑзоваÑÑ Ð² запÑоÑÐ°Ñ , пÑиложив ее по URL.
- ÐÐ»Ñ Ð¿ÑоÑÑÑÑ UDF Ñдобно иÑполÑзоваÑÑ Ð³Ð¾ÑовÑе C++-макÑоÑÑ, ÑкÑÑваÑÑие деÑали, а пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи можно воÑполÑзоваÑÑÑÑ Ð³Ð¸Ð±ÐºÐ¸Ð¼Ð¸ инÑеÑÑейÑами, ÑозданнÑми под ÑазнÑе поÑÑебноÑÑи.
â - Python UDF
- Ðогда пÑоизводиÑелÑноÑÑÑ Ð½Ðµ Ñак важна, а Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñи нÑжно бÑÑÑÑо ÑделаÑÑ Ð²ÑÑÐ°Ð²ÐºÑ Ñ Ð¸Ð¼Ð¿ÐµÑаÑивной бизнеÑ-логикой, оÑÐµÐ½Ñ Ñдобно ÑазбавиÑÑ Ð´ÐµÐºÐ»Ð°ÑаÑивнÑй запÑÐ¾Ñ ÐºÐ¾Ð´Ð¾Ð¼ на Python. ÐолÑÑинÑÑво ÑоÑÑÑдников ЯндекÑа знаÑÑ Python, а еÑли кÑо-Ñо не Ð·Ð½Ð°ÐµÑ â на базовом ÑÑовне он изÑÑаеÑÑÑ Ð·Ð° единиÑÑ Ð´Ð½ÐµÐ¹.
- СкÑÐ¸Ð¿Ñ Ð½Ð° Python можно либо напиÑаÑÑ ÐºÐ°Ðº inline впеÑемеÑÐºÑ Ñ SQL или s-expressions, либо пÑиложиÑÑ Ðº запÑоÑÑ Ð¾ÑделÑнÑм Ñайлом. ÐообÑе, Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ доÑÑавки Ñайлов до меÑÑа вÑÑиÑлений Ñ ÐºÐ»Ð¸ÐµÐ½Ñа или по URL ÑнивеÑÑален и Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð²Ñего Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾Ð³Ð¾, напÑÐ¸Ð¼ÐµÑ Ð´Ð»Ñ Ñайлов-ÑловаÑей.
- ÐоÑколÑÐºÑ Ð² Python иÑполÑзÑеÑÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑÐºÐ°Ñ ÑипизаÑиÑ, а в YQL â ÑÑаÑиÑеÑкаÑ, Ñо Ð¾Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÑÑебÑеÑÑÑ Ð¾Ð±ÑÑвиÑÑ ÑигнаÑÑÑÑ ÑÑнкÑии на гÑаниÑе. СейÑÐ°Ñ Ð¾Ð½Ð° опиÑÑваеÑÑÑ ÑнаÑÑжи Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑного мини-ÑзÑка: дело в Ñом, ÑÑо на ÑÑапе ÑипизаÑии не Ñ Ð¾ÑеÑÑÑ Ð·Ð°Ð¿ÑÑкаÑÑ Ð¸Ð½ÑеÑпÑеÑаÑоÑ. РбÑдÑÑем, возможно, пÑикÑÑÑим поддеÑÐ¶ÐºÑ Python 3 type hints.
- Ð¢ÐµÑ Ð½Ð¸ÑеÑки поддеÑжка Python в YQL Ñеализована ÑеÑез C++ UDF Ñо вÑÑÑоеннÑм инÑеÑпÑеÑаÑоÑом Python и неболÑÑой ÑинÑакÑиÑеÑкий ÑÐ°Ñ Ð°Ñ Ð² SQL-паÑÑеÑе Ð´Ð»Ñ ÐµÐµ вÑзова.
â - Streaming UDF. ЧÑÐ¾Ð±Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло плавно пеÑейÑи Ñ Ð´ÑÑÐ³Ð¸Ñ ÑÐµÑ Ð½Ð¾Ð»Ð¾Ð³Ð¸Ð¹, и Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð¾ÑобÑÑ ÑлÑÑаев еÑÑÑ ÑпоÑоб запÑÑÑиÑÑ Ð¿ÑоизволÑнÑй ÑкÑÐ¸Ð¿Ñ Ð¸Ð»Ð¸ иÑполнÑемÑй Ñайл в поÑоковом Ñежиме. РиÑоге полÑÑим UDF, пÑеобÑазÑÑÑÑÑ Ð¾Ð´Ð¸Ð½ ÑпиÑок ÑÑÑок в дÑÑгой.
ÐгÑегаÑионнÑе ÑÑнкÑии
ÐнÑÑÑи Ñ Ð°Ð³ÑегаÑионнÑÑ ÑÑнкÑий иÑполÑзÑеÑÑÑ Ð¾Ð±Ñий ÑÑеймвоÑк Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой
DISTINCT
и вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ðº на веÑÑ
нем ÑÑовне, Ñак и в GROUP BY
(в Ñом ÑиÑле Ñ ROLLUP/CUBE/GROUPING SETS
из ÑÑандаÑÑа SQL:1999). РоÑлиÑаÑÑÑÑ ÑÑи ÑÑнкÑии лиÑÑ Ð±Ð¸Ð·Ð½ÐµÑ-логикой. ÐÐ¾Ñ Ð½ÐµÐºÐ¾ÑоÑÑе пÑимеÑÑ:- СÑандаÑÑнÑе:
COUNT
,SUM
,MIN
,MAX
,AVG
,STDDEV
,VARIANCE
; - ÐополниÑелÑнÑе:
COUNT_IF
,SOME
,LIST
,MIN_BY/MAX_BY
,BIT_AND/OR/XOR
,BOOL_AND/OR
; - СÑаÑиÑÑика:
MEDIAN
иPERCENTILE
(по алгоÑиÑÐ¼Ñ TDigest);HISTOGRAM
â адапÑивнÑе гиÑÑогÑÐ°Ð¼Ð¼Ñ Ð¿Ð¾ ÑиÑловÑм знаÑениÑм, не ÑÑебÑÑÑие никакого Ð·Ð½Ð°Ð½Ð¸Ñ Ð¸Ñ ÑаÑпÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ (по алгоÑиÑÐ¼Ñ Ð½Ð° оÑнове Streaming Parallel Decision Tree).
- User Defined Aggregation Functions: Ð´Ð»Ñ ÑовÑем ÑпеÑиÑиÑнÑÑ Ð·Ð°Ð´Ð°Ñ Ð¼Ð¾Ð¶Ð½Ð¾ пеÑедаÑÑ Ð² ÑÑеймоÑк агÑегаÑионнÑÑ ÑÑнкÑий ÑÐ²Ð¾Ñ Ð±Ð¸Ð·Ð½ÐµÑ-логикÑ, Ñоздав неÑколÑко вÑзÑваемÑÑ Ð·Ð½Ð°Ñений Ñ Ð¾Ð¿Ñеделенной ÑигнаÑÑÑой пÑи помоÑи опиÑанного вÑÑе Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° UDF, напÑимеÑ, на Python.
Ðз ÑообÑажений пÑоизводиÑелÑноÑÑи, в ÑеÑÐ¼Ð¸Ð½Ð°Ñ MapReduce Ð´Ð»Ñ Ð°Ð³ÑегаÑионнÑÑ ÑÑнкÑий авÑомаÑиÑеÑки ÑоздаеÑÑÑ Map-side Combiner Ñ Ð¾Ð±Ñединением пÑомежÑÑоÑнÑÑ ÑезÑлÑÑаÑов агÑегаÑии в Reduce.
DISTINCT
ÑейÑÐ°Ñ Ð²Ñегда ÑабоÑÐ°ÐµÑ ÑоÑно (без пÑиближеннÑÑ
вÑÑиÑлений), поÑÑÐ¾Ð¼Ñ ÑÑебÑÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑного Reduce Ð´Ð»Ñ ÑазмеÑки ÑникалÑнÑÑ
знаÑений.JOIN ÑаблиÑ
СлиÑние ÑÐ°Ð±Ð»Ð¸Ñ Ð¿Ð¾ клÑÑам â одна из ÑамÑÑ Ð¿Ð¾Ð¿ÑлÑÑнÑÑ Ð¾Ð¿ÐµÑаÑий, коÑоÑÐ°Ñ ÑаÑÑо нÑжна Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ, но пÑавилÑно ÑеализоваÑÑ ÐºÐ¾ÑоÑÑÑ Ð² ÑеÑÐ¼Ð¸Ð½Ð°Ñ MapReduce â поÑÑи ÑÐµÐ»Ð°Ñ Ð½Ð°Ñка. ÐогиÑеÑки в Yandex Query Language доÑÑÑÐ¿Ð½Ñ Ð²Ñе ÑÑандаÑÑнÑе ÑÐµÐ¶Ð¸Ð¼Ñ Ð¿Ð»ÑÑ Ð½ÐµÑколÑко дополниÑелÑнÑÑ :

ЧÑÐ¾Ð±Ñ ÑкÑÑÑÑ Ð´ÐµÑали Ð¾Ñ Ð¿Ð¾Ð»ÑзоваÑелей, Ð´Ð»Ñ Ð±Ñкендов, оÑнованнÑÑ Ð½Ð° MapReduce, ÑÑÑаÑÐµÐ³Ð¸Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ JOIN вÑбиÑаеÑÑÑ Ð½Ð° леÑÑ Ð² завиÑимоÑÑи Ð¾Ñ ÑÑебÑемого логиÑеÑкого Ñипа и ÑизиÑеÑÐºÐ¸Ñ ÑвойÑÑв ÑÑаÑÑвÑÑÑÐ¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ (ÑÑо Ñак назÑÐ²Ð°ÐµÐ¼Ð°Ñ cost based optimization):
СÑÑаÑÐµÐ³Ð¸Ñ | ÐÑаÑкое опиÑание | ÐоÑÑÑпна Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸ÑеÑÐºÐ¸Ñ Ñипов |
Common Join | 1-2 Map + Reduce | ÐÑе |
Map-side Join | 1 Map | Inner, Left, Left only, Left semi, Cross |
Sharded Map-side Join | k паÑалеллÑнÑÑ Map (k <= 4 по-ÑмолÑаниÑ) | Inner, Left semi Ñ ÑникалÑной пÑавой, Cross |
Reduce Without Sort | 1 Reduce, но ÑÑебÑÐµÑ Ð·Ð°Ñанее пÑавилÑно оÑÑоÑÑиÑованного Ð²Ñ Ð¾Ð´Ð° | в ÑазÑабоÑке |
ÐапÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑазвиÑиÑ
СÑеди наÑÐ¸Ñ Ð±Ð»Ð¸Ð¶Ð°Ð¹ÑÐ¸Ñ Ð¸ ÑÑеднеÑÑоÑнÑÑ Ð¿Ð»Ð°Ð½Ð¾Ð² по Yandex Query Language:
- ÐолÑÑе бÑкендов в ÑÑаÑÑÑе production.
- ÐенеÑаÑÐ¸Ñ Ð½Ð°Ñивного кода и векÑоÑизаÑÐ¸Ñ Ð²Ð¼ÐµÑÑо ÑпеÑиализиÑованного инÑеÑпÑеÑаÑоÑа.
- ÐÑодолжение опÑимизаÑии ввода-вÑвода и вÑбоÑа ÑÑÑаÑегий вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ð° леÑÑ Ð² завиÑимоÑÑи Ð¾Ñ ÑизиÑеÑÐºÐ¸Ñ ÑвойÑÑв ÑаблиÑ.
- ÐконнÑе ÑÑнкÑии на оÑнове ÑÑандаÑÑа SQL:2003.
- ÐоддеÑжка SQL:1992 в полном обÑеме, Ñоздание ODBC/JDBC-дÑайвеÑов Ñ Ð¿Ð¾ÑледÑÑÑей инÑегÑаÑией Ñ Ð¿Ð¾Ð¿ÑлÑÑнÑми ORM и инÑÑÑÑменÑами бизнеÑ-аналиÑики.
- ÐаглÑÐ´Ð½Ð°Ñ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑаÑÐ¸Ñ Ð¿ÑогÑеÑÑа вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑий.
- РаÑÑиÑеннÑй аÑÑоÑÑÐ¸Ð¼ÐµÐ½Ñ Ð´Ð¾ÑÑÑпнÑÑ ÑзÑков пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ UDF â поÑмаÑÑиваем на JavaScript (V8), Lua (LuaJIT) и Python 3.
- ÐнÑегÑаÑÐ¸Ñ Ñ:
- ÑаÑпÑеделеннÑм оÑказоÑÑÑойÑивÑм ÑеÑвиÑом запÑÑка Ð·Ð°Ð´Ð°Ñ Ð¿Ð¾ ÑаÑпиÑÐ°Ð½Ð¸Ñ (a la cron) или наÑÑÑÐ¿Ð»ÐµÐ½Ð¸Ñ ÑобÑÑий,
- инÑÑÑÑменÑами визÑализаÑии (внÑÑÑенний аналог ЯндекÑ.СÑаÑиÑÑики).

Ðодводим иÑоги
- Ðак показÑваÑÑ ÑиÑÑÑ (Ñм. ÑÑаÑиÑÑикÑ), YQL ÑÑал пÑодÑкÑом, оÑÐµÐ½Ñ Ð²Ð¾ÑÑÑебованнÑм ÑÑеди ÑоÑÑÑдников ЯндекÑа. Тем не менее, обÑÐµÐ¼Ñ Ð¾Ð±ÑабоÑаннÑÑ Ñ ÐµÐ³Ð¾ помоÑÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð½Ðµ Ñак велики. ÐÑо обÑÑловлено Ñем, ÑÑо иÑÑоÑиÑеÑки вÑе пÑодакÑен-пÑоÑеÑÑÑ ÑабоÑаÑÑ Ð½Ð° низкоÑÑовневÑÑ Ð¸Ð½ÑеÑÑейÑÐ°Ñ , Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÐ¸Ñ Ð¿Ð¾Ð´ ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ ÑиÑÑем. То еÑÑÑ Ð¸Ñ Ð¿Ð¾ÑÑепеннÑй пеÑевод на YQL ÑолÑко наÑинаеÑÑÑ.
- ÐнÑÑÑи ЯндекÑа Ð¼Ñ Ð¿Ð¾Ð½Ð°ÑÐ°Ð»Ñ ÑÑалкивалиÑÑ Ñ ÑопÑоÑивлением ÑледÑÑÑего вида: ÑабоÑÐ°Ñ Ð² паÑадигме MapReduce долгие годÑ, многие Ñже наÑÑолÑко к ней пÑивÑкли, ÑÑо не Ñ Ð¾ÑÑÑ Ð¿ÐµÑеÑÑиваÑÑÑÑ. Ð ÐÑкадии, оÑновном монолиÑном ÑепозиÑоÑии кода ЯндекÑа, Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑоÑÑÑдника еÑÑÑ Ñвой Ñголок. Там иÑÑоÑиÑеÑки Ð»ÐµÐ¶Ð°Ñ Ð±ÑквалÑно ÑоÑни пÑогÑамм на C++, напиÑаннÑÑ Ð¸ÑклÑÑиÑелÑно ÑÑÐ¾Ð±Ñ Ð¾ÑÑилÑÑÑоваÑÑ ÐºÐ°ÐºÐ¾Ð¹-нибÑÐ´Ñ ÑпеÑиÑиÑнÑй лог или пÑоÑÑо ÑаблиÑÑ Ð² MapReduce под конкÑеÑнÑÑ Ð·Ð°Ð´Ð°ÑÑ. Ðо поÑле набоÑа кÑиÑиÑеÑкой маÑÑÑ Ð´Ð¾Ð²Ð¾Ð»ÑнÑÑ Ð¿Ð¾Ð»ÑзоваÑелей подобнÑй ÑкепÑиÑизм вÑÑÑеÑаеÑÑÑ Ð²ÑÑ Ñеже.
- ÐозвÑаÑаÑÑÑ Ðº вопÑоÑÑ, «поÑÐµÐ¼Ñ Ð½Ðµ Hive, Spark SQL или лÑбой дÑÑгой
SQL over ***
»: в пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð½Ð°Ñ Ð¸Ð½ÑеÑеÑовала именно поддеÑжка акÑивно иÑполÑзÑемÑÑ Ð² Ð¯Ð½Ð´ÐµÐºÑ ÑиÑÑем. ХоÑелоÑÑ ÑпÑоÑÑиÑÑ Ð¼Ð¸Ð³ÑаÑии пÑоекÑов, Ñо еÑÑÑ Ð²Ñе компоненÑÑ Ð¸Ð· диагÑÐ°Ð¼Ð¼Ñ Ð² наÑале поÑÑа вÑе Ñавно пÑиÑлоÑÑ Ð±Ñ ÑазÑабаÑÑваÑÑ Ð¸/или доÑабаÑÑваÑÑ. ÐÑи ÑÑом нÑжно бÑло Ð±Ñ Ð¿Ð¾Ð´ÑÑÑаиваÑÑÑÑ Ð¿Ð¾Ð´ ÑÑÑои open source-ÑообÑеÑÑва. ÐÑоме Ñого, бÑли Ð±Ñ ÑÑÑдноÑÑи Ñ Ñем, ÑÑо Java-ÑазÑабоÑÑиков в ЯндекÑе пÑимеÑно на поÑÑдок менÑÑе, Ñем C++-ÑазÑабоÑÑиков, а лÑди Ñ Ð¾Ð¿ÑÑом ÑазÑабоÑки ÑдÑа ÑÑÐ¸Ñ open source-пÑоекÑов â деÑиÑÐ¸Ñ Ð´Ð°Ð¶Ðµ в СШÐ. Рв ÑезÑлÑÑаÑе ÑовеÑÑенно не ÑакÑ, ÑÑо полÑÑилоÑÑ Ð±Ñ Ð»ÑÑÑе или бÑÑÑÑее. YQL Ñоздан Ñ Ð½ÑÐ»Ñ Ð³Ð´Ðµ-Ñо за год командой пÑимеÑно из 10 Ñеловек, болÑÑинÑÑво из коÑоÑÑÑ ÑÑаÑÑвовали не full time. - СконÑенÑÑиÑовавÑиÑÑ Ð¸ÑклÑÑиÑелÑно на SQL-диалекÑе, Ð¼Ñ Ð±Ñ Ð·Ð°ÐºÑÑли двеÑи пеÑед замеÑнÑм клаÑÑом лÑдей, коÑоÑÑм Ñдобнее опиÑÑваÑÑ Ð¼Ð°ÐºÑопÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ бизнеÑ-Ð»Ð¾Ð³Ð¸ÐºÑ Ð¾Ð´Ð½Ð¾ÑоднÑм обÑазом на одном ÑзÑке пÑогÑаммиÑованиÑ. РЯндекÑе Ñже ÑÑÑеÑÑвовала библиоÑека Ñакого клаÑÑа Ð´Ð»Ñ Python под названием Nile: Ð¼Ñ Ð²Ð¼ÐµÑÑо имевÑегоÑÑ Ð² ней runtime Ñеализовали (за ее пÑблиÑнÑм API) генеÑаÑÐ¸Ñ Ð¸ запÑÑк YQL-запÑоÑов на s-expressions. СейÑÐ°Ñ Ð¼Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð² пÑоÑеÑÑе доÑабоÑок Ð´Ð»Ñ Ð¿ÐµÑеклÑÑÐµÐ½Ð¸Ñ Ð½Ð° него по ÑмолÑаниÑ. ÐÑÑгие ÑзÑки пÑогÑаммиÑованиÑ, где Ñакой инÑеÑÑÐµÐ¹Ñ Ð±Ñл Ð±Ñ Ð²Ð¾ÑÑÑебован, в ЯндекÑе гоÑаздо менее ÑаÑпÑоÑÑÑаненÑ, но в бÑдÑÑем не иÑклÑÑено поÑвление аналогов и длÑ, напÑимеÑ, Java.
- Ðам бÑло Ð±Ñ Ð¾ÑÐµÐ½Ñ Ð¸Ð½ÑеÑеÑно вÑложиÑÑ YQL Ñ ÐºÐ°ÐºÐ¸Ð¼-нибÑÐ´Ñ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑвом бÑкендов в open source â ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð¿ÑобоваÑÑ ÑоÑÑавиÑÑ ÐºÐ¾Ð½ÐºÑÑенÑÐ¸Ñ ÑкоÑиÑÑемам Ð¾Ñ Apache Software Foundation: Hadoop и Spark. Ð ÑожалениÑ, в Ñамое ближайÑее вÑÐµÐ¼Ñ ÑÑого не ÑлÑÑиÑÑÑ Ð²Ð²Ð¸Ð´Ñ Ñазного Ñода ÑложноÑÑей: напÑимеÑ, оÑÑÑÑÑÑÐ²Ð¸Ñ Ð¸Ð½ÑÑÑÑменÑов Ð´Ð»Ñ ÑаÑÑиÑной пÑбликаÑии ÐÑкадии или многоÑиÑленнÑÑ Ð·Ð°Ð²Ñзок на внÑÑÑеннÑÑ Ð¸Ð½ÑÑаÑÑÑÑкÑÑÑÑ. Ðо Ð¼Ñ Ñже поÑÐ¸Ñ Ð¾Ð½ÑÐºÑ Ð½Ð°Ñали двигаÑÑÑÑ Ð² ÑÑом напÑавлении.
ÐапоÑледок â еÑе Ñаз пÑиглаÑаем на вÑÑÑеÑÑ Ð² наÑем оÑиÑе в ближайÑÑÑ ÑÑббоÑÑ, 15 окÑÑбÑÑ, где Ð¼Ñ Ð¿Ð¾Ð´Ñобнее ÑаÑÑкажем о ÑазнÑÑ Ð°ÑпекÑÐ°Ñ Ð¸Ð½ÑÑаÑÑÑÑкÑÑÑÑ Ð¯Ð½Ð´ÐµÐºÑа.
