Spring HbaseTemplate поддерживает соединение - PullRequest
1 голос
/ 28 мая 2020

Мне удалось интегрировать Hbase в приложение Spring, используя HbaseTemplate:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.hadoop.hbase.HbaseTemplate;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class ItemRepositoryImpl implements ItemRepository {

    @Autowired
    private HbaseTemplate hbaseTemplate;

    @Override
    public List<Item> findAll() {
        Scan scan = new Scan();
        scan.addColumn(CF, CQ);
        hbaseTemplate.find("TABLE_NAME", scan, (result, rowNum) -> {
            return new Item(...)
        });
    }
}

Однако соединение с Hbase открывается каждый раз, когда я запускаю findAll() (и закрывается сразу после ). Я где-то читал, что способ поддерживать соединение - это использовать Connection и Table для вызовов Hbase. Проблема в том, что HbaseTemplate использует HConnection и HTableInterface.

Как сохранить соединение с помощью HbaseTemplate? На создание нового соединения уходит очень много времени, и я бы хотел сделать это только один раз. В качестве альтернативы, есть ли другой способ подключиться к Hbase из приложения Spring?

Я использую:

org.springframework.data:spring-data-hadoop:2.5.0.RELEASE
org.apache.hbase:hbase-client:1.1.2

1 Ответ

0 голосов
/ 29 мая 2020

Я нашел два решения этой проблемы:

Custom HbaseTemplate, который расширяет HbaseAccessor и реализует HbaseOperations

Кажется, лучший способ - создать пользовательский класс, который расширяет HbaseAccessor и реализует HbaseOperations так же, как и исходный HbaseTemplate, но с использованием нового API (ie. Table вместо HTableInterface et c.)

Один из примеров его реализации можно найти в проекте easyhbase .

Внедрение Connection вместо HbaseTemplate

Другое решение - внедрить Connection в репозиторий и выполнить всю тяжелую работу там:

import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.stream.Collectors;
import java.stream.StreamSupport;

@Component
public class ItemRepositoryImpl implements ItemRepository {

    @Autowired
    private Connection connection;

    @Override
    public List<Item> findAll() throws IOException {
        Scan scan = new Scan();
        scan.addColumn(CF, CQ);
        try (Table table = connection.getTable(TableName.valueOf(TABLE_NAME))) {
            return StreamSupport
                .stream(table.getScanner(scan).spliterator, false)
                .map(...)
                .collect(Collectors.toList());
        }
    }
}

Connection @Bean можно настроить следующим образом:

@Configuration
public class HbaseConfiguration {

    @Bean
    public Connection() throws IOException {
        org.apache.hadoop.conf.Configuration conf = HBaseConfiguration.create();
        // configuration setup
        return ConnectionFactory.createConnection(conf);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...