SciDB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 17:46, 9 ноября 2017.
SciDB
fraimed
Разработчики: Paradigm4
Тип ПО: постреляционная СУБД
Лицензия: AGPL v3
Веб-сайт paradigm4.com

SciDB — это свободно распространяемая постреляционная система управления базами данных (СУБД), разработанная компанией Paradigm4 под руководством Майкла Стоунбрейкера и предназначенная для хранения, обработки и анализа больших объёмов многомерных распределенных массивов научных данных (англ. big data).[Источник 1]

Возможности SciDB сосредоточены вокруг сложной аналитики, для которой стандартная реляционная модель оказывается неэффективной — хранилище оптимизировано для единовременной записи мало структурированных данных и их последующего интенсивного чтения. Вместо добавления отдельных строк, применяется подход загрузки сразу больших порций данных. Хранение данных организовано в виде многомерных вложенных массивов, для обработки которых вместо SQL задействованы языки AQL (Array Query Language) и AFL (Array Functional Language).[Источник 2]

Важной особенностью SciDB является наличие поддержки версионного контроля данных и учета всех операций над ними, что позволяет отследить все манипуляции, выполняемые над данными, и при необходимости в точности повторить аналитический запрос (над тем же набором данных в состоянии на момент прошлого запроса) или выполнить его в измененном виде (откорректировать алгоритм). Подобный подход, в сочетании с гибкими средствами обмена данными (экспорт не только данных, но и истории операций над ними), позволяет сторонним исследователям на своих локальных системах повторять эксперименты других групп. Аналитические дополнения к SciDB можно разрабатывать на языках, подобных C++ и Python. Присутствуют готовые модули для интеграции с такими вычислительными пакетами, как R, Matlab и IDL, позволяя использовать уже существующие алгоритмы обработки данных.

История разработки[Источник 3]

История SciDB начинается с 2007 года, когда на симпозиуме по экстремально большим базам данных (XLDB) представителями науки и промышленности был сделан вывод, что существующие СУБД не в состоянии манипулировать объемами данных, которые появятся в ближайшем будущем. Одним из примеров поставщиков таких данных является строящийся телескоп LSST (Large Synoptic Survey Telescope).[1] Был также сделан вывод о необходимости разработки СУБД нового поколения, которая должна удовлетворять, в частности, следующим требованиям:[2]

  • модель данных основывается на многомерных массивах, а не на кортежах;
  • модель хранения базируется на версионности, а не на обновлении значений;
  • масштабируемость до сотен петабайт и высокая отказоустойчивость;
  • СУБД является свободно распространяемым программным обеспечением.

Некоторое время спустя, в 2008 году, был запущен международный проект под руководством Майкла Стоунбрейкера и его коллег из крупнейших университетов США, целью которого являлось создание в кратчайшие сроки новой системы управления базами данных, получившей название SciDB, для нужд больших научных и промышленных проектов, в которых требуется анализ сверхбольших объемов данных (сотни и тысячи петабайт), масштабируемой на тысячи серверов.

Примечательно, что инициатором проекта SciDB выступил Майкл Стоунбрейкер, создатель СУБД Ingres, VoltDB и PostgreSQL, а в разработку были вовлечены российские научные учреждения, такие как НИИСИ РАН и ГАИШ МГУ (сотрудники данных организаций давно участвуют в разработке СУБД PostgreSQL).

Для разработки SciDB были сформированы международные команды исследователей и разработчиков под руководством крупнейших авторитетов в области баз данных (Майкл Стоунбрейкер, Дэвид Девитт, Дэвид Майер и другие). И уже в 2009 году был разработан прототип системы, который был представлен на крупнейших международных конференциях SIGMOD 2009 (Провиденс, США) , VLDB 2009 (Лион, Франция).[3] На основе прототипа в третьем квартале 2010 года была выпущена первая публичная версия SciDB для ознакомления научной общественностью.

