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)); Listfilters = 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, поэтому он должен быть легким для импорта и запуска, как она есть.