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 的连接(并在之后关闭)。我在某处读到保持连接有效的方法是使用 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
我找到了解决这个问题的两个方法:
扩展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);
}
}
我使用 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 的连接(并在之后关闭)。我在某处读到保持连接有效的方法是使用 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
我找到了解决这个问题的两个方法:
扩展HbaseAccessor
并实现HbaseOperations
最好的方法似乎是创建一个自定义 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);
}
}