SciDB разрабатывается в тесном сотрудничестве с ведущими научными проектами — потенциальными заказчиками системы. В научный совет SciDB входят ученые от различных направлений науки, включая: астрономию, нанотехнологии, генетику, сейсмологию, ядерную физику, метеорологию и др. При этом, два проекта, LSST (Large Synaptic Survey Telescope) и Российский Космический Эксперимент «Лира» (КЭ Лира) (многоцветный фотометрический обзор всего неба до 16-17 звездной величины),[4] предоставили детальные требования для использования SciDB в своих системах и часть исходных данных. Таким образом, система SciDB разрабатывается прямо под требования заказчиков и проходит апробирование на реальных задачах уже в процессе разработки.

Архитектура[Источник 4]

Архитектура SciDB

SciDB использует архитектуру независимых узлов (англ. shared-nothing architecture). Она подразумевает, что узлы не имеют общей памяти или дискового пространства и в системе отсутствует единый центр, что, в свою очередь, ведёт к очень простой и естественной масштабируемости.

SciDB развертывается на кластере серверов, каждый из которых имеет свое локальное хранилище, память и возможность обработки данных. Все серверы взаимодействуют между собой с помощью Ethernet и TCP/IP. Каждый физический сервер содержит экземпляр SciDB, который отвечает за местное хранение и обработку данных. Несмотря на то что все экземпляры в кластере SciDB участвуют в выполнении запросов и хранении данных, один из серверов выступает в роли координатора и организует выполнение запросов и выборку результатов.

Масштабируемая архитектура SciDB идеально подходит для параллельной обработки и анализа данных в распределенных средах — гридах и облаках.

Модель данных[Источник 4]

SciDB использует многомерные массивы в качестве основных единиц хранения и обработки данных. Основные параметры массива — измерения (англ. dimensions) и атрибуты (англ. attributes).

Измерения

n-мерный SciDB-массив имеет n измерений, каждое из которых имеет размерность — количество упорядоченных значений в этом измерении. Например, двумерный массив может иметь измерения i и j, каждое со значениями (1, 2, 3, ..., 10) и (1, 2, ..., 30) соответственно.

Измерения, по своей сути, выполняют роль индексов. Это позволяет разделить всю информацию на «куски» фиксированного размера. Такой подход сильно снижает накладные расходы на создание и поддержание индексов: СУБД может обращаться к данным напрямую по их координатам в массиве. Кроме того, данные можно естественным образом разделять по различным кластерам.

Атрибуты

Каждая комбинация значений измерений (то же, что и многомерный индекс в массиве) определяет ячейку данных или элемент массива, который содержит набор атрибутов — данных различных типов, поддерживаемых в SciDB.

Таким образом, каждый объект — это набор атрибутов, хранящийся в определённой ячейке (определяемой комбинацией значений измерений) в определённом массиве.

Создав базу данных SciDB и определив массивы, необходимо подготовить и загрузить данные в базу данных. Затем загружаемые данные доступны для доступа и обработки с использованием встроенных возможностей анализа данных SciDB.

Обработка данных[Источник 4]

SciDB поддерживает два языка для работы с массивами данных: AQL (Array Query Language) и AFL (Array Functional Language).

AQL является SQL-подобным декларативным языком, включающим как DDL-запросы (Data Definition Language, команды для определения массивов и загрузки данных), так и операции DML-запросы (Data Manipulation Language, команды для доступа и работы с данными массива). В целом он похож на язык SQL для реляционных баз данных, но использует модель данных на основе массивов и более комплексный набор аналитических запросов по сравнению со стандартными реляционными базами данных.

AFL представляет собой функциональный язык манипулирования массивами, операции которого можно объединять в композиции. Допускается использование операций AFL в запросах AQL.

Достоинства SciDB

