23 апреля 2012 в 09:57

Введение в JBoss Teiid из песочницы

SQL*
imageВот уже второй год как мы используем в нашем продукте JBoss Teiid. Накоплен опыт, сделаны и учтены многие ошибки. Сожалений в сделаном выборе нет. Появилось желание поделиться собранной информацией, надеюсь кому-то пригодится.

В двух словах JBoss Teiid – федеративная база данных [2]. Ну или так – это объединяющая реляционная надстройка над многочисленными источниками данных. С точки зрения пользователя такая база выглядит как единая схема, в которой таблицы, представления, и процедуры являются объектами внешних данных. Можно еще сказать что внешние данные транслируются в единую виртуальную базу.


Основы


Вот так примерно выглядит JBoss Teiid [1] изнутри (согласно официальной документации [3]):

image

Простой пример: берем честную реляционную базу типа Oracle, mySQL или H2 (одну или можно все три сразу). Объединяем со своим любимым вебсервисом, добавляем немного данных в CSV текстовых файлах, солим и доводим до кипения разворачиваем получившуюся конфигурацию в Teiid под JBoss. Присоединяемся SQL клиентом. Самое интересное, что теперь мы можем строить SQL запросы, которые будут исполняться с объединенными ресурсами.
Вполне понятно, что некоторые источники данных могут иметь определенные свойства, например не поддерживать транзакции или изменения (данные — только для чтения). Встроенный оптимизатор Teiid берет на себя разборки с поддерживаемыми свойствами каждого такого источника, используя абстракцию с загадочным именем «транслятор». В настоящее время из коробки поддерживаются трансляторы для:
  • JDBC (Oracle, MS SQL Server, IBM DB2, MySQL, Postgres, Derby, Sybase, H2, HSQL, Netezza, Teradata, Modeshape. Практически все что может быть доступно через JDBC, например Excel через jdbc-odbc или Hive Hadoop. Есть также поддержка для ODBC. Понимает Hibernate насколько это возможно (не поддерживается динамическое создание DDL для генерации таблиц);
  • Файлы на файловой системе (CSV, XML);
  • Вебсервисы;
  • Доступ к директориям через LDAP;
  • SalesForce, OLAP;


Клиентское соединение с Teiid осуществляется через JDBC (спецификация 4.0 реализована почти полностью). Нужно помнить что клиентское приложение должно использовать Java 1.6 JDK и выше, предыдущие версии Java не поддерживаются.
Немного о собственно создании виртуальной базы данных (файла VDB). Есть два пути: можно создать базу с помощью специального приложения-дизайнера (построен на основе Eclipse), или полностью динамически. Второй вариант больше отвечал нашим задачам, поэтому использовали его.
Далее — немного подробностей о практической работе с JBoss Teiid.


Подробности


1. Установка Teiid
В настоящий момент Teiid имеет две активных версии: 8.0 (в разработке, предназначена для работы с JBoss 7) и 7.7 (мы ее используем вместе с JBoss AS 5.1.0, в планах переход на восьмерку этим летом).
Установка заключается в скачивании архива Teiid с последней версией и разворачивании поверх установленного JBoss контейнера. Для работы Teiid 7.7 нужен “default” профиль JBoss 5.1.0. Мы слегка этот профиль оптимизировали (в основном исключили неиспользуемые сервисы), но этот шаг не обязателен.


2. Клиентское приложение и Виртуальная База Данных
В комплект Teiid входит несколько примеров, которые неплохо иллюстрируют особенности работы:
  • “dynamicvdb-portfolio” — пример объединяет текстовые файлы с данными и базу данных HSQL;
  • “dynamicvdb-ws-weather” – дает понять как обернуть вызов вебсервиса в SQL;
  • “simpleclient” – простое клиентское java приложение, соединяется с работающим Teiid и исполняет заданный SQL. Более практичным для этих целей кажется использование специализированных клиентов (SQuirreL или Eclipse Database Developer);



3. Особенности использования Teiid в нашем проекте
Так вышло, что по условиям было нужно объединить совершенно разноплановые вещи – реляционные базы (IBM DB2 и H2), множество мелких файлов (CSV), а также legacy источники данных, разработанные задолго до появления JDBC и языка Java (z/OS если кому-то интересно). Требуемого удалось добиться с помощью написания собственных трансляторов к таким источникам. Задача оказалась тривиальной, самодельный транслятор – не более чам пара новых java классов, расширяющих существующие классы предоставляемые Teiid.
Задача усложнялась требованием динамически определять наличие и отсутствие различных источников данных и перестраивать Виртуальную Базу без перезагрузки сервера. Пришлось забросить Дизайнер и строить vdb файл используя Teiid Admin API при начальном старте приложения. Если “картина мира” работающего приложения становится другой, какие-то источники данных изменяются – программно создается новая версия VDB и на лету разворачивается взамен старой.
Много шагов было сделано для оптимизации использования памяти и загрузки процессора. Teiid имеет гибко настраиваемый кеш, который нам здорово помог. Query Optimizer тоже очень полезная вещь – подробный план выполнения печатается в логах и дает понять какие части запроса выполняются неэффективно.


Послесловие


Данная статья задумывалась как вводная. При наличии интереса отдельные моменты можно развернуть глубже, ну или добавить больше подробностей из опыта работы.
К примеру, Teiid 8 под JBoss 7 обещает быть довольно шустрым и минимально прожорливым. К сожалению он пока еще местами сыроват, но дорабатывается ударными темпами. К слову – могу сказать что профессионализм команды поддерживающей Teiid вызывает только приятные эмоции. Во многих случаях найденные проблемы исправлялись на следующий день после открытия тикета в Jira. Вопросы на форуме отвечаются в течении нескольких часов. Проект open source, поддерживается JBoss, ребята явно стараются, мы довольны сотрудничеством.


[1] JBoss: The Teiid Project
[2] Wikipedia: Federated Database System
[3] Tao of Teiid: Technical Introduction to Teiid

+8
2211
26
picass0 1,5

Комментарии (4)

+1
aleks_raiden, #
Очень нехватает, как по мне, поддержки популярных NoSQL решений из коробки — Redis, Cassandra, Voldemort. было бы интересно попробовать обьеденить их
+2
picass0, #
Да, это интересная мысль — иметь возможность обращаться к NoSQL используя SQL. В принципе особых сложностей я не вижу, как минимум для базовой функциональности получания данных можно написать транслятор который будет преобразовывать SQL в команды для Redis. Дьявол — в деталях.

Я сейчас пробую подружить Graph Database (OrientDB) с Teiid, это видимо достойно отдельной статьи.
0
kuzemchik, #
Небыло ли проблем с left join, если были то как решали?
+1
picass0, #
Нет, признаюсь — на моей памяти не было (если я не ошибся что имелось в виду под проблемой с left join). Были конечно мелкие дефекты в ранних версиях, но быстро исправлялись.
В чем основная «вкусность» Teiid — он берет на себя решение проблем типа join или union (которые как правило вылазят чаше всего при интеграции данных из источников разного типа). Teiid Query Engine работает прозрачно для пользователя и анализирует запрос на предмет наличия индексов, оптимального join. В процессе работы оригинальный SQL «переписывается» и уже затем исполняется. Это может создать некоторые неудобства при отладке. Но людей которые хоть раз в жизни имели дело с Hibernate подобными вещами трудно испугать.

Только зарегистрированные пользователи могут оставлять комментарии.
Войдите, пожалуйста.