MRでより少ないコヌドを蚘述する方法、たたはなぜ䞖界に別のク゚リ蚀語が必芁なのですか Yandexク゚リ蚀語の歎史

歎史的に、Yandexの倚くの郚分では、特定のプロゞェクトの詳现を考慮しお、倧量のデヌタを保存および凊理するシステムが開発されおきたした。 この開発では、効率、拡匵性、および信頌性が垞に優先事項でした。したがっお、原則ずしお、このようなシステムを䜿甚するための䟿利なむンタヌフェヌスのための時間はありたせんでした。 1幎半前、倧芏暡なむンフラストラクチャコンポヌネントの開発は、補品チヌムから別の方向に遞ばれたした。 目暙は次のずおりでしたより速く動き始め、同様のシステム間の重耇を枛らし、新しい内郚ナヌザヌのしきい倀を䞋げたす。







すぐに、ここで共通の高レベルク゚リ蚀語が圹立ち、既存のシステムぞの均䞀なアクセスを提䟛し、これらのシステムで採甚されおいる䜎レベルプリミティブの兞型的な抜象化を再実装する必芁もなくなるこずに気付きたした。 したがっお、デヌタストレヌゞおよび凊理システム甚の汎甚宣蚀型ク゚リ蚀語であるYandex Query LanguageYQLの開発が始たりたした。 これはYQLず呌ばれる䞖界で最初のものではないこずがわかっおいるずすぐに蚀いたすが、これが問題を劚げないこずを決定し、名前を残したした。



Yandexむンフラストラクチャに特化した䌚議を期埅しお、Habrahabrの読者にYQLに぀いお䌝えるこずにしたした。



建築



もちろん、HadoopやSparkなど、䞖界で人気のあるオヌプン゜ヌス゚コシステムの方向を芋るこずができたす。 しかし、圌らは真剣に考慮されたせんでした。 実際には、Yandexですでに普及しおいるデヌタりェアハりスずコンピュヌタヌシステムのサポヌトが必芁でした。 このため、YQLはあらゆるレベルで拡匵可胜に蚭蚈および実装されたした。 以䞋のすべおのレベルを順番に芋おいきたす。







図では、ナヌザヌク゚リは䞊から䞋に移動したすが、ストヌリヌがより぀ながりやすくなるように、圱響を受ける芁玠を䞋から䞊に逆の順序で説明したす。 開始するには、珟圚サポヌトされおいるバック゚ンドたたは私たちが呌んでいるデヌタプロバむダヌに関するいく぀かの蚀葉







コア



技術的には、YQLは比范的分離されたコンポヌネントずラむブラリで構成されおいたすが、䞻にサヌビスずしお内郚ナヌザヌに提䟛されたす。 これにより、圌らは「シングルりィンドりサヌビス」ずしおの芳点から芋お、各バック゚ンドのアクセスの発行やファむアりォヌルの蚭定などの組織の問題に察する人件費を最小限に抑えるこずができたす。 さらに、Yandexの埓来のMapReduceの䞡方の実装では、トランザクションの完了を同期的に埅機するクラむアントプロセスが必芁であり、YQLサヌビスがそれを凊理し、ナヌザヌが「埌で結果を求めお実行」モヌドで䜜業できるようにしたす。 ただし、サヌビスのモデルをラむブラリ圢匏の配垃ず比范するず、欠点もありたす。 たずえば、互換性のない倉曎やリリヌスにはさらに泚意を払う必芁がありたす。そうでない堎合は、最も䞍適切な瞬間にナヌザヌプロセスが䞭断される可胜性がありたす。



YQLサヌビスの䞻な゚ントリポむントはHTTP REST APIです。これはNettyの Javaアプリケヌションずしお実装され、蚈算のための着信芁求の起動を凊理するだけでなく、幅広い補助的な圹割も持ちたす。



Javaを䜿甚するず、必芁なすべおのシステムで既補の非同期クラむアントを䜿甚できるため、このすべおのビゞネスロゞックを迅速に実装するこずができたした。 あたりにも厳密な遅延芁件はただないので、ガベヌゞコレクションにはほずんど問題がなく、 G1に切り替えた埌、それらはほずんどなくなりたした。 䞊蚘に加えお、ノヌド間の同期のために、 ZooKeeperが䜿甚されたす。これには、通知を送信するずきのパブリッシャヌ-サブスクラむバヌパタヌンも含たれたす。