Среди основных достоинств СУБД SciDB можно выделить следующие:[Источник 5]

  • быстрая навигация по большому объёму данных за счёт использования индексов на основе массивов;
  • масштабируемость СУБД: она может использоваться на любых устройствах, от планшетного компьютера до кластера из тысяч серверов для хранения десятков петабайт данных;
  • полноценная поддержка полного цикла работы с научными данными: в базе данных хранятся сырые данные, которые обрабатываются самой СУБД перед выдачей;
  • наличие декларативного языка запросов AQL, а также возможности интеграции с популярными вычислительными пакетами;
  • серьезное повышение быстродействия за счет отказа от модели ACID: поскольку научные данные являются неизменными, отсутствует необходимость поддержки транзаций (данные только вносятся, но не изменяются). Вместо модели ACID используется модель BASE;
  • высокая сжимаемость данных за счет вертикального (поатрибутного) хранения массивов;
  • сохранность данных обеспечивается репликацией на различных (независимых) узлах системы;
  • расширяемость типов данных и запросов;
  • открытый исходных код.

Сравнение SciDB с другими решениями

Реляционные БД

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

Многомерные массивы, которые предлагает SciDB, справляются с этой задачей гораздо лучше. Такая организация позволяет гораздо эффективнее производить анализ данных, что также входит в функции SciDB.

NoSQL

SciDB имеет в себе одно из основных преимуществ подхода NoSQL — за счёт хранения данных в виде массивов, здесь отсутствует жёсткая модель физических данных, каждый набор несёт в себе свои собственные атрибуты. В то же время SciDB не исключает структурирование данных внутри массивов, а также включает декларативный SQL-подобный язык запросов, что решает серьёзную проблему подхода NoSQL — невозможность проведения гибкого и сложного анализа данных.

ПО обработки данных

В отличие от прочих решений, SciDB предоставляет быстрый и удобный инструмент для обработки «сырых» данных. В то время как обычные системы обработки данных подразумевают предварительное их извлечение из базы данных, форматирование и преобразование к виду входных данных, SciDB не требует этих действий, обработка происходит в самой СУБД с помощью пользовательских процедур. Таким образом, данные, хранящиеся в базе данных, сразу готовы к обработке, что значительно ускоряет весь процесс.

Установка SciDB 16.9 на Ubuntu 14.04

Исходный код SciDB 16.9 Community Edition можно скачать c официального Google Drive Paradigm4.

Предустановочные операции

Перед началом установки необходимо разрешить учетную запись суперпользователя в Ubuntu, для этого нужно просто установить ей пароль:

$ sudo passwd

После этого нужно установить дополнительное программное обеспечение: Expect (инструмент для автоматизации и тестирования интерактивных приложений) и SSH пакеты:

$ sudo apt-get -y install expect openssh-server openssh-client

Затем необходимо изменить значение параметра PermitRootLogin в файле конфигурации /etc/ssh/sshd_config — поменять значение without-password на значение yes. Это нужно для того, чтобы разрешить суперпользователю регистрацию в системе с использованием SSH. Для этого можно воспользоваться текстовым редактором nano:

$ sudo nano /etc/ssh/sshd_config

Установка

Все дальнейшие шаги установки продемонстрированы на видео ниже. За подробной информацией обращайтесь к официальному руководству по установке.

Пример использования

Пример 1

Создадим массив distance с атрибутом miles:

AFL% CREATE ARRAY distance <miles:double>[i=0:9];

Добавим значения от 0 до 900 для атрибута miles:

AFL% store(build(distance,i*100.0),distance);

Выполним выражение 1,6*miles и запишем результат в новый атрибут kilometers:

AFL% apply(distance,kilometers,1.61*miles);
{i} miles,kilometers
{0} 0,0
{1} 100,161
{2} 200,322
{3} 300,483
{4} 400,644
{5} 500,805
{6} 600,966
{7} 700,1127
{8} 800,1288
{9} 900,1449

Пример 2

Создадим матрицу A и запишем в нее значения:

AFL% store(build(<val:double>[row=0:2; col=0:3],row*4+col+1),A);
# Получим матрицу следующего вида:
# [
# [(1),(2),(3),(4)],
# [(5),(6),(7),(8)],
# [(9),(10),(11),(12)]
# ] 

