Уни­вер­саль­ная плат­фор­ма для ра­бо­ты в опе­ра­тив­ной па­мя­ти

По ме­ре циф­ро­ви­за­ции раз­лич­ных сфер жиз­ни об­ще­ства рас­тут и объ­е­мы дан­ных, ко­то­рые тре­бу­ет­ся об­ра­ба­ты­вать в ре­аль­ном вре­ме­ни. Ско­ро та­кая об­ра­бот­ка ста­нет не пре­иму­ще­ством, а необ­хо­ди­мым усло­ви­ем су­ще­ство­ва­ния лю­бо­го биз­не­са, а зна­чит, долж­ны по­явить­ся со

Otkrytye sistemy. SUBD. - - СОДЕРЖАНИЕ - Ни­ки­та Ива­нов

По ме­ре циф­ро­ви­за­ции раз­лич­ных сфер жиз­ни об­ще­ства рас­тут и объ­е­мы дан­ных, ко­то­рые тре­бу­ет­ся об­ра­ба­ты­вать в ре­аль­ном вре­ме­ни. Ско­ро та­кая об­ра­бот­ка ста­нет не пре­иму­ще­ством, а необ­хо­ди­мым усло­ви­ем су­ще­ство­ва­ния лю­бо­го биз­не­са, а зна­чит, долж­ны по­явить­ся со­от­вет­ству­ю­щие ин­стру­мен­ты.

Клю­че­вые сло­ва: об­ра­бот­ка в па­мя­ти, ана­ли­ти­ка ре­аль­но­го вре­ме­ни Keywords: Grid, Gridgain, real-time analytics, in-memory computing

Ана­лиз боль­ших дан­ных по­мо­га­ет оп­ти­ми­зи­ро­вать про­из­вод­ство, ло­ги­сти­ку и биз­нес-пла­ни­ро­ва­ние, по­ка­зы­вать ад­рес­ную ре­кла­му, ав­то­ма­ти­че­ски кор­рек­ти­ро­вать це­ны и пред­ска­зы­вать спрос в ре­тей­ле, рас­по­зна­вать мо­шен­ни­че­ские тран­зак­ции и мно­гое дру­гое. Од­на­ко осо­бую цен­ность та­кой ана­лиз при­об­ре­та­ет, ко­гда его ре­зуль­та­ты при­ме­ня­ют­ся «на ле­ту», по­это­му се­год­ня все боль­ше ор­га­ни­за­ций на­чи­на­ют ис­поль­зо­вать рас­пре­де­лен­ные, мас­со­во-па­рал­лель­ные ар­хи­тек­ту­ры, спо­соб­ные ра­бо­тать с боль­ши­ми дан­ны­ми в ре­жи­ме, близ­ком к ре­аль­но­му вре­ме­ни. Од­на из мас­шта­би­ру­е­мых платформ под­держ­ки ана­ли­ти­ки ре­аль­но­го вре­ме­ни — Apache Ignite, ис­ход­ный код ко­то­рой был со­здан ком­па­ни­ей Gridgain Systems, а в 2014 го­ду пе­ре­дан в Apache Software Foundation.

Как вид­но из ри­сун­ка, плат­фор­ма Apache Ignite под­держ­ки вы­чис­ле­ний в опе­ра­тив­ной па­мя­ти (in-memory computing) пред­став­ля­ет со­бой рас­пре­де­лен­ное свя­зу­ю­щее ПО на ба­зе вир­ту­аль­ных ма­шин Java — слой меж­ду при­ло­же­ни­я­ми и дан­ны­ми, за­гру­жа­е­мы­ми из дис­ко­вых хра­ни­лищ в па­мять. Обыч­но для ре­ше­ния та­ких раз­ных за­дач, как об­ра­бот­ка тран­зак­ций и ана­ли­ти­ка, при­хо­дит­ся раз­вер­ты­вать и под­дер­жи­вать две раз­ные си­сте­мы, то­гда как в Ignite вы­со­ко­ско­рост­ные тран­зак­ции, ана­ли­ти­ка и ги­брид­ные тран­зак­ци­он­но-ана­ли­ти­че­ские вы­чис­ле­ния мо­гут вы­пол­нять­ся од­но­вре­мен­но. Воз­мож­на так­же на­строй­ка ги­брид­ных вы­чис­ле­ний, ко­гда «го­ря­чие» дан­ные хра­нят­ся в опе­ра­тив­ной па­мя­ти, а ар­хив­ные — в дис­ко­вых хра­ни­ли­щах.

