我有用于获取的HBase代码(虽然我没有使用Kerberos,但我打算稍后再使用它,所以我想确保在连接和执行Put或Get时正确处理用户凭据)。
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
MyHBaseService.getUserHBase().runAs(new PrivilegedExceptionAction<Object>() {
@Override
public Object run() throws Exception {
Connection connection = null;
Table StorageTable = null;
List<hFile> HbaseDownload = new ArrayList<>();
try {
// Open an HBase Connection
connection = ConnectionFactory.createConnection(MyHBaseService.getHBaseConfiguration());
Get get = new Get(Bytes.toBytes("filenameCell"));
Result result = table.get(get);
byte[] data = result.getValue(Bytes.toBytes(MyHBaseService.getDataStoreFamily()), Bytes.toBytes(MyHBaseService.getDataStoreQualifier()));
bos.write(data, 0, data.length);
bos.flush();
...
}
});
// now get the outputstream.
// I am assuming byteArrayStream is synchronized and thread-safe.
return bos.toByteArray();
但是,我不确定这是运行异步还是同步线程。
问题:
我用:
Get get = new Get(Bytes.toBytes("filenameCell"));
Result result = table.get(get);
在此run()
函数中。但是为了从run()
线程获取信息,我在new ByteOutputArrayStream
外使用run()
OUTSIDE。 ByteOutputArrayStream.write
&amp; ByteOutputArrayStream.flush
内的run()
。然后toByteArray()
从函数中获取HBase
内容的二进制字节。这会导致返回空字节,所以也许我没有这样做。
但是,我很难找到HBase
Java API的好例子来做这些事情,似乎没有人像我一样使用runAs。这太奇怪了。
我在Web App中运行HBase 1.2.5客户端(基于请求的函数调用)。
答案 0 :(得分:1)
此代码中的线程在“ MyHBaseService.getUserHBase()。runAs ”中运行。但是如果它是异步运行的,那么在正确执行它之前,程序将返回“bos.toByteArray();”,因为它在runAs()之外。因此,在执行完整函数之前,它将返回输出。
我认为这就是空值的原因。