HBase с Java

1. Общ преглед

В тази статия ще разгледаме клиентската библиотека на Java база данни HBase . HBase е разпределена база данни, която използва файловата система Hadoop за съхранение на данни.

Ще създадем пример за клиент на Java и таблица, към която ще добавим няколко прости записа.

2. Структура на данните за HBase

В HBase данните са групирани в семейства колони. Всички членове на колони от семейство колони имат един и същ префикс.

Така например, колоните family1: qualifier1 и family1 : qualifier2 и двете са членове на 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-client и hbase зависимости:

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

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

Трябва да настроим HBase, за да можем да се свържем от клиентска библиотека на Java към нея. Инсталацията е извън обхвата на тази статия, но можете да разгледате някои от ръководствата за инсталиране на HBase онлайн.

След това трябва да стартираме HBase master локално, като изпълним:

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. Добавяне и извличане на елементи

Със създадената таблица можем да добавяме нови данни към нея, като създаваме обект Put и извикваме метод put () в обекта Table :

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

Извличането на предварително създаден ред може да се постигне с помощта на клас Get :

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

В ROW1 е идентификатор на ред - можем да го използваме, за да изтеглите конкретен ред от базата данни. Когато се обаждате:

Bytes.bytesToString(value)

върнатият резултат ще бъде предварително вмъкнатите cell_data.

8. Сканиране и филтриране

Можем да сканираме таблицата, извличайки всички елементи в даден квалификатор, като използваме обект Сканиране (имайте предвид, че ResultScanner разширява Closable , така че не забравяйте да извикате close () , когато сте готови):

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, и филтър2 уточнява, че ние се интересуваме само от редовете, които имат квалификант равна qualifier1 :

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

Then we can get a result set from a Scan query:

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); } }

When creating a FilterList we passed an Operator.MUST_PASS_ALL – it means that all filters must be satisfied. We can choose an Operation.MUST_PASS_ONE if only one filter needs to be satisfied. In the resulting set, we will have only rows that matched specified filters.

9. Deleting Rows

Finally, to delete a row, we can use a Delete class:

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

We're deleting a row1 that resides inside of a family1.

10. Conclusion

In this quick tutorial, we focused on communicated with a HBase database. We saw how to connect to HBase from the Java client library and how to run various basic operations.

Внедряването на всички тези примери и кодови фрагменти може да бъде намерено в проекта GitHub; това е проект на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.