Apache Ignite мо­жет ра­бо­тать ло­каль­но, в об­ла­ке или в ги­брид­ной сре­де. Еди­ный API поз­во­ля­ет ин­те­гри­ро­вать об­лач­ные при­ло­же­ния и хра­ни­ли­ща со струк­ту­ри­ро­ван­ны­ми, к ваз и струк­ту­ри­ро­ван­ны­ми и неструк­ту­ри­ро­ван­ны­ми дан­ным и—все это воз­мож­но

бла­го­да­ря под­держ­ке SQL, .Net, C++, Java, Groovy, Scala, PHP и Node.js. Плат­фор­ма име­ет ин­тер­фей­сы с СУБД MYSQL, Oracle, DB2, Postgresql, MS SQL Server и дру­ги­ми ре­ля­ци­он­ны­ми ба­за­ми, ге­не­ри­руя мо­дель до­ме­на при­ло­же­ния, ос­но­ван­ную на опре­де­ле­нии схе­мы ба­зы дан­ных с по­сле­ду­ю­щей за­груз­кой дан­ных. Кро­ме под­держ­ки ин­тер­фей­са ANSI SQL-99, Ignite ра­бо­та­ет с хра­ни­ли­ща­ми «ключ-зна­че­ние» и Mapreduce, обес­пе­чи­вая под­держ­ку по­то­ко­вой и мас­со­во-па­рал­лель­ной об­ра­бот­ки дан­ных, ви­лоч­но­го па­рал­ле­лиз­ма (че­ре­до­ва­ние по­сле­до­ва­тель­но и па­рал­лель­но ис­пол­ня­е­мых участ­ков ко­да) и об­ра­бот­ку слож­ных со­бы­тий, кла­сте­ри­за­цию и уско­ре­ние Hadoop. Та­ким об­ра­зом, не тре­бу­ет­ся за­ме­на су­ще­ству­ю­щих баз дан­ных — дан­ные мож­но пе­ре­но­сить в опе­ра­тив­ную па­мять из раз­лич­ных ис­точ­ни­ков, что важ­но для ком­па­ний, ра­бо­та­ю­щих с боль­ши­ми мас­си­ва­ми дан­ных, но него­то­вых к ра­ди­каль­ной пе­ре­строй­ке сво­ей Ит-ин­фра­струк­ту­ры.

В ос­но­ве ар­хи­тек­ту­ры плат­фор­мы ле­жит го­мо­ген­ная кла­стер­ная то­по­ло­гия: все уз­лы в кла­сте­ре рав­ны и мо­гут вы­пол­нять лю­бую ло­ги­че­скую роль в за­ви­си­мо­сти от тре­бо­ва­ний при­ло­же­ния. Кла­стер мож­но раз­вер­нуть на сер­ве­рах стан­дарт­ной ар­хи­тек­ту­ры, и по ме­ре уве­ли­че­ния на­груз­ки его мож­но мас­шта­би­ро­вать, до­бав­ляя но­вые уз­лы.