カスタム蚈算ク゚リの実行自䜓は、yqlworkerず呌ばれる別個のC ++プロセスによっお調敎されたす。 これらは、REST APIず同じマシン䞊でもリモヌトでも実行できたす。 実際には、Yandexで開発され広く䜿甚されおいるMessageBusプロトコルを䜿甚しお、ネットワヌク䞊で通信が行われおいたす。 yqlworkerのコピヌは、forkシステムコヌルexecなしを䜿甚しお、リク゚ストごずに䜜成されたす。 このようなスキヌムにより、 コピヌオンラむトメカニズムのおかげで、初期化に時間を無駄にせずに、異なるナヌザヌからのリク゚ストを十分に分離するこずができたす。



高床なアヌキテクチャの図からわかるように、Yandexク゚リ蚀語には2぀の衚珟がありたす。



遞択された構文に関係なく、ク゚リから、関数型プログラミングで䞀般的なプリミティブを䜿甚しお必芁なデヌタ凊理を論理的に蚘述する匏グラフが䜜成されたす。 このようなプリミティブには、λ関数、衚瀺MapおよびFlatMap、フィルタリングFilter、畳み蟌みFold、゜ヌトSort、アプリケヌションApplyなどが含たれたす。 SQL構文の堎合、 ANTLR v3に基づくレクサヌずパヌサヌが抜象構文ツリヌを構築し、それを䜿甚しお蚈算グラフを構築したす。 s-expression構文の堎合、文法は非垞に単玔であり、プログラムはいずれにせよこれらの抜象化で動䜜するため、パヌサヌはほずんど自明です。



さらに、必芁な結果を埗るために、芁求はいく぀かの段階を経お、必芁に応じお、すでに完了した状態に戻りたす。



リク゚ストのラむフサむクルのどの段階でも、s-expressions構文にシリアル化するこずができたす。これは、䜕が起こっおいるかを蚺断しお理解するのに非垞に䟿利です。



むンタヌフェヌス



はじめに述べたように、YQLの重芁な芁件の1぀は䜿いやすさでした。 したがっお、パブリックむンタヌフェむスには特別な泚意が払われおおり、非垞に積極的に開発されおいたす。



コン゜ヌルクラむアント








この図は、自動補完、構文の匷調衚瀺、色のテヌマ、通知、その他の装食を備えたむンタラクティブモヌドを瀺しおいたす。 ただし、コン゜ヌルクラむアントは、ファむルたたは暙準ストリヌムからI / Oモヌドで起動するこずもできたす。これにより、コン゜ヌルクラむアントを任意のスクリプトや通垞のプロセスに統合できたす。 操䜜の同期および非同期の䞡方の起動、ク゚リプランの衚瀺、ロヌカルファむルの添付、クラスタヌおよびその他の基本機胜のナビゲヌトがありたす。



このような豊富な機胜は、2぀の理由で登堎したした。 䞀方で、䞻にコン゜ヌルで䜜業するこずを奜むYandexの人々の顕著な局がありたす。 䞀方、これは、フル機胜のWebむンタヌフェむスの開発に時間をかけるために行われたした。これに぀いおは埌で説明したす。



興味深い技術的ニュアンスコン゜ヌルクラむアントはPythonで実装されたすが、Linux、OS X、およびWindows甚にコンパむルされる組み蟌みむンタヌプリタヌを䜿甚しお、䟝存関係のない静的にリンクされたネむティブアプリケヌションずしお配垃されたす。 さらに、最新のブラりザのような自動曎新も可胜です。 コヌドを構築しおリリヌスを準備するためのYandexの内郚むンフラストラクチャのおかげで、これらはすべお非垞に簡単に敎理できたした。



Pythonラむブラリ








PythonはYandexでC ++に次いで2番目に広く䜿甚されおいるプログラミング蚀語です。そのため、YQLクラむアントラむブラリが実装されおいたす。 実際、最初はコン゜ヌルクラむアントの䞀郚ずしお開発された埌、独立した補品ずしお分離されたため、同じコヌドを再発明するこずなく他のPython環境で䜿甚できるようになりたした。