Вычислим кумулятивные суммы по всем элементам первого измерения:

AFL% cumulate(A,sum(val),row);
# Получим матрицу следующего вида:
# [
# [(1),(2),(3),(4)],
# [(6),(8),(10),(12)],
# [(15),(18),(21),(24)]
# ] 

Вычислим кумулятивные произведения по всем элементам первого измерения:

AFL% cumulate(A,prod(val),row);
# Получим матрицу следующего вида:
# [
# [(1),(2),(3),(4)],
# [(5),(12),(21),(32)],
# [(45),(120),(231),(384)]
# ]

Вычислим кумулятивные средние значения по всем элементам второго измерения:

AFL% cumulate(A,avg(val),col); 
# Получим матрицу следующего вида:
# [
# [(1),(1.5),(2),(2.5)],
# [(5),(5.5),(6),(6.5)],
# [(9),(9.5),(10),(10.5)]
# ]  

Вычислим кумулятивные средние, минимальные и максимальные значения по всем элементам первого измерения:

AFL% cumulate(A,avg(val),min(val),max(val),row);
# Получим матрицу следующего вида:
# [
# [(1,1,1),(2,2,2),(3,3,3),(4,4,4)],
# [(3,1,5),(4,2,6),(5,3,7),(6,4,8)],
# [(5,1,9),(6,2,10),(7,3,11),(8,4,12)]
# ] 

Пример 3

Рассмотрим пример соединения двух массивов разной размерности.

Создадим массив left_array размерности 3×3, который сдержит единицы в каждой ячейке:

AFL% CREATE ARRAY left_array <val:double>[i=0:2; j=0:2];
AFL% store(build(left_array,1),left_array);

Создадим массив right_array размерности 3×6, который сдержит нули в каждой ячейке:

AFL% CREATE ARRAY right_array <val:double>[i=0:2; j=0:5];
AFL% store(build(right_array,0),right_array);

Соединим left_array и right_array:

AFL% store(join(left_array,right_array),result_array);
{i,j} val,val_2
{0,0} 1,0
{0,1} 1,0
{0,2} 1,0
{1,0} 1,0
{1,1} 1,0
{1,2} 1,0
{2,0} 1,0
{2,1} 1,0
{2,2} 1,0

В итоге получили массив со следующими параметрами:

AFL% show(result_array);
{i} schema
{0} 'result_array<val:double,val_2:double> [i=0:2:0:1000; j=0:2:0:1000]'

Пример 4

Создадим файл winners в формате csv со следующим содержимым:

1996,0,Bailey,Canada,9.84
1996,1,Thugwane,USA,7956
1996,2,Keter,Kenya,487.12
2000,0,Greene,USA,9.87
2000,1,Abera,Ethiopia,7811
2000,2,Kosgei,Kenya,503.17
2004,0,Gatlin,USA,9.85
2004,1,Baldini,Italy,7855
2004,2,Kemboi,Kenya,485.81
2008,0,Bolt,Jamaica,9.69
2008,1,Wanjiru,Kenya,7596
2008,2,Kipruto,Kenya,490.34

Создадим массив flatwinners и загрузим в него данные из файла winners.csv:

AFL% CREATE ARRAY flatwinners <year:int64, event_id:int64, person:string, country:string, time:double>[i=0:99];
Query was executed successfully
AFL% load(flatwinners, 'tmp/winners.csv', -2 , 'csv');
{i} year,event_id,person,country,time
{0} 1996,0,'Bailey','Canada',9.84
{1} 1996,1,'Thugwane','USA',7956
{2} 1996,2,'Keter','Kenya',487.12
{3} 2000,0,'Greene','USA',9.87
{4} 2000,1,'Abera','Ethiopia',7811
{5} 2000,2,'Kosgei','Kenya',503.17
{6} 2004,0,'Gatlin','USA',9.85
{7} 2004,1,'Baldini','Italy',7855
{8} 2004,2,'Kemboi','Kenya',485.81
{9} 2008,0,'Bolt','Jamaica',9.69
{10} 2008,1,'Wanjiru','Kenya',7596
{11} 2008,2,'Kipruto','Kenya',490.34