Клю­че­вую роль в Apache Ignite иг­ра­ет струк­ту­ра ин­тер­фей­са про­вай­де­ра сер­ви­сов (service provider interface, SPI), поз­во­ля­ю­щая под­клю­чать и на­стра­и­вать внут­рен­ние ком­по­нен­ты Ignite для адап­та­ции к кон­крет­ной сер­вер­ной ин­фра­струк­ту­ре. В Ignite име­ет­ся 15 раз­лич­ных под­си­стем, каж­дую из ко­то­рых мож­но за­ме­нить, а SPI поз­во­ля­ет осу­ще­ствить эту за­ме­ну — мож­но взять один ком­по­нент, на­стро­ить его под свои за­да­чи, а все осталь­ные под­си­сте­мы ав­то­ма­ти­че­ски про­дол­жат ра­бо­ту с ним. На­при­мер, по умол­ча­нию Apache Ignite ис­поль­зу­ет стан­дарт­ное се­те­вое вза­и­мо­дей­ствие по TCP/IP, но ес­ли

тре­бу­ет­ся до­ба­вить до­пол­ни­тель­ное шиф­ро­ва­ние, то мож­но пе­ре­пи­сать один ком­по­нент (network SPI) и вста­вить его в Ignite.

Apache Ignite вклю­ча­ет в се­бя си­сте­му In-memory data grid (IMDG), от­ве­ча­ю­щую за управ­ле­ние рас­пре­де­лен­ны­ми дан­ны­ми в па­мя­ти, в том чис­ле за cо­блю­де­ние тре­бо­ва­ний ACID, под­держ­ку SQL, ава­рий­ное пе­ре­клю­че­ние и вы­рав­ни­ва­ние на­груз­ки. По су­ти, IMDG в Apache Ignite — это рас­пре­де­лен­ное в опе­ра­тив­ной па­мя­ти объ­ект­но­ори­ен­ти­ро­ван­ное хра­ни­ли­ще ти­па «клю­чзна­че­ние» с под­держ­кой Acid-тран­зак­ций.

Вы­чис­ле­ния и обес­пе­че­ние на­деж­но­сти в Ignite так­же по­стро­е­ны по прин­ци­пам гри­дов. Си­сте­ма In-memory compute grid поз­во­ля­ет па­рал­лель­но вы­пол­нять в па­мя­ти за­да­чи, кри­тич­ные к кон­крет­ным ре­сур­сам (про­цес­сор, па­мять, ввод-вы­вод), под­дер­жи­вая так­же стан­дарт­ные асин­хрон­ные вы­чис­ле­ния Java Executorservice. Кон­троль над сер­ви­са­ми, раз­вер­ну­ты­ми на кла­сте­ре с га­ран­ти­ей их по­сто­ян­ной до­ступ­но­сти в слу­чае от­ка­за уз­ла, обес­пе­чи­ва­ет сер­вис­ная грид-си­сте­ма (In-memory service grid), под­дер­жи­ва­ю­щая ав­то­ма­ти­че­ское раз­вер­ты­ва­ние од­но­го или мно­же­ства эк­зем­пля­ров сер­ви­са.

Для при­ло­же­ний, тре­бу­ю­щих ин­тер­ак­тив­ной ра­бо­ты с боль­ши­ми объ­е­ма­ми дан­ных (Facebook, Telegram, Whatsapp, мо­биль­ные кор­по­ра­тив­ные при­ло­же­ния), тра­ди­ци­он­ные ме­то­ды вы­чис­ле­ний и хра­не­ние на дис­ках не под­хо­дят — они ра­бо­та­ют недо­пу­сти­мо мед­лен­но. Ес­ли бы в Facebook фо­то­гра­фии хра­ни­лись в дис­ко­вых хра­ни­ли­щах, то каж­дая из них за­гру­жа­лась бы де­сят­ки ми­нут, по­это­му во всех по­доб­ных при­ло­же­ни­ях при­ме­ня­ют­ся по­то­ко­вые вы­чис­ле­ния в па­мя­ти (In-memory streaming). Та­кие вы­чис­ле­ния поз­во­ля­ют вы­пол­нять ана­ли­ти­че­ские за­про­сы над кон­крет­ны­ми «ок­на­ми» вхо­дя­щих дан­ных, на­при­мер: ка­кие пять про­дук­то­вых по­зи­ций бы­ли наи­бо­лее вос­тре­бо­ва­ны в тор­го­вом за­ле за по­след­ние два ча­са или ка­ко­ва

