Spring HbaseTemplate使连接保持活动状态

问题描述 投票:1回答:1

我设法使用HbaseSpring集成到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(...)
        });
    }
}

但是,每次我运行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
java spring hbase spring-data-hadoop
1个回答
0
投票

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

自定义HbaseTemplate,它扩展了HbaseAccessor并且实现了HbaseOperations

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

如何实现它的示例之一可以在easyhbase项目中找到。

注入Connection而不是HbaseTemplate

另一种解决方案是将Connection注入存储库,并在那里进行所有繁重的工作:

import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
public class ItemRepositoryImpl implements ItemRepository {

    @Autowired
    private Connection connection;

    @Override
    public List<Item> findAll() throws IOException {
        List<Item> items = new ArrayList<>();
        Scan scan = new Scan();
        scan.addColumn(CF, CQ);
        Table table = connection.getTable(TableName.valueOf(TABLE_NAME));
        for (Result row : table.getScanner(scan)) {
            items.add(...)
        }
        return items;
    }
}

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

}
© www.soinside.com 2019 - 2024. All rights reserved.