Ищем путь к семантическому Web при помощи HBase

Используйте HBase и Bigtable для создания и обслуживания семантического Web

База данных Hadoop Database (HBase) хорошо подходит для создания семантического Web и для обработки существующих и расчетных данных. Узнайте, как выражать утверждения RDF/XML для базы данных HBase по научным статьям, а также как HBase и Bigtable предоставляют новый подход к хранению и обработке данных.

Габриель Матееску, ведущий разработчик, Институт биоинформатики Вирджинии при Политехническом институте Вирджинии

Габриель Матееску (Gabriel Mateescu) создает распределенные системы для приложений, работающих с большими объемами ресурсов и данных, - например, для биоинформатики и моделирования высокоэнергетических физических процессов. Он участвовал в нескольких проектах, в том числе в создании grid-сети Большого адронного коллайдера, распределенной европейской инфраструктуры суперкомпьютерных приложений (Distributed European Infrastructure for Supercomputing Applications, DEISA), GridCanada и проекте MIDAS Национального института здравоохранения США.



29.12.2010

Часто используемые сокращения

  • API: Application programming interface (Программный интерфейс приложений)
  • DOI: Digital Object Identifier (Цифровой идентификатор объекта)
  • HTTP: Hypertext Transfer Protocol (Протокол передачи гипертекста)
  • REST: Representational State Transfer (Передача состояния представления)
  • SQL: Structured Query Language (Структурированный язык запросов)
  • URI: Uniform Resource Identifier (Унифицированный идентификатор ресурса)
  • XML: Extensible Markup Language (Расширяемый язык разметки)

HBase представляет собой масштабируемую, распределенную, построенную на основе столбцов базу данных с динамической схемой для структурированных данных. Она обеспечивает надежное и эффективное управление большими объемами информации (несколько петабайт и более), распределенных среди тысяч серверов. HBase создана по образцу Google Bigtable и является дочерним проектом проекта Hadoop фонда Apache Software Foundation.

Примечание: на момент написания статьи текущей версией HBase являлась V0.19.3. Информация в статье относится к этой версии.

Модель данных HBase

Данные HBase представляют собой многомерный массив, значения которого (ячейки таблицы) обозначаются четырьмя ключами:

value = Map(TableName, RowKey, ColumnKey, Timestamp)

где:

  • TableName – строка.
  • RowKey (Ключ строки) и ColumnKey – двоичные значения (тип byte[])
  • Timestamp (Метка времени) – 64-разрядное число (тип long)
  • value (значение) – необрабатываемый массив байтов (тип byte[])

Двоичные данные для передачи по сети кодируются при помощи Base64.

Ключ строки является первичным ключом таблицы и обычно представляет собой строковые данные. Строки сортируются по ключам строки в лексикографическом порядке.

Информация, хранящаяся в таблице, структурирована в наборы столбцов, которые можно считать категориями. Каждое семейство столбцов может содержать произвольное количество элементов, обозначаемых метками (или квалификаторами). Ключ столбца column состоит из названия набора, двоеточия (:) и метки. Например, для элемента date и набора info ключ столбца имеет значение info:date.

Некоторые наборы столбцов определены в схеме таблицы HBase, но приложения могут на лету создавать новые элементы, добавляя строки в таблицу. В наборе столбцов разные строки таблицы могут иметь разное количество элементов. Другими словами, HBase поддерживает модель динамической схемы.

Пример таблицы HBase

В таблице 1 приведен простой пример таблицы HBase Persons с двумя наборами столбцов name и contact.

Таблица 1. Таблица Persons с двумя наборами столбцов
Ключ строкиМетка времениНабор столбцов
namecontact
000001t3contact:http research.google.com/people/jeff/
t2name:first Jeffrey
t1name:last Dean
000002t5name:first Gabriel
t4name:last Mateescu

Пустые ячейки не имеют значений, связанных с ключами этих ячеек. В таблице 1 ячейка, связанная с ключом (000002, contact:http, t4), пуста. HBase не хранит пустые ячейки: чтение пустых ячеек подобно извлечению из массива значения при помощи несуществующего ключа. Таким образом, таблицы HBase хорошо подходят для хранения незаполненных строк.