сред­няя це­на то­ва­ров опре­де­лен­ной ка­те­го­рии за по­след­ние три дня? Дру­гой ва­ри­ант при­ме­не­ния по­то­ко­вых вы­чис­ле­ний — кон­вей­ер­ная об­ра­бот­ка рас­пре­де­лен­ных со­бы­тий, све­де­ния о ко­то­рых по­сту­па­ют в си­сте­му с боль­шой ско­ро­стью. Обыч­но при этом про­из­во­дит­ся раз­би­е­ние по­то­ка на несколь­ко ча­стей, каж­дая из ко­то­рых на­прав­ля­ет­ся для об­ра­бот­ки на свой узел кла­сте­ра.

Apache Ignite вклю­ча­ет соб­ствен­ную рас­пре­де­лен­ную биб­лио­те­ку для ма­шин­но­го обу­че­ния — ML Grid, поз­во­ля­ю­щую про­во­дить обу­че­ние поль­зо­ва­тель­ской мо­де­ли на дан­ных, предо­став­ля­е­мых IMDG. В биб­лио­те­ке име­ют­ся ал­го­рит­мы рас­пре­де­лен­ной об­ра­бот­ки дан­ных для ана­ли­за дан­ных, по­сту­па­ю­щих в ре­аль­ном вре­ме­ни. В вер­сии Ignite 2.0 бу­дут до­бав­ле­ны пред­мет­но-ори­ен­ти­ро­ван­ные язы­ки для ра­бо­ты с Python, R и Scala, кол­лек­ция ал­го­рит­мов ма­шин­но­го обу­че­ния (Linear and Logistic Regression, Decision Tree/random Forest, SVM, Naive Bayes) и ин­те­гра­ция с Tensorflow.

Мно­гие ком­па­нии ис­поль­зу­ют се­год­ня Apache Hadoop для хра­не­ния и об­ра­бот­ки боль­ших мас­си­вов раз­но­об­раз­ных дан­ных, од­на­ко Hadoop ра­бо­та­ет слиш­ком мед­лен­но, то­гда как Apache Ignite поз­во­ля­ет уско­рить об­ра­бот­ку, при­чем в уже су­ще­ству­ю­щих сре­дах. Та­кое уско­ре­ние ста­ло воз­мож­ным бла­го­да­ря спе­ци­аль­ной двух­ре­жим­ной рас­пре­де­лен­ной фай­ло­вой си­сте­ме в опе­ра­тив­ной па­мя­ти Ignite File System (IGFS), пол­но­стью сов­ме­сти­мой с HDFS и Mapreduce. Функ­ци­о­нал IGFS ана­ло­ги­чен HDFS и поз­во­ля­ет со­зда­вать пол­но­функ­ци­о­наль­ную фай­ло­вую си­сте­му, но ра­бо­та­ю­щую в опе­ра­тив­ной па­мя­ти, а так­же де­ле­ги­ро­вать вы­пол­не­ние дру­гим фай­ло­вым си­сте­мам. Дан­ные из каж­до­го фай­ла раз­би­ва­ют­ся на от­дель­ные бло­ки и хра­нят­ся в кэ­ше, до­ступ к ко­то­ро­му осу­ществ­ля­ет­ся че­рез стан­дарт­ный Java Streaming API.

Для кла­сте­ри­за­ции в Apache Ignite ис­поль­зу­ет­ся тех­но­ло­гия Java Virtual Machine: уз­лы ав­то­ма­ти­че­ски на­хо­дят друг дру­га, что поз­во­ля­ет мас­шта­би­ро­вать кла­стер без пе­ре­за­груз­ки. Об­мен дан­ны­ми внут­ри кла­сте­ра осу­ществ­ля­ет­ся по мо­де­ли «из­да­тель-под­пис­чик» или на­пря­мую — по мо­де­ли «точ­ка-точ­ка». Ignite под­дер­жи­ва­ет несколь­ко про­то­ко­лов для свя­зи кли­ент­ских уз­лов с кла­сте­ра­ми Ignite: Ignite Native Clients, SSL/ TLS, REST/HTTP и Memcached.sql.

