我正在编写一个代码来处理存储在HBase中的数据。我想写一个测试代码。我想在我的测试中使用HBaseTestingUtility,因此,在我的@BeforeClass中,我创建了HBaseTestingUtility的新实例,并启动了迷你集群:
@BeforeClass
public static void setUpClass() throws Exception {
utility = new HBaseTestingUtility();
utility.startMiniCluster();
}
效果很好。但是,我无法在正在测试的代码中连接到此嵌入式群集。在我的代码中:
Configuration config = HBaseConfiguration.create();
try (HBaseAdmin admin = new HBaseAdmin(config))
{
//code which manipulates the data
}
不幸的是,当创建新的HBaseAdmin时,我遇到了ConnectionError异常:
2013-11-21 11:20:35,778 WARN [main-SendThread(0:0:0:0:0:0:0:1:2181)] zookeeper.ClientCnxn(ClientCnxn.java:run(1089) ) - 会话0x0表示服务器空,意外错误,关闭套接字连接并尝试重新连接 java.net.ConnectException:拒绝连接:没有进一步的信息 at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:692) 在org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:350) 在org.apache.zookeeper.ClientCnxn $ SendThread.run(ClientCnxn.java:1068)
当我尝试另一个apporach来创建HBaseAdmin时:
try (HBaseAdmin admin = new HBaseAdmin(HBaseCacheTest.utility.getConfiguration()))
{
//code which manipulates the data
}
它有效(请注意,我在这里通过HBaseCacheTest.utility访问HBaseTestingUtility的实例)。 显然这不是一个好方法,因为我不希望有一个依赖于测试代码的生产代码。
我认为在这里工作的一种方法是在我的生产类中设置配置并在我的测试中使用这个setter方法。 但是,我认为应该有另一种方法连接到使用HBaseTestingUtility创建的嵌入式迷你集群。
有什么想法吗?
答案 0 :(得分:1)
您不应该创建新的Configuration对象,而是使用HBaseTestingUtility提供的对象:
HBaseAdmin admin = testingUtility.getHBaseAdmin();
此外,如果您只需要配置,可以使用以下配置:
testingUtility.getConfiguration()
在我的UT中重新检查它。我使用HBase 0.96-hadoop2
希望这会有所帮助:)