Изменим размерность массива flatwinners и сохраним результат в новом массиве — champions

AFL% store(redimension(flatwinners,<person:string,country:string,time:double>[year=1900:*;event_id=0:*]),champions);
{year,event_id} person,country,time
{1996,0} 'Bailey','Canada',9.84
{1996,1} 'Thugwane','USA',7956
{1996,2} 'Keter','Kenya',487.12
{2000,0} 'Greene','USA',9.87
{2000,1} 'Abera','Ethiopia',7811
{2000,2} 'Kosgei','Kenya',503.17
{2004,0} 'Gatlin','USA',9.85
{2004,1} 'Baldini','Italy',7855
{2004,2} 'Kemboi','Kenya',485.81
{2008,0} 'Bolt','Jamaica',9.69
{2008,1} 'Wanjiru','Kenya',7596
{2008,2} 'Kipruto','Kenya',490.34

Отсортируем массив champions по атрибуту country:

AFL% sort(champions,country);
{n} person,country,time
{0} 'Bailey','Canada',9.84
{1} 'Abera','Ethiopia',7811
{2} 'Baldini','Italy',7855
{3} 'Bolt','Jamaica',9.69
{4} 'Keter','Kenya',487.12
{5} 'Kosgei','Kenya',503.17
{6} 'Kemboi','Kenya',485.81
{7} 'Wanjiru','Kenya',7596
{8} 'Kipruto','Kenya',490.34
{9} 'Thugwane','USA',7956
{10} 'Greene','USA',9.87
{11} 'Gatlin','USA',9.85

Отсортируем массив champions по атрибуту country (по убыванию), а затем по атрибуту person (по возрастанию):

AFL% sort(champions,country desc, person asc);
{n} person,country,time
{0} 'Gatlin','USA',9.85
{1} 'Greene','USA',9.87
{2} 'Thugwane','USA',7956
{3} 'Kemboi','Kenya',485.81
{4} 'Keter','Kenya',487.12
{5} 'Kipruto','Kenya',490.34
{6} 'Kosgei','Kenya',503.17
{7} 'Wanjiru','Kenya',7596
{8} 'Bolt','Jamaica',9.69
{9} 'Baldini','Italy',7855
{10} 'Abera','Ethiopia',7811
{11} 'Bailey','Canada',9.84

Примечания

Источники

  1. SciDB // Википедия. [2017—2017]. Дата обновления: 23.09.2017. URL: https://en.wikipedia.org/w/index.php?title=SciDB&oldid=801963468 (дата обращения: 21.10.2017).
  2. Представлен первый стабильный релиз СУБД SciDB // OpenNews. [2011—2011]. Дата обновления: 24.06.2011. URL: http://www.opennet.ru/opennews/art.shtml?num=30983 (дата обращения: 21.10.2017).
  3. Унификация модели данных, основанной на многомерных массивах, при интеграции неоднородных информационных ресурсов. С. А. Ступников, ИПИ РАН, Москва // CEUR Workshop Proceedings. [2012—2012]. Дата обновления: 29.10.2012. URL: http://ceur-ws.org/Vol-934/paper7.pdf (дата обращения: 19.10.2017).
  4. 4,0 4,1 4,2 SciDB User's Guide // Paradigm4. [2013—2013]. Дата обновления: 09.07.2013. URL: http://paradigm4.com/HTMLmanual/13.3/scidb_ug/index.html (дата обращения: 23.10.2017).
  5. Система управления сверхбольшими базами научных данных для космического эксперимента «Лира» // Zen: SciDB. [2009—2009]. Дата обновления: 10.12.2009. URL: http://www.sai.msu.su/~megera/wiki/SciDB (дата обращения: 26.10.2017).