Для управ­ле­ния со­бы­ти­я­ми в рас­пре­де­лен­ной сре­де в Ignite раз­ра­бот­чи­ки мо­гут по­лу­чать уве­дом­ле­ния о за­вер­ше­нии вы­пол­не­ния уда­лен­ных за­дач или о лю­бых дру­гих из­ме­не­ни­ях в кэ­ши­ро­ван­ных дан­ных внут­ри кла­сте­ра. Для по­вы­ше­ния про­из­во­ди­тель­но­сти кэ­ша и умень­ше­ния за­держ­ки воз­мож­на груп­по­вая пе­ри­о­ди­че­ская от­сыл­ка уве­дом­ле­ний. Ignite поз­во­ля­ет в рас­пре­де­лен­ном

ре­жи­ме ис­поль­зо­вать боль­шин­ство струк­тур дан­ных из па­ке­та мно­го­по­точ­но­сти java.util.concurrent. На­при­мер, мож­но до­ба­вить эле­мент в оче­редь с дву­сто­рон­ним до­сту­пом (java.util.concurrent.blockingdeque) на од­ном уз­ле и из­влечь его с дру­го­го уз­ла.

Плат­фор­ма Apache Ignite ин­те­гри­ро­ва­на с Apache Spark — уни­вер­саль­ным движ­ком для круп­но­мас­штаб­ной об­ра­бот­ки дан­ных. Ра­нее обе си­сте­мы до­пол­ня­ли друг дру­га, од­на­ко по­след­ние в ер си­иIgnite обес­пе­чи­ва­ют необ­хо­ди­мую про­из­во­ди­тель­ность и без Spark. При этом ес­ли Spark за­гру­жа­ет дан­ные для об­ра­бот­ки из внеш­не­го (обыч­но дис­ко­во­го) хра­ни­ли­ща и не хра­нит их по­сле за­вер­ше­ния об­ра­бот­ки, то Ignite предо­став­ля­ет рас­пре­де­лен­ное in-memory-хра­ни­ли­ще ти­па «ключ-зна­че­ние» с под­держ­кой Acidтран­зак­ций и Sql-за­про­сов. Дан­ные со­хра­ня­ют­ся в па­мя­ти и мо­гут быть за­пи­са­ны в ни­же­ле­жа­щую ба­зу дан­ных. В слу­чае Spark при­ло­же­нию не предо­став­ля­ет­ся об­щая па­мять — дан­ные из HDFS или дру­го­го дис­ко­во­го хра­ни­ли­ща необ­хо­ди­мо сна­ча­ла за­гру­зить, при­чем со­сто­я­ние дан­ных мож­но пе­ре­да­вать меж­ду раз­лич­ны­ми за­да­ча­ми Spark толь­ко пу­тем со­хра­не­ния об­ра­бо­тан­ных дан­ных во внеш­нем хра­ни­ли­ще, а Ignite мо­жет пе­ре­да­вать со­сто­я­ние на­пря­мую в па­мя­ти.

Spark ра­бо­та­ет с нет ран зак­ци­он­ны ми дан­ны­ми, до­ступ­ны­ми толь­ко для чте­ния, по­это­му эта си­сте­ма ис­поль­зу­ет­ся для опе­ра­тив­ной ана­ли­ти­че­ской об­ра­бот­ки (OLAP), при­чем не под­дер­жи­ва­ет­ся из­ме­не­ние на ме­сте устой­чи­вых рас­пре­де­лен­ных на­бо­ров дан­ных (Resilient Distributed Dataset, RDD), то­гда как в Ignite обес­пе­чи­ва­ет­ся под­держ­ка как OLAP, так и Acid-сов­ме­сти­мых тран­зак­ций OLTP.