Для каждой строки одновременно можно получить доступ только к одному элементу группы столбцов (в отличие от реляционных баз данных, где при помощи одного запроса можно получить доступ к ячейкам строки из многих столбцов). Элементы группы столбцов отображаются в строке как подстроки.

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


RDF и семантический Web

Рассмотрим проблему представления информации о научных статьях. Статьи и их авторы представляют собой ресурсы. В Инфраструктуре описания ресурсов (Resource Description Framework, RDF) информация о ресурсах выражается утверждениями (см. раздел Ресурсы), где утверждение представляет собой следующий триплет:

(субъект, предикат, объект).

Предикаты определяют отношения между субъектом (ресурс, на который ссылается утверждение) и объектом. Например, состояние «Статья имеет заголовок Bigtable» можно выразить следующим образом:

(Статья, имеет заголовок, Bigtable).

Субъект утверждения – это ресурс, который должен определяться при помощи URI. Предикат должен быть определен в словаре, поэтому он связан с пространством имен URI в словаре. Объект утверждения может быть определен при помощи URI или литерала, если это субъект другого утверждения, он должен быть определен при помощи URI.

Знания о статьях представляются в виде утверждений, которые выражаются в формате RDF/XML.

RDF-описание журнальной статьи

Представьте себе статью в журнале о Bigtable:

F. Chang, J. Dean, S. Ghemawat, W. Hsieh, D. Wallach, M. Burrows, T. Chandra, A. Fikes, and R. Gruber, "Bigtable: A Distributed Storage System for Structured Data" («Bigtable: распределенная система хранения структурированных данных»), ACM Trans. Comput. Syst. 26 (2), June 2008.

Эту статью можно описать при помощи следующих предложений:

  • Журнальная статья о Bigtable имеет заголовок «Bigtable: распределенная система хранения структурированных данных».
  • Журнальная статья о Bigtable написана Fay Chang.

где:

  • Журнальная статья о Bigtable – это субъект обоих предложений.
  • Имеет заголовок – это предикат первого предложения.
  • «Bigtable: распределенная система хранения структурированных данных» - это объект первого предложения.
  • Написана – это предикат второго предложения.
  • Fay Chang – это объект второго предложения.

Для выражения этих предложений при помощи RDF/XML необходимо определить URI субъекта и названия предикатов в соответствующих пространствах имен. Для URI статьи используйте URI цифрового идентификатора объекта (Digital Object Identifier, DOI) статьи о Bigtable, http://doi.acm.org/10.1145/1365815.1365816, и измените первое предложение следующим образом:

Статья с URI "http://doi.acm.org/10.1145/1365815.1365816" имеет заголовок «Bigtable: распределенная система хранения структурированных данных».

Для задания предикатов используйте термины из справочников, приведенные в таблице 2.

Таблица 2. Идентификаторы URI
ПрефиксПространство имен URIОписание
rdfhttp://www.w3.org/1999/02/22-rdf-syntax-ns#Термины справочника RDF
dchttp://purl.org/dc/elements/1.1/Элементы Дублинского ядра
dctermshttp://purl.org/dc/terms/Термины Дублинского ядра
eprinthttp://purl.org/eprint/terms/Термины Eprints
foafhttp://xmlns.com/foaf/0.1/Термины справочника FOAF

На основе этих справочников можно сформулировать предложение о журнальной статье в формате RDF/XML, как показано в листинге 1.

Листинг 1. Описание статьи в формате RDF/XML
<rdf:RDF 

   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
   xmlns:dc="http://purl.org/dc/elements/1.1/" > 

   <rdf:Description rdf:about="http://doi.acm.org/10.1145/1365815.1365816"> 
       <dc:title>Bigtable: A Distributed Storage System for Structured Data</title> 
       <dc:creator 
            rdf:resource="http://purl.org/sweb/Authors/google/research/Fay_Chang"/> 

  </rdf:Description> 

