我正在尝试使用HBase来构建一些实时API。因此我的用例是每秒支持~10000个并发请求。我试图做一些连接池,以实现多线程访问。我按照此文档创建了连接:https://hbase.apache.org/1.1/apidocs/org/apache/hadoop/hbase/client/ConnectionFactory.html
但是当我向API发出并发请求时,我一直收到此错误:
WARN [http-nio-34000-exec-93-SendThread(d-3zjyk02.target.com:2181)]
19 Apr 2017 04:48:13:872 (ClientCnxn.java:1102) - Session 0x0 for
server d-3zjyk02.target.com/10.66.241.30:2181, unexpected error,
closing socket connection and attempting reconnect
java.io.IOException: Connection reset by peer
at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:192)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
org.apache.zookeeper.ClientCnxnSocketNIO.doIO(ClientCnxnSocketNIO.java:68)
at
org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:366)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1081)
以下是我创建连接的方式:
// Connection to the cluster. A single connection shared by all application threads
private Connection connection = null;
public Connection getHBaseConnection() throws Exception {
if (connection == null) {
try {
Configuration configuration = HBaseConfiguration.create();
configuration.addResource("core-site.xml");
configuration.addResource("hbase-site.xml");
configuration.addResource("hdfs-site.xml");
connection = ConnectionFactory.createConnection(configuration);
} catch (Exception ex) {
LOG.error("Exception in creating the HBase connection object: " + ex.getMessage());
throw new Exception("Exception in creating the HBase connection: " + ex.getMessage());
}
}
return connection;
}
以下是我如何将get HBase连接方法用于某些扫描操作:
try {
connection = getHBaseConnection();
afterConnectionStartTime = System.currentTimeMillis();
LOG.info("[" + (System.currentTimeMillis() - startTime) + "]ms" + " ...TIME TAKEN to get the HBase connection object");
if (connection != null) {
table = connection.getTable(TableName.valueOf(TABLE_NAME));
Scan scan = new Scan(Bytes.toBytes(rowKeyStartDate), Bytes.toBytes(rowKeyEndDate));
scan.addColumn(COLUMN_FAMILY, ITEM);
}
此代码适用于任意数量的顺序请求,但是当我执行并发请求时,我不断收到此错误。
我对此问题的研究中的一些观察结果:
1)此错误与zookeeper在一定数量的请求之后关闭套接字有关(我假设它超过了我的zoo.cfg文件中提到的最大客户端连接数(40))。但我不明白为什么并发请求首先要发送给zookeeper。第一个请求应该打开连接对象,所有后续请求应该使用该现有连接直接与区域服务器通信。
2)我假设这是进行连接池的正确方法(至少按照官方的Hbase文档)。如果不是,那么正确的做法是什么?
3)我不想增加zookeeper cfg文件中的最大客户端连接,认为它可能是一个可以完成我的工作的临时黑客。
非常感谢任何帮助/建议。
谢谢!