HBase PrivilegedExceptionAction runAs thread?

时间:2018-04-20 15:42:42

标签: java thread-safety hbase

我有用于获取的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客户端(基于请求的函数调用)。

1 个答案:

答案 0 :(得分:1)

此代码中的线程在“ MyHBaseService.getUserHBase()。runAs ”中运行。但是如果它是异步运行的,那么在正确执行它之前,程序将返回“bos.toByteArray();”,因为它在runAs()之外。因此,在执行完整函数之前,它将返回输出。

我认为这就是空值的原因。