</rdf:RDF>

Здесь объект для условия <dc:title> является литералом, а объект для <dc:creator> URI.

Полное описание данной статьи с информацией обо всех авторах, датой публикации и издательстве приведено в листинге 2, где условие <dc:type> определяет тип статьи.

Листинг 2. Полное описание статьи в формате RDF/XML
$ cat rdf/Bigtable.xml 
<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF 

  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:dc="http://purl.org/dc/elements/1.1/" 
  xmlns:dcterms="http://purl.org/dc/terms/" > 

  <rdf:Description rdf:about="http://doi.acm.org/10.1145/1365815.1365816"> 
    <dc:title>Bigtable: A Distributed Storage System for Structured Data</title>
    <dc:type>http://purl.org/eprint/type/JournalArticle</dc:type> 
    <dc:creator 
      rdf:resource="http://purl.org/sweb/Authors/google/research/Fay_Chang"/> 
    <dc:creator 
      rdf:resource="http://purl.org/sweb/Authors/google/research/Jeffrey_Dean"/> 
    <dc:creator 
      rdf:resource="http://purl.org/sweb/Authors/google/research/Sanjay_Ghemawat"/> 
    <dc:creator 
      rdf:resource="http://purl.org/sweb/Authors/google/research/Wilson_Hsieh"/> 
    <dc:creator 
      rdf:resource="http://purl.org/sweb/Authors/google/research/Deborah_Wallach"/> 
    <dc:creator 
      rdf:resource="http://purl.org/sweb/Authors/google/research/Mike_Burrows"/> 
    <dc:creator 
      rdf:resource="http://purl.org/sweb/Authors/google/research/Tushar_Chandra"/> 
    <dc:creator 
      rdf:resource="http://purl.org/sweb/Authors/google/research/Andrew_Fikes"/> 
    <dc:creator 
      rdf:resource="http://purl.org/sweb/Authors/google/research/Robert_Gruber"/> 
    <dc:publisher>ACM, New York, NY, USA</dc:publisher> 
    <dcterms:issued>2008-06</dcterms:issued> 
    <dc:subject>distributed databases</dc:subject> 
    <dcterms:isPartOf rdf:resource="urn:ISSN:0734-2071" /> 
    <dcterms:bibliographicCitation>
ACM Trans. Comput. Syst., 26 (2) 26 pages (2008)
    </dcterms:bibliographicCitation> 

  </rdf:Description> 

</rdf:RDF>

Для получения информации об авторах используется справочник Friend of a Friend (FOAF). В листинге 3 показано извлечение информации о субъекте Джеффри Дин (Jeffrey Dean).

Листинг 3. Информация об авторе в формате RDF/XML
$ cat rdf/Jeffrey.xml
<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF 

  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:dc="http://purl.org/dc/elements/1.1/" 
  xmlns:foaf="http://xmlns.com/foaf/0.1/" 
  xmlns:eprint="http://purl.org/eprint/terms/" > 

  <rdf:Description 
       rdf:about="http://purl.org/sweb/Authors/google/research/Jeffrey_Dean"> 
    <foaf:Person> 
       <foaf:givenname>Jeffrey</foaf:givenname> 
       <foaf:family_name>Dean</foaf:family_name> 
       <foaf:homepage rdf:resource="http://research.google.com/people/jeff/" /> 
    </foaf:Person> 
    <eprint:affiliatedInstitution>Google, Inc.</eprint:affiliatedInstitution> 

  </rdf:Description> 

</rdf:RDF>

Создание семантического web при помощи HBase

Первым шагом в создании семантического Web при помощи HBase является связывание RDF с таблицами HBase. Для хранения информации о статьях и авторах в формате RDF/XML необходимо создать две таблицы с названиями articles (статьи) и authors (авторы).

Ключи строк таблицы articles создаются на основе DOI статьи. Например, ключ строки для статьи о Bigtable имеет значение doi.org.acm_10.1145_1365815_1365816. Схема содержит три набора столбцов:

  • info для информации о заголовке, издательстве и дате публикации.
  • authors для идентификаторов URI авторов.
  • affiliations для информации о местах работы авторов.

