我设法使用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(...)
});
}
}
但是,每次我运行findAll()
时,都会打开与Hbase的连接(并在之后立即关闭)。我在某处读到,保持连接存活的方法是使用Connection
和Table
来调用Hbase。问题是HbaseTemplate
使用HConnection
和HTableInterface
。
如何使用HbaseTemplate
使连接保持活动状态?启动新连接非常耗时,我只想执行一次。另外,还有其他方法可以从Spring
应用连接到Hbase吗?
我正在使用:
org.springframework.data:spring-data-hadoop:2.5.0.RELEASE
org.apache.hbase:hbase-client:1.1.2
我找到了解决这个问题的两种方法:
自定义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);
}
}