Apache Gora

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 00:43, 21 января 2019.
Apache Gora
Логотип
Разработчики: Apache Software Foundation
Выпущена: 0.1 / 06 Апреля, 2011
Постоянный выпуск: 0.8 / 20 Сентября, 2017 [Источник 1]
Предыдущий выпуск: 0.7 / 23 Марта, 2017
Состояние разработки: Активное
Написана на: Java
Операционная система: Mac OSX 10.9.3, Linux Mint, Ubuntu
Локализация: Английский
Тип ПО: Фреймворк с открытым исходным кодом
Лицензия: Apache License 2.0
Веб-сайт gora.apache.org

Apache Gora - это открытая программная платформа, обеспечивающая модель для БД и СУБД в оперативной памяти, цель которой заключается в предоставлении пользователям удобной среды для эффективной работы с большими данными таких хранилищ, как: Apache Accumulo, Apache Cassandra, Amazon DynamoDB, Apache HBase, MongoDB. Она позволяет проводить анализ данных с широкой поддержкой Apache Hadoop и MapReduce, а также сохранять большие объемы данных в РСУБД и в различные типы хранилищ, такие как: хранилища столбцов, документов, ключевых значений. Для доступа к данным, Apache Gora использует простой в применении Java API.

Описание

Общая задача Apache Gora сосредотачивается на быстрой обработке больших данных. Данная программная платформа с открытым кодом ориентируется на:

  • Сохранение больших данных в хранилища столбцов (Apache HBase, Apache Cassandra, Hypertable);
  • Сохранение больших данных в хранилища документов (Apache CouchDB, MongoDB);
  • Сохранение больших данных в хранилища ключевых значений (Voldermort, Redis, Amazon DynamoDB, Apache Accumulo);
  • Сохранение больших данных в РСУБД (MySQL, HSQLDB (Hyper SQL Database));
  • Сохранение больших данных в распределенную файловую систему Hadoop Distributed Filesystem (HDFS), которая является моделью программирования MapReduce. HDFS разбивает файлы на большие блоки и перераспределяет их по узлам в кластере;
  • Доступ к большим данным при помощи Java API, независимо от их месторасположения;
  • Индексирование: сохранение объектов в индексы полнофункциональной библиотеки текстового поиска Apache Lucene, которая используется в поисковой системе Apache Solr. Доступ к данным / запрос данных осуществляется при помощи API Gora;
  • Анализ: механизмы Apache Gora, использующие Apache Pig и Apache Hive, позволяют быстро обрабатывать и проводить анализ наборов больших данных, т.к. эти две платформы (Apache Pig, Apache Hive) предоставляют язык более высокого уровня для использования библиотеки MapReduce от Hadoop;
  • Поддержка концепции MapReduce: Apache Gora имеет встроенную и всестороннюю поддержку MapReduce, которая позволяет выполнять параллельную обработку больших объёмов информации в хранилищах данных.

Apache Gora замечательным образом подходит для:

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

Внимание! Для конфигурации Apache Gora потребуется знание синтаксиса JSON и XML. Также Вы должны иметь возможность использовать терминал командной строки и запускать Apache Maven из командной строки. [Источник 2]

Отличия

Apache Gora отличается от существующих решений тем, что:

  • Она специализируется главным образом на хранилища данных NoSQL, хотя также имеет ограниченную поддержку баз данных SQL;
  • Основным вариантом использования Apache Gora является доступ к большим данным и их анализ при помощи Apache Hadoop - программной платформы, представляющей собой с одной стороны - набор утилит, библиотек для разработки и выполнения надежных, масштабируемых и распределенных вычислений и программ, работающих на кластерах из сотен и тысяч узлов, а с другой стороны - хранилище файлов общего назначения, способное вместить петабайты данных;
  • Игнорирует сложные SQL - сопоставлений, что делает её простой в использовании;
  • Будет всегда поддерживать сохранность, индексирование и постоянное анализирование данных, используя такие продукты, как Apache Pig, Apache Lucene и Apache Hive.

Модули Apache Gora