Ключи строк таблицы authors формируются по URI авторов. Например, URI Джеффри Дина (см. листинг 3) преобразуется в следующий ключ google_research_Jeffrey_Dean. Схема содержит два набора столбцов:

  • info для хранения информации об авторах, такой как имя и адрес домашней страницы.
  • affiliations для информации о местах работы авторов.

Создание таблиц HBase

Одним из способов работы с HBase является REST API. Создание таблиц при помощи запросов HTTP показано в листинге 4.

Листинг 4. Создание таблиц articles и authors
$ cat tables/Articles.xml
<?xml version="1.0" encoding="UTF-8" ?>
<table>
  <name>Articles</name>
  <columnfamilies>
    <columnfamily>
       <name>info</name>
    </columnfamily>
    <columnfamily>
        <name>authors</name>
    </columnfamily>
    <columnfamily>
      <name>affiliations</name>
    </columnfamily>
  </columnfamilies>
</table>

$ cat tables/Authors.xml
<?xml version="1.0" encoding="UTF-8" ?>
<table>
  <name>Authors</name>
  <columnfamilies>
    <columnfamily>
       <name>info</name>
    </columnfamily>
    <columnfamily>
      <name>affiliations</name>
    </columnfamily>
  </columnfamilies>
</table>

$ cat tables/Articles.xml | curl  -X POST -T -  http://localhost:60010/api/
$ cat tables/Authors.xml | curl  -X POST -T -  http://localhost:60010/api/

Ввод данных в таблицы

Заполните таблицы authors и articles информацией, приведенной в разделе «Описание RDF журнальной статьи». В листинге 5 показано, как добавить информацию об авторе Джеффри Дине в таблицу authors (значения закодированы при помощи Base64).

Листинг 5. Заполнение таблицы authors
$ more rows/Jeffrey_Dean_info.xml 
<?xml version="1.0" encoding="UTF-8" ?>

<column>  
   <name>info:name</name>
   <value>SmVmZnJleSBEZWFuCg==</value>
</column>

$ more rows/Jeffrey_Dean_affiliation.xml 
<?xml version="1.0" encoding="UTF-8" ?>
<column>
   <name>affiliations:</name>
   <value>R29vZ2xlCg==</value>
</column>

$ cat rows/Jeffrey_Dean_info.xml |  \
    curl -X POST  -T - http://localhost:60010/api/Authors/row/google_research_Jeffrey_Dean

$ cat rows/Jeffrey_Dean_affiliation.xml |  \
    curl -X POST -T - http://localhost:60010/api/Authors/row/google_research_Jeffrey_Dean

Для каждого ввода информации необходимо выполнить запрос POST; метки времени можно пропустить, поскольку HBase присваивает их по умолчанию. В листинге 6 показано, как внести информацию о статье, посвященной Bigtable, в таблицу articles.

Листинг 6. Заполнение таблицы articles
$ more rows/Bigtable_info.xml 
<?xml version="1.0" encoding="UTF-8" ?>
<column>
  <name>info:title</name>
  <value>QmlndGFibGU6IEEgRGlzdHJpYnV0ZWQgU3RvcmFnZSBTeXN0ZW0gZm9yIFN0cnVjdHVyZWQgRGF0
YQo==
  </value>
</column>

$ more rows/Bigtable_author_2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<column>
  <name>authors:2</name>
  <value>SmVmZnJleSBEZWFuCg==</value>
</column>

$ cat rows/Bigtable_info.xml  |  curl -X POST \
      -T - http://localhost:60010/api/Articles/row/doi.org.acm_10.1145_1365815_136581
$ cat rows/Bigtable_author_2.xml  | curl -X POST \
      -T - http://localhost:60010/api/Articles/row/doi.org.acm_10.1145_1365815_136581

Работа с таблицами

Загрузите код

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