Apache Spark опе­ри­ру­ет RDD и име­ет де­ло толь­ко с на­груз­кой, свя­зан­ной с об­ра­бот­кой дан­ных, а Ignite, кро­ме это­го, под­дер­жи­ва­ет и чи­сто вы­чис­ли­тель­ные на­груз­ки. Вы­пол­не­ние Sql-за­про­сов в Spark да­же на неболь­ших мас­си­вах дан­ных мо­жет тре­бо­вать мно­го вре­ме­ни: Spark под­дер­жи­ва­ет бо­га­тый син­так­сис

SQL, но без ин­дек­са­ции, по­это­му тре­бу­ет­ся по­сто­ян­но вы­пол­нять пол­ное ска­ни­ро­ва­ние. Ignite под­дер­жи­ва­ет Sql-ин­дек­сы, и за­про­сы вы­пол­ня­ют­ся го­раз­до быст­рее.

Apache Ignite под­дер­жи­ва­ет ин­те­гра­цию с Apache Cassandra — ре­ше­ни­ем для струк­ту­ри­ро­ван­ных за­про­сов, ко­то­рое мо­жет быть по­лез­но для Olap-при­ло­же­ний, но в нем нет под­держ­ки ACID, по­это­му для OLTP оно не ис­поль­зу­ет­ся. Кро­ме то­го, Cassandra не под­дер­жи­ва­ет Sql-опе­ра­ции объ­еди­не­ния, аг­ре­га­ции, груп­пи­ров­ки или ис­поль­зо­ва­ние ин­дек­сов, что ис­клю­ча­ет вы­пол­не­ние про­из­воль­ных, нере­гла­мен­ти­ро­ван­ных за­про­сов. Обе си­сте­мы до­пол­ня­ют друг дру­га — поль­зо­ва­те­ли Cassandra с по­мо­щью Ignite по­лу­ча­ют бо­лее ши­ро­кие воз­мож­но­сти при ра­бо­те в па­мя­ти: умень­ше­ние на несколь­ко по­ряд­ков вре­ме­ни вы­пол­не­ния за­про­сов, ис­поль­зо­ва­ние ANSI SQL для вы­пол­не­ния нере­гла­мен­ти­ро­ван­ных и струк­ту­ри­ро­ван­ных за­про­сов дан­ных в па­мя­ти.

Се­год­ня по­ка еще нет тех­но­ло­гий, спо­соб­ных обес­пе­чить бо­лее вы­со­кую ско­рость и мас­шта­би­ру­е­мость, чем об­ра­бот­ка и хра­не­ние в па­мя­ти [1]. Плат­фор­ма Ignite поз­во­ля­ет ре­шать та­кие за­да­чи, не тре­буя за­ме­ны уже име­ю­щих­ся в ком­па­ни­ях СУБД, — в со­че­та­нии с тра­ди­ци­он­ны­ми или рас­пре­де­лен­ны­ми хра­ни­ли­ща­ми Ignite предо­став­ля­ет сред­ства ана­ли­ти­ки ре­аль­но­го вре­ме­ни, об­ра­бот­ки тран­зак­ций, а так­же ин­стру­мен­ты для вы­пол­не­ния за­дач ги­брид­ной тран­зак­ци­он­но­ана­ли­ти­че­ской об­ра­бот­ки (HTAP).

ЛИ­ТЕ­РА­ТУ­РА

1.

На­та­лья Ду­бо­ва. Все де­ло в па­мя­ти // От­кры­тые си­сте­мы.субд. — 2017. — № 1. — С. 40–42. URL: https://www.osp.ru/os/2017/01/ 13051365/ (да­та об­ра­ще­ния: 21.05.2018).

Ни­ки­та Ива­нов (nivanov@gridgain.com) — ос­но­ва­тель и тех­ни­че­ский ди­рек­тор, ком­па­ния Gridgain.

Apache Ignite — свя­зу­ю­щее ПО

Newspapers in Russian

Newspapers from Russia

© PressReader. All rights reserved.