Исходный код Apache Gora организован в модульной архитектуре (представлен небольшими независимыми блоками - модулями). Модуль gora-core является основным модулем, который содержит ядро кода. Все остальные модули зависят от модуля gora-core. Каждое хранилище данных находится в собственном модуле. Документацию для конкретного модуля можно найти в каталоге документации.

На текущий момент, в Apache Gora реализованы следующие модули:

  • gora-compiler;
  • gora-compiler-cli;
  • gora-core;
  • gora-accumulo;
  • camel-gora;
  • gora-cassandra;
  • gora-dynamodb;
  • gora-hbase;
  • gora-jcache;
  • gora-couchdb;
  • gora-metamodel;
  • gora-mongodb;
  • gora-solr;
  • gora-aerospike;
  • gora-tutorial;
  • gora-sources-dist;

Руководство по созданию Apache Gora

В данном руководстве будет затронута реализация системы для хранения журналов веб-сервера в Apache HBase.

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

Компиляция и установка проекта

После загрузки исходного кода для Apache Gora, для установки понадобится использование терминала:

$ cd gora 
$ mvn clean install

Способы управления Apache Gora

Если Ваш проект уже использует Apache Ivy, то вы можете включить зависимости Apache Gora в Ваш проект, добавив следующие строки в Ваш ivy.XML-файл:

1 <dependency org="org.apache.gora" name="gora-core" rev="${version}" conf="*->compile" changing="true">
2 <dependency org="org.apache.gora" name="gora-dynamodb" rev="${version}" conf="*->compile" changing="true">
3 <dependency org="org.apache.gora" name="gora-hbase" rev="${version}" conf="*->compile" changing="true">      
4 ...etc

Примечание: переменную $ {version} следует заменить наиболее стабильной версией Apache Gora.

Добавляйте только те модули, которые Вы будете использовать. Настройте conf, чтобы указать те конфигурации Вашего проекта, которые вы хотите сделать зависимыми от Gora. Потом, добавьте следующие строчки в ivysettings.XML, они позволят создать Apache Gora локально, а не искать её в других репозиториях:

 1 <resolvers>
 2   ...
 3 <chain name="internal">
 4 <resolver ref="local">
 5 </chain>
 6   ...
 7 </resolvers>
 8 <modules>
 9   ...
10 <module organisation="org.apache.gora" name=".*" resolver="internal">
11   ...
12 </modules>
  • Используя Apache Maven:

Если Ваш проект использует Apache Maven, то вы можете включить зависимости Apache Gora в Ваш проект, добавив следующие строки в Ваш pom.xml файл:

 1 <dependency>
 2     <groupId>org.apache.gora</groupId>
 3     <artifactId>gora-core</artifactId>
 4     <version>${version}</version>
 5  </dependency>
 6 
 7 <dependency>
 8     <groupId>org.apache.gora</groupId>
 9     <artifactId>gora-accumulo</artifactId>
10     <version>${version}</version>
11 </dependency>
12 ...etc

Примечание: переменную $ {version} следует заменить наиболее стабильной версией Apache Gora.

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

  • Добавление зависимостей Gora SNAPSHOT:

Если Вы хотите включить зависимости Gora SNAPSHOT, например, чтобы получить доступ к последним исправлениям ошибок, Вы должны добавить следующие строчки в свой pom.XML:

 1 <repository>
 2   <id>apache-repo-snapshots</id>
 3   <url>https://repository.apache.org/content/repositories/snapshots/</url>
 4   <releases>
 5     <enabled>false</enabled>
 6   </releases>
 7   <snapshots>
 8     <enabled>true</enabled>
 9   </snapshots>
10 </repository>

Начало

После того, как исходный код был загружен и скомпилирован, давайте посмотрим на файлы в каталоге gora-tutorial:

$ cd gora-tutorial
$ tree
|-- conf
|   |-- gora-hbase-mapping.xml
|   |-- gora-sql-mapping.xml
|   `-- gora.properties
|
|-- pom.xml
| 
`-- src
    |-- examples
    |   `-- java
    |-- main
    |   |-- avro
    |   |   |-- metricdatum.json
    |   |   `-- pageview.json
    |   |-- java
    |   |   `-- org
    |   |       `-- apache
    |   |           `-- gora
    |   |               `-- tutorial
    |   |                   `-- log
    |   |                       |-- KeyValueWritable.java
    |   |                       |-- LogAnalytics.java
    |   |                       |-- LogAnalyticsSpark.java
    |   |                       |-- LogManager.java
    |   |                       |-- TextLong.java
    |   |                       `-- generated
    |   |                           |-- MetricDatum.java
    |   |                           `-- Pageview.java
    |   `-- resources
    |       `-- access.log.tar.gz
    `-- test
        |-- conf
        `-- java

Примечание: поскольку gora-tutorial является модулем верхнего уровня Gora, то он зависит от структуры каталогов, установленной файлами сценария главной сборки Apache Gora (pom.xml для Maven).

Исходный код Java расположен в директории:
src/main/java/
Исходный код avro schemas находится в:
src/main/avro/
Исходный код данных расположен в:
src/main/resources/

Настройка HBase

В нашем случае мы будем использовать Apache HBase для хранения журналов. Для тех, кто не знаком с HBase, это хранилище столбцов NoSQL с архитектурой, очень похожей на архитектуру BigTable от Google. Если у Вас еще не настроена HBase, то Вы можете перейти к подробным шагам настройки в обзорной документации HBase. После распаковки файла, выполните cd в директорию HBase-${dist} и запустите сервер HBase, используя следующие строчки:

$ bin/start-hbase.sh
И также убедитесь, что HBase доступен для использования командной оболочкой Hbase:
$ bin/hbase shell

Настройка Gora

Gora настраивается через файл, расположенный в classpath с именем gora.properties. Мы будем использовать следующий файл:
gora-tutorial/conf/gora.properties
gora.datastore.default=org.apache.gora.hbase.store.HBaseStore
gora.datastore.autocreateschema=true

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

Моделирование данных

В этом руководстве мы будем анализировать и хранить журналы веб-сервера. Некоторые примеры журналов находятся в файле src/main/resources/access.log.tar.gz. Примерные журналы содержат 10 000 строк, между датами 2009/03/10 - 2009/03/15. Первое, что нам нужно сделать, это извлечь журналы:

$ tar zxvf src/main/resources/access.log.tar.gz -C src/main/resources/

Вы также можете использовать свои собственные файлы журнала, учитывая, что формат журнала является комбинированным. Некоторые примеры из журнала:

88.254.190.73 - - [10/Mar/2009:20:40:26 +0200] "GET / HTTP/1.1" 200 43 "http://www.buldinle.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB5; .NET CLR 2.0.50727; InfoPath.2)
78.179.56.27 - - [11/Mar/2009:00:07:40 +0200] "GET /index.php?i=3&a=1__6x39kovbji8&k=3750105 HTTP/1.1" 200 43 "http://www.buldinle.com/index.php?i=3&a=1__6X39Kovbji8&k=3750105" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; OfficeLiveConnector.1.3; OfficeLivePatch.0.0)
78.163.99.14 - - [12/Mar/2009:18:18:25 +0200] "GET /index.php?a=3__x7l72c&k=4476881 HTTP/1.1" 200 43 "http://www.buldinle.com/index.php?a=3__x7l72c&k=4476881" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.1)

Определение компонентов данных

Компоненты данных - это основной способ хранения и сохранения данных в Apache Gora. Ей необходимо явно следить за состоянием данных в памяти, в чем нам поможет [Apache Avro|Apache Avro]. Использование Avro дает нам возможность явно отслеживать постоянное состояние объекта. Определение компонентов данных - очень простая задача, но для правильного использования синтаксиса, прочитайте спецификацию Apache Avro. Сначала, нам нужно определить страницу компонентов данных для хранения одного URL-адреса доступа в журналах, для чего перейдем по:

src/main/avro/pageview.json
{
  "type": "record",
  "name": "Pageview",
  "namespace": "org.apache.gora.tutorial.log.generated",
  "fields" : [
    {"name": "url", "type": "string"},
    {"name": "timestamp", "type": "long"},
    {"name": "ip", "type": "string"},
    {"name": "httpMethod", "type": "string"},
    {"name": "httpStatusCode", "type": "int"},
    {"name": "responseSize", "type": "int"},
    {"name": "referrer", "type": "string"},
    {"name": "userAgent", "type": "string"}
  ]
}

Схемы Avro объявлены в JSON. Записи определяются с типом «record», с именем в качестве имени класса и пространством имен, которое сопоставляется с именем пакета в Java. Поля перечислены в элементе" fields". Каждое поле имеет свой тип.

Компиляция схем Avro

Следующим шагом после определения компонентов данных является компиляция схем в классы Java. Для этого мы будем использовать GoraCompiler. Вызовите компилятор Apache Gora из каталога Gora верхнего уровня при помощи:

$ bin/gora goracompiler
$ Usage: GoraCompiler <schema file> <output dir> [-license <id>]
<schema file>     - individual avsc file to be compiled or a directory path containing avsc files
<output dir>      - output directory for generated Java files
[-license <id>]   - the preferred license header to add to the generated Java file. Current options include; 
ASLv2   (Apache Software License v2.0) 
AGPLv3  (GNU Affero General Public License)
CDDLv1  (Common Development and Distribution License v1.0)
FDLv13  (GNU Free Documentation License v1.3)
GPLv1   (GNU General Public License v1.0)
GPLv2   (GNU General Public License v2.0)
GPLv3   (GNU General Public License v3.0)
LGPLv21 (GNU Lesser General Public License v2.1)
LGPLv3  (GNU Lesser General Public License v2.1)

Далее, для компиляции класса Pageview в gora-tutorial/src/main/java/org/apache/gora/tutorial/log/generated/Pageview.java, нам нужно выполнить следующее:

$ bin/gora goracompiler gora-tutorial/src/main/avro/pageview.json gora-tutorial/src/main/java/

Компилятор Gora предоставляет специальный компилятор Avro для преобразования JSON в класс Java. Созданные таким образом классы расширяют постоянный интерфейс. Теперь посмотрим на внутренности созданного класса Pageview.java:

 1 public class Pageview extends PersistentBase {
 2 private Utf8 url;
 3 private long timestamp;
 4 private Utf8 ip;
 5 private Utf8 httpMethod;
 6 private int httpStatusCode;
 7 private int responseSize;
 8 private Utf8 referrer;
 9 private Utf8 userAgent;
10 ...
11 public static final Schema _SCHEMA = Schema.parse("{\"type\":\"record\", ... ");
12   public static enum Field {
13   URL(0,"url"),
14   TIMESTAMP(1,"timestamp"),
15   IP(2,"ip"),
16   HTTP_METHOD(3,"httpMethod"),
17   HTTP_STATUS_CODE(4,"httpStatusCode"),
18   RESPONSE_SIZE(5,"responseSize"),
19   REFERRER(6,"referrer"),
20   USER_AGENT(7,"userAgent"),
21   ;
22   private int index;
23   private String name;
24   Field(int index, String name) {this.index=index;this.name=name;}
25   public int getIndex() {return index;}
26   public String getName() {return name;}
27   public String toString() {return name;}
28   };
29 public static final String[] _ALL_FIELDS = {"url","timestamp","ip","httpMethod"
30   ,"httpStatusCode","responseSize","referrer","userAgent",};
31 ...
32 }

Мы можем видеть фактические объявления полей в классе. Обратите внимание на то, что Avro использует класс Utf8 в качестве заменителя для полей строк. Мы также можем увидеть встроенное объявление Avro Schema и внутренние перечисления (enum) с именем Field. Поля enum и _ALL_FIELDS пригодятся в том случае, когда мы запрашиваем хранилище данных для определенных полей.

Определение сопоставления данных между потенциально различными семантиками одного или разных объектов

Apache Gora предназначен для гибкой работы с различными типами моделей данных, включая хранилища столбцов (например, HBase, Cassandra), БД SQL, неструктурированные файлы (двоичные, JSON, XML) и хранилища ключей. Таким образом, соответствие между компонентами данных и хранилищем данных определяется в файлах сопоставления XML. Каждое хранилище данных имеет свой собственный формат соответствия, что упрощает использование определенных параметров хранилища. Файлы сопоставления определяют, как поля классов, объявленные в схемах Avro, и сохраняют в хранилище данных.

Сопоставления в HBase

Сопоставления HBase хранятся в файле с именем gora-hbase-mappings.xml, который находится в каталоге gora-tutorial/conf/gora-hbase-mappings.xml.

 1 <gora-otd>
 2   <table name="Pageview"> <!-- optional descriptors for tables -->
 3     <family name="common"> <!-- This can also have params like compression, bloom filters -->
 4     <family name="http"/>
 5     <family name="misc"/>
 6   </table>
 7   <class name="org.apache.gora.tutorial.log.generated.Pageview" keyClass="java.lang.Long" table="AccessLog">
 8    <field name="url" family="common" qualifier="url"/>
 9    <field name="timestamp" family="common" qualifier="timestamp"/>
10    <field name="ip" family="common" qualifier="ip" />
11    <field name="httpMethod" family="http" qualifier="httpMethod"/>
12    <field name="httpStatusCode" family="http" qualifier="httpStatusCode"/>
13    <field name="responseSize" family="http" qualifier="responseSize"/>
14    <field name="referrer" family="misc" qualifier="referrer"/>
15    <field name="userAgent" family="misc" qualifier="userAgent"/>
16   </class>
17   ...
18 </gora-otd>

Каждый файл сопоставления начинается с элемента верхнего уровня <gora-otd>. Файлы сопоставления Gora HBase могут иметь два типа дочерних элементов: объявления таблиц и классов. На этом уровне должны быть перечислены все определения таблиц и классов. Объявление таблицы является необязательным, т.к. в большинстве случаев Apache Gora записывает объявление таблицы из вложенных элементов класса. Тем не менее, если Gora используется для автоматического создания таблиц, то здесь можно указать некоторые конфигурации таблицы HBase, такие как сжатие, blockCache и т.п. Точный синтаксис файла можно найти здесь. В Apache Gora доступ к хранилищу данных всегда осуществляется с помощью модели данных "ключ-значение", так как большинство серверов поддерживают эту модель. Предполагается, что Datastore API знает имена ключевых и постоянных классов, поэтому их можно конкретизировать. Пара ключевых значений объявляется в элементе класса. Атрибут name - это полное имя класса, а атрибут keyClass - это полное имя ключевого класса.

Основной API

Анализ журналов

Теперь, когда мы все настроили, мы можем увидеть Gora API в действии. API довольно прост в использовании. Мы будем использовать класс LogManager (который находится в gora-tutorial/src/main/java/org/apache/gora/tutorial/log/LogManager.java) для разбора и хранения журналов, удаления некоторых строк и выполнения запросов. Прежде всего, давайте посмотрим на конструктор. Единственное, что он делает, это вызывает метод init(), который создает экземпляр DataStore, чтобы его можно было использовать методами LogManager.

 1 public LogManager() {
 2     try {
 3      init();
 4     } catch (IOException ex) {
 5     throw new RuntimeException(ex);
 6     }
 7   }
 8   private void init() throws IOException {
 9     dataStore = DataStoreFactory.getDataStore(Long.class, Pageview.class, new Configuration());
10   }

DataStore является самым важным классом в API Gora. С его помощью, объекты могут сохраняться, извлекаться, запрашиваться или удаляться собственными методами. Каждое хранилище данных, поддерживаемое Gora, определяет свой собственный подкласс класса DataStore. Например, модуль gora-hbase определяет HBaseStore, а модуль gora-sql определяет SqlStore. Однако эти подклассы не могут открыто использоваться пользователями. Объекты хранилища данных создаются при помощи DataStoreFactory. Необходимо предоставить класс "ключ-значение". Класс datastore является необязательным, и если он не указан, он будет автоматически считываться из конфигурации (gora.properties). В нашем случае, мы уже задали схему avro для использования и компиляции нашего компонента данных в класс Pageview. Для ключей, расположенных в хранилище данных, мы будем использовать Longs. Затем, давайте посмотрим на основную функцию класса LogManager:

 1 public static void main(String[] args) throws Exception {
 2   if(args.length > 2) {
 3     System.err.println(USAGE);
 4     System.exit(1);
 5   }
 6   LogManager manager = new LogManager();
 7   if("-parse".equals(args[0])) {
 8     manager.parse(args[1]);
 9   } else if("-query".equals(args[0])) {
10   if(args.length == 2) 
11     manager.query(Long.parseLong(args[1]));
12   else 
13     manager.query(Long.parseLong(args[1]), Long.parseLong(args[2]));
14   } else if("-delete".equals(args[0])) {
15     manager.delete(Long.parseLong(args[1]));
16   } else if("-deleteByQuery".equalsIgnoreCase(args[0])) {
17     manager.deleteByQuery(Long.parseLong(args[1]), Long.parseLong(args[2]));
18   } else {
19     System.err.println(USAGE);
20     System.exit(1);
21   }
22   manager.close();
23 }

Мы можем использовать пример программы log manager, запустив её из командной строки (в каталоге верхнего уровня Gora):

$ bin/gora logmanager
LogManager -parse <input_log_file>
       -get <lineNum>
       -query <lineNum>
       -query <startLineNum> <endLineNum>
       -delete <lineNum>
       -deleteByQuery <startLineNum> <endLineNum>

Таким образом, чтобы хранить и проводить анализ наших журналов, расположенных по адресу gora-tutorial/src/main/resources/access.log, мы запишем:

$ bin/gora logmanager -parse gora-tutorial/src/main/resources/access.log

Эта команда должна вывести что-то вроде этого:

10/09/30 18:30:17 INFO log.LogManager: Parsing file:gora-tutorial/src/main/resources/access.log
10/09/30 18:30:23 INFO log.LogManager: finished parsing file. Total number of log lines:10000

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

 1 private void parse(String input) throws IOException, ParseException {
 2   BufferedReader reader = new BufferedReader(new FileReader(input));
 3   long lineCount = 0;
 4   try {
 5     String line = reader.readLine();
 6     do {
 7       Pageview pageview = parseLine(line);
 8 
 9       if(pageview != null) {
10         //store the pageview 
11         storePageview(lineCount++, pageview);
12       }
13 
14       line = reader.readLine();
15     } while(line != null);
16 
17   } finally {
18   reader.close();  
19   }
20 }

Обратите внимание, что функция parseLine(line) выполняет фактическое преобразование строки в объект Pageview, определенный ранее.

 1 private Pageview parseLine(String line) throws ParseException {
 2   StringTokenizer matcher = new StringTokenizer(line);
 3   //parse the log line
 4   String ip = matcher.nextToken();
 5   ...
 6   //construct and return pageview object
 7   Pageview pageview = new Pageview();
 8   pageview.setIp(new Utf8(ip));
 9   pageview.setTimestamp(timestamp);
10   ...
11   return pageview;
12 }

Хранение объектов в DataStore

1 /** Stores the pageview object with the given key */
2 private void storePageview(long key, Pageview pageview) throws IOException {
3   dataStore.put(key, pageview);
4 }

Все, что нам нужно сделать, это вызвать метод put().

Завершение работы DataStore

Реализации хранилища DataStore могут выполнять много кэширования для повышения производительности. Но сами данные могут не всегда отправляться в постоянное хранилище. Поэтому необходимо убедиться в том, чтобы после окончания хранения объектов был закрыт экземпляр хранилища данных. Это добивается вызовом его метода close(). LogManager всегда закрывает хранилище данных, используя собственный метод close().

1 private void close() throws IOException {
2   //It is very important to close the datastore properly, otherwise
3   //some data loss might occur.
4   if(dataStore != null)
5   dataStore.close();
6 }

Если вы вносите большой объем данных и хотите, чтобы данные были доступны до закрытия хранилища данных, можно также воспользоваться методом flush(), с помощью которого данные сбрасываются в базовое хранилище.

Сохраненные данные в HBase

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

$ cd ../hbase-${version}
$ bin/hbase shell
hbase(main):010:0> list
AccessLog                                                                                                     
1 row(s) in 0.0470 seconds

Помните, что AccessLog - это имя таблицы, которую мы указали в gora-hbase-mapping.xml. Посмотрим на содержимое таблицы:

hbase(main):010:0> scan 'AccessLog', {LIMIT=>1}
ROW                          COLUMN+CELL                                                                      
 \x00\x00\x00\x00\x00\x00\x0 column=common:ip, timestamp=1285860617341, value=88.240.129.183                  
 0\x00                                                                                                        
 \x00\x00\x00\x00\x00\x00\x0 column=common:timestamp, timestamp=1285860617341, value=\x00\x00\x01\x1F\xF1\xAEl
 0\x00                       P                                                                                
 \x00\x00\x00\x00\x00\x00\x0 column=common:url, timestamp=1285860617341, value=/index.php?a=1__wwv40pdxdpo&k=2
 0\x00                       18978                                                                            
 \x00\x00\x00\x00\x00\x00\x0 column=http:httpMethod, timestamp=1285860617341, value=GET                       
 0\x00                                                                                                        
 \x00\x00\x00\x00\x00\x00\x0 column=http:httpStatusCode, timestamp=1285860617341, value=\x00\x00\x00\xC8      
 0\x00                                                                                                        
 \x00\x00\x00\x00\x00\x00\x0 column=http:responseSize, timestamp=1285860617341, value=\x00\x00\x00+           
 0\x00                                                                                                        
 \x00\x00\x00\x00\x00\x00\x0 column=misc:referrer, timestamp=1285860617341, value=http://www.buldinle.com/inde
 0\x00                       x.php?a=1__WWV40pdxdpo&k=218978                                                  
 \x00\x00\x00\x00\x00\x00\x0 column=misc:userAgent, timestamp=1285860617341, value=Mozilla/4.0 (compatible; MS
 0\x00                       IE 6.0; Windows NT 5.1)

На выходе отображаются все столбцы, соответствующие первой строке с ключом 0. Мы можем увидеть общие столбцы: ip, common: timestamp, common: url и т.д. Помните, что здесь находятся те столбцы, которые мы описали в gora-hbase-mapping .xml. Можно также подсчитать количество записей в таблице, чтобы убедиться, что все записи были сохранены:

hbase(main):010:0> count 'AccessLog'
  ... 
  10000 row(s) in 1.0580 seconds

Извлечение объектов из DataStore

Существует два метода для извлечения объектов. Первый метод предполагает извлечение одиночного объекта один за одним по его ключу. Второй способ предполагает выполнение запроса через хранилище данных. Для извлечения одиночных объектов, мы можем использовать один из перегруженных методов get(). Данная функция с сигнатурой get(K key) возвращает объект, соответствующий данному ключу key, извлекая все соответствующие поля объекта. Другая перегруженная сигнатура функции get(K key, String[] fields) возвращает объект, соответствующий данному ключу, но извлекает только те поля, которые были указаны во втором аргументе. При запуске с аргументом -get, класс LogManager извлекает объект pageview из хранилища данных и выводит результаты:

1 /** Fetches a single pageview object and prints it*/
2 private void get(long key) throws IOException {
3   Pageview pageview = dataStore.get(key);
4   printPageview(pageview);
5 }

Например, чтобы отобразить 42-ю строку журнала доступа, необходимо выполнить:

$ bin/gora logmanager -get 42
org.apache.gora.tutorial.log.generated.Pageview@321ce053 {
  "url":"/index.php?i=0&a=1__rntjt9z0q9w&k=398179"
  "timestamp":"1236710649000"
  "ip":"88.240.129.183"
  "httpMethod":"GET"
  "httpStatusCode":"200"
  "responseSize":"43"
  "referrer":"http://www.buldinle.com/index.php?i=0&a=1__RnTjT9z0Q9w&k=398179"
  "userAgent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
}

Запрос объектов

API DataStore определяет интерфейс запроса к объектам в хранилище данных. Каждая реализация хранилища данных может использовать собственную реализацию интерфейса запроса. Запросы создаются путем вызова DataStore#newQuery(). Когда запрос посылается через хранилище данных, результаты возвращаются через интерфейс Result. Посмотрим, как можно запустить запрос и отобразить результаты в классе LogManager:

1 /** Queries and prints pageview object that have keys between startKey and endKey*/
2 private void query(long startKey, long endKey) throws IOException {
3   Query<Long, Pageview> query = dataStore.newQuery();
4   //set the properties of query
5   query.setStartKey(startKey);
6   query.setEndKey(endKey);
7   Result<Long, Pageview> result = query.execute();
8   printResult(result);
9 }

После создания запроса его свойства задаются с помощью методов setter. Затем, вызов query.execute() возвращает объект Result. Метод getKey() возвращает текущий ключ и метод get() возвращает текущий объект.

 1 private void printResult(Result<Long, Pageview> result) throws IOException {
 2   while(result.next()) { //advances the Result object and breaks if at end
 3     long resultKey = result.getKey(); //obtain current key
 4     Pageview resultPageview = result.get(); //obtain current value object
 5     //print the results
 6     System.out.println(resultKey + ":");
 7     printPageview(resultPageview);
 8   }
 9   System.out.println("Number of pageviews from the query:" + result.getOffset());
10 }

Определив эти функции, мы можем запустить класс Log Manager, чтобы запросить журналы доступа у HBase. Например, для отображения записей журнала между 10-ми и 12-ми строками, мы можем использовать:

bin/gora logmanager -query 10 12
10:
org.apache.gora.tutorial.log.generated.Pageview@d38d0eaa {
  "url":"/"
  "timestamp":"1236710442000"
  "ip":"144.122.180.55"
  "httpMethod":"GET"
  "httpStatusCode":"200"
  "responseSize":"43"
  "referrer":"http://buldinle.com/"
  "userAgent":"Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6"
}
11:
org.apache.gora.tutorial.log.generated.Pageview@b513110a {
  "url":"/index.php?i=7&a=1__gefuumyhl5c&k=5143555"
  "timestamp":"1236710453000"
  "ip":"85.100.75.104"
  "httpMethod":"GET"
  "httpStatusCode":"200"
  "responseSize":"43"
  "referrer":"http://www.buldinle.com/index.php?i=7&a=1__GeFUuMyHl5c&k=5143555"
  "userAgent":"Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7"
}

Удаление объектов

Существует два основных метода удаления объектов из хранилища данных. Первый заключается в удалении объектов по одному с использованием метода DataStore#delete (K key), который принимает в качестве аргумента ключ объекта. В качестве альтернативы первого способа, мы можем удалить все данные, соответствующие данному запросу, вызвав метод DataStore#deleteByQuery(Query query). Используя #deleteByQuery, мы можем выполнять небольшие удаления, например, удаление только определенного поля из нескольких записей.

 1 /**Deletes the pageview with the given line number */
 2 private void delete(long lineNum) throws Exception {
 3   dataStore.delete(lineNum);
 4   dataStore.flush(); //write changes may need to be flushed before they are committed 
 5 }
 6 
 7 /** This method illustrates delete by query call */
 8 private void deleteByQuery(long startKey, long endKey) throws IOException {
 9   //Constructs a query from the dataStore. The matching rows to this query will be deleted
10   Query<Long, Pageview> query = dataStore.newQuery();
11   //set the properties of query
12   query.setStartKey(startKey);
13   query.setEndKey(endKey);
14 
15   dataStore.deleteByQuery(query);
16 }
bin/gora logmanager -delete 12
bin/gora logmanager -deleteByQuery 40 50

[Источник 3]

Источники

  1. Apache Gora™ - Welcome to Apache Gora™ // The Apache Software Foundation. [2010-2018]. URL: http://gora.apache.org/index.html (дата обращения: 02.12.2018).
  2. Apache Gora™ - About Apache Gora™ // The Apache Software Foundation. [2010-2018]. URL: http://gora.apache.org/about.html (дата обращения: 03.12.2018).
  3. Apache Gora™ - Gora Tutorial // The Apache Software Foundation. [2010-2018]. URL: http://gora.apache.org/current/tutorial.html (дата обращения: 04.12.2018).