После заполнения таблиц authors и articles можно выполнять пакетные операции с данными. Здесь мы будем искать места работы авторов статьи о Bigtable. Пакетная обработка соберет эту информацию в наборе столбцов affiliations таблицы articles путем просмотра таблиц и извлечения информации из того набора столбцов в таблице authors. Для статьи о Bigtable действие этой пакетной обработки будет соответствовать коду, приведенному в листинге 7, где в качестве места работы всех авторов статьи указывается Google.

Листинг 7. Добавление обработанной информации в таблицу articles
$ more rows/Bigtable_affiliations.xml 
<?xml version="1.0" encoding="UTF-8" ?>
<column>
  <name>affiliations:</name>
  <value>R29vZ2xlCg==</value>
</column>

$ cat rows/Bigtable_affiliations.xml  |  curl -X POST \
      -T - http://localhost:60010/api/Articles/row/doi.org.acm_10.1145_1365815_136581

Чтобы получить информацию об авторах статьи о Bigtable, выполните запрос GET к столбцу affiliations строки статьи о Bigtable.

Листинг 8. Извлечение информации из таблицы articles
$ curl -X GET  http://localhost:60010/api/Articles/row/\
doi.org.acm_10.1145_1365815_136581?column=affiliations:
<?xml version="1.0" encoding="UTF-8" ?>
<row>
  <count>
1
  </count>
  <column>
  <name>
YWZmaWxpYXRpb25zOg==
  </name>
  <value>
R29vZ2xlCg==
  </value>
  <timestamp>
1250049020108
  </timestamp>
 </column>

Декодировав значения из Base64, мы получим affiliations: для YWZmaWxpYXRpb25zOg== и Google для R29vZ2xlCg==.


Простой пример

HBase можно использовать и для более сложных задач, чем обсуждались выше. Например, можно обрабатывать подсказки «Опасность!» вроде следующей: «Автор этой журнальной статьи работал во Всемирной организации здравоохранения» и реагировать на них. Для этого создайте таблицу под названием Keywords (Ключевые слова), ключи строк которой являются ключевыми словами журнальных статей. Эта таблица содержит набор столбцов journal_articles, используемый для хранения идентификаторов DOI статей, содержащих эти ключевые слова.

После сохранения ключевых слов для статьи о Bigtable таблица keywords будет содержать строку с ключом строки Bigtable, ключом столбца journal_articles:1 и значением ячейки doi.acm.org_10.1145_1365815_1365816. Для ответа на вопрос выполняются следующие действия:

  1. В таблице Keywords ищем ключевое слово Bigtable и получаем DOI статьи.
  2. В таблице articles ищем статью с DOI, полученным на первом этапе, и получаем идентификаторы URI авторов.
  3. В таблице authors ищем авторов по URI и извлекаем информацию по нынешним и прошлым местам работы.
  4. Из результатов, полученных на третьем этапе, выбираем строку, набор столбцов affiliations которой содержит элемент Всемирная организация здравоохранения.

Ответом будет: «Кто такой Джеффри Дин?»


Заключение

HBase и Bigtable предлагают новый способ последовательной обработки данных. На смену SQL- подобным процессам извлечения и преобразования данных в монолитных системах приходит подход «разделяй и властвуй», в котором базы данных поддерживают операции создания, чтения, изменения, удаления (CRUD), а сложные преобразования передаются внешним компонентам, рассчитанным на параллельные вычисления. Параллельные вычисления можно выполнять, например, при помощи приложений MapReduce, а высокая пропускная способность достигается при помощи распределенной и реплицируемой файловой системы, такой как Hadoop Distributed File System (HDFS) или Google File System.

В отсутствие соединений таблицами в HBase для хранения связанной информации в одной таблице часто используется денормализация. Именно такой подход показан в этой статье.

Хотя HBase все еще нуждается в оптимизации производительности, она имеет все возможности для того, чтобы стать одним из ведущих решений.


Загрузка

ОписаниеИмяРазмер
Пример XMLos-hbase-source_hbase.zip11Kб

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=605383
ArticleTitle=Ищем путь к семантическому Web при помощи HBase
publish-date=12292010