たずえば、倚くのアナリストはJupyter環境での䜜業を奜むため、いわゆるyqlマゞックがこのクラむアントラむブラリに基づいお䜜成されおいたす。







コン゜ヌルクラむアントずずもに、事前に構成されたJupyterたたはIPythonを実行する2぀の特別なルヌチンが提䟛され、クラむアントラむブラリが既に利甚可胜です。 それらは䞊に瀺されおいたす。



Webむンタヌフェヌス








YQL蚀語、ク゚リ開発、および分析を孊習するための䞻芁なツヌルは、初心者向けに残したした。 Webむンタヌフェヌスでは、コン゜ヌルの技術的な制限がないため、すべおのYQL機胜はより芖芚的な圢匏で利甚でき、垞に手元にありたす。 むンタヌフェヌス機胜の䞀郚は、他の画面の䟋に瀺されおいたす。





...だけでなく


REST API自䜓のすべおのペンにはコヌドで泚釈が付けられ、Swaggerを䜿甚しおこれらの泚釈を䜿甚しお詳现なオンラむンドキュメントが自動的に生成されたす。 それから、コヌドを1行も䜿わずにリク゚ストを詊みるこずができたす。 これにより、䜕らかの理由で䞊蚘の既補のオプションが適合しなかった堎合でも、YQLを簡単に䜿甚できたす。 たずえば、Perlが奜きな堎合。



特城



Yandex Query Languageを䜿甚しお解決できるタスクプランの皮類ず、ナヌザヌに提䟛される機䌚に぀いおお話したす。 すでに長いポストを延長しないように、この郚分はむしろ論文です。



SQL






ナヌザヌ定矩関数


すべおのタむプのデヌタ倉換が宣蚀的に䟿利に衚珟されるわけではありたせん。 ルヌプを曞いたり、既補のラむブラリを䜿甚したほうが簡単な堎合がありたす。 このような状況に察しお、YQLはナヌザヌ関数のメカニズムを提䟛したす。これらはナヌザヌ定矩関数であり、UDFでもありたす。







集蚈関数


内郚では、集蚈関数は、 DISTINCT



サポヌトし、最䞊䜍ずGROUP BY



䞡方で実行される共通フレヌムワヌクを䜿甚しDISTINCT



SQL1999暙準のROLLUP/CUBE/GROUPING SETS



を含む。 そしお、これらの機胜はビゞネスロゞックのみが異なりたす。 以䞋に䟋を瀺したす。





パフォヌマンス䞊の理由から、集蚈関数のMapReduceの芳点から、Mapサむドコンバむナヌが自動的に䜜成され、Reduceの䞭間集蚈結果の集蚈が行われたす。 DISTINCT



は垞に近䌌蚈算なしで正確に機胜するようになったため、䞀意の倀をマヌクするには远加のReduceが必芁です。



テヌブルを結合する


キヌによるテヌブルのマヌゞは、問題を解決するためにしばしば必芁ずされる最も䞀般的な操䜜の1぀ですが、MapReduceの芳点から正しく実装されるのはほずんど科孊です。 論理的に、Yandexク゚リ蚀語では、すべおの暙準モヌドに加えお、いく぀かの远加モヌドが利甚できたす。







ナヌザヌから詳现を隠すために、MapReduceに基づくバック゚ンドの堎合、参加テヌブルの必芁な論理タむプず物理プロパティに応じお、JOIN実行戊略がオンザフラむで遞択されたすこれはいわゆるコストベヌスの最適化です。



戊略 簡単な説明 ブヌル型に利甚可胜
共通参加 1-2マップ+削枛 党郚
マップ偎の結合 1地図 内偎、巊、巊のみ、巊セミ、クロス
シャヌドマップ偎の結合 k䞊列マップデフォルトではk <= 4 内偎、巊セミ、ナニヌクな右、クロス
゜ヌトせずに削枛 1削枛したすが、事前に゜ヌトされた入力が必芁です 開発䞭




開発方向



Yandex Query Languageの䞭期および䞭期蚈画の䞭で









たずめるず







最埌に、10月15日の次の土曜日にオフィスでの䌚議に招埅したす。そこでは、Yandexむンフラストラクチャのさたざたな偎面に぀いお詳しく説明したす。










All Articles