Рубрики
Без рубрики

HBase с Java

Введение в базу данных HBase и взаимодействие с ней с помощью Java-клиента.

Автор оригинала: baeldung.

HBase с Java

1. Обзор

В этой статье мы будем смотреть на HBase библиотека базы данных Java Client. HBase — распределенная база данных, которая использует файловую систему Hadoop для хранения данных.

Мы создадим пример Java-клиента и таблицу, в которую добавим несколько простых записей.

2. Структура данных HBase

В HBase данные сгруппированы в семьи столбецов. Все члены столбца семьи столбца имеют одинаковую приставку.

Например, столбцы family1:квалификатор1 и family1 :квалификатор2 являются членами family1 семейство столбецов. Все члены семьи столбца хранятся вместе в файловой системе.

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

Давайте посмотрим пример записи из Hbase:

Family1:{  
   'Qualifier1':'row1:cell_data',
   'Qualifier2':'row2:cell_data',
   'Qualifier3':'row3:cell_data'
}
Family2:{  
   'Qualifier1':'row1:cell_data',
   'Qualifier2':'row2:cell_data',
   'Qualifier3':'row3:cell_data'
}

У нас есть две семьи столбцев, каждый из них имеет три квалификатора с некоторыми данными ячейки в нем. Каждый ряд имеет ключ строки – это уникальный идентификатор строки. Мы будем использовать ключ строки для вставки, извлечения и удаления данных.

3. HBase Клиент Maven зависимость

Прежде чем подключиться к HBase, мы должны добавить hbase-клиент и hbase Зависимости:


    org.apache.hbase
    hbase-client
    ${hbase.version}


     org.apache.hbase
     hbase
     ${hbase.version}

4. Настройка HBase

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

Далее, мы должны начать HBase мастер локально, выполняя:

hbase master start

5. Подключение к HBase с Java

Для программного подключения с Java на HBase необходимо определить файл конфигурации XML. Мы начали наш экземпляр HBase на localhost поэтому нам нужно ввести то в архив конфигурации:


    
        hbase.zookeeper.quorum
        localhost
    
    
        hbase.zookeeper.property.clientPort
        2181
    

Теперь нам нужно указать клиенту HBase на этот файл конфигурации:

Configuration config = HBaseConfiguration.create();

String path = this.getClass()
  .getClassLoader()
  .getResource("hbase-site.xml")
  .getPath();
config.addResource(new Path(path));

Далее, мы проверяем, если подключение к HBase был успешным – в случае сбоя, MasterNotRunningException будут брошены:

HBaseAdmin.checkHBaseAvailable(config);

6. Создание структуры базы данных

Прежде чем мы начнем добавлять данные в HBase, нам нужно создать структуру данных для вставки строк. Мы создадим одну таблицу с двумя семьями столбца:

private TableName table1 = TableName.valueOf("Table1");
private String family1 = "Family1";
private String family2 = "Family2";

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

Connection connection = ConnectionFactory.createConnection(config)
Admin admin = connection.getAdmin();

Затем мы можем создать таблицу, передав экземпляр HTableDescriptor класс к createTable () метод на администратор объект:

HTableDescriptor desc = new HTableDescriptor(table1);
desc.addFamily(new HColumnDescriptor(family1));
desc.addFamily(new HColumnDescriptor(family2));
admin.createTable(desc);

7. Добавление и извлечение элементов

Создав таблицу, мы можем добавить к ней новые данные, создав Положите объект и вызов положить () метод на Таблица объект:

byte[] row1 = Bytes.toBytes("row1")
Put p = new Put(row1);
p.addImmutable(family1.getBytes(), qualifier1, Bytes.toBytes("cell_data"));
table1.put(p);

Извлечение ранее созданной строки может быть достигнуто с помощью Получить класс:

Get g = new Get(row1);
Result r = table1.get(g);
byte[] value = r.getValue(family1.getBytes(), qualifier1);

row1 является идентификатором строки – мы можем использовать его для получения определенной строки из базы данных. При вызове:

Bytes.bytesToString(value)

возвращенный результат будет ранее вставлен cell_data.

8. Сканирование и фильтрация

Мы можем сканировать таблицу, извлекая все элементы внутри данного квалификатора с помощью Сканирование объект (обратите внимание, что РезультатScanner расширяет Закрытое , так что не забудьте позвонить закрыть () на нем, когда вы сделали):

Scan scan = new Scan();
scan.addColumn(family1.getBytes(), qualifier1);

ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
    System.out.println("Found row: " + result);
}

Эта операция будет печатать все ряды внутри квалификатор1 с некоторой дополнительной информацией, такой как таймштамп:

Found row: keyvalues={Row1/Family1:Qualifier1/1488202127489/Put/vlen=9/seqid=0}

Мы можем получить конкретные записи с помощью фильтров.

Во-первых, мы создаем два фильтра. фильтр1 указывает, что запрос сканирования будет извлекать элементы, которые больше, чем row1, и filter2 указывает, что нас интересуют только строки, которые имеют квалификатор, равный квалификатор1 :

Filter filter1 = new PrefixFilter(row1);
Filter filter2 = new QualifierFilter(
  CompareOp.GREATER_OR_EQUAL, 
  new BinaryComparator(qualifier1));
List filters = Arrays.asList(filter1, filter2);

Тогда мы можем получить набор результатов из Сканирование запрос:

Scan scan = new Scan();
scan.setFilter(new FilterList(Operator.MUST_PASS_ALL, filters));

try (ResultScanner scanner = table.getScanner(scan)) {
    for (Result result : scanner) {
        System.out.println("Found row: " + result);
    }
}

При создании ФильтрЛист мы прошли Operator.MUST_PASS_ALL – это означает, что все фильтры должны быть удовлетворены. Мы можем выбрать Operation.MUST_PASS_ONE если только один фильтр должен быть удовлетворен. В полученном наборе у нас будут только строки, которые соответствуют указанным фильтрам.

9. Удаление строк

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

Delete delete = new Delete(row1);
delete.addColumn(family1.getBytes(), qualifier1);
table.delete(delete);

Мы удаляем row1 который находится внутри family1 .

10. Заключение

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

Реализация всех этих примеров и фрагментов кода можно найти в Проект GitHub ; это проект Maven, поэтому он должен быть легким для импорта и запуска, как она есть.