应用程序大数据传输 - 中间的HBase服务

时间:2016-12-13 21:04:53

标签: java rest sockets hbase rpc

我在HBase中有一个存储数十亿行的表。有一点"智能"在行键设计和数据读写方式。例如:行键以salt为前缀,Reads使用自定义HBase过滤器,有一些多线程可以并行执行多个扫描......

多个应用程序将使用此数据。我看到了几个选项:

  1. 实施"情报"在每个客户端应用程序中,使这些客户端应用程序直接使用HBase API来访问数据。在多个客户端应用程序中复制智能看起来像是一件坏事,因为如果有一点智能就会很难维护。
  2. 实施一个库到"封装"这种智能并使客户端应用程序使用此库。同样,如果智能发生变化,如何确保所有客户端应用程序都使用库的最新版本
  3. 在(微)服务中实施此智能。所有客户端应用程序都将通过此服务访问HBase数据。对我来说,这是最好的解决方案。如果情报发生变化,我只需更改此服务中的代码即可(只要与客户端应用程序的接口不受影响)。
  4. 所以我想第三个选择。但是,客户端应用程序在单个调用中可以读取的数据量可能涉及数百万条记录。如何使客户端应用程序和服务高效通信?我觉得REST服务适用于少量数据。我想我需要一种流式策略,服务在从HBase中提取数据时将数据发送到客户端应用程序。我想我不应该在服务中提取整个数据集,然后将其发送到客户端。这会导致内存不足。

    到目前为止,我的策略是"低水平"。我使用Java套接字。该服务具有等待客户端套接字的ServerSocket。当客户端应用程序想要读取时,会创建套接字通信。客户端应用程序通过套接字通信将搜索条件发送到服务。然后,该服务检索与搜索条件匹配的数据。该服务在从HBase接收数据(使用经典HBase API提取)时,动态地将数据写入套接字的输出流(使用DataOutputStream和BufferedOutputStream)。另一方面,客户端应用程序读取套接字输入流并解码数据。为了不用这种低级套接字处理来打扰客户端应用程序代码,我创建了一个库来封装"这一点。

    你怎么看?这是正确的方法吗?它是否太低"低水平"?是否有较少的"低水平"您可以建议将大量数据从应用程序传输到应用程序,同时保持良好的性能(REST,RMI,RPC,...)?

0 个答案:

没有答案