Spring HbaseTemplate 保持连接

Spring HbaseTemplate keeping connection alive

我使用 HbaseTemplate 成功地将 Hbase 集成到 Spring 应用程序中:

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

但是,每次 运行 findAll() 时都会打开与 Hbase 的连接(并在之后关闭)。我在某处读到保持连接有效的方法是使用 ConnectionTable 调用 Hbase。问题是 HbaseTemplate 使用 HConnectionHTableInterface

如何使用 HbaseTemplate 保持连接?启动新连接非常耗时,我只想执行一次。或者还有其他方法可以从 Spring 应用程序连接到 Hbase 吗?

我正在使用:

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

我找到了解决这个问题的两个方法:

扩展HbaseAccessor并实现HbaseOperations

的自定义HbaseTemplate

最好的方法似乎是创建一个自定义 class,它扩展 HbaseAccessor 并以与原始 HbaseTemplate 类似的方式实现 HbaseOperations,但是使用较新的 API(即 Table 而不是 HTableInterface 等)

可以在 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);
    }

}