我在HBase中有一个存储数十亿行的表。有一点"智能"在行键设计和数据读写方式。例如:行键以salt为前缀,Reads使用自定义HBase过滤器,有一些多线程可以并行执行多个扫描......
多个应用程序将使用此数据。我看到了几个选项:
所以我想第三个选择。但是,客户端应用程序在单个调用中可以读取的数据量可能涉及数百万条记录。如何使客户端应用程序和服务高效通信?我觉得REST服务适用于少量数据。我想我需要一种流式策略,服务在从HBase中提取数据时将数据发送到客户端应用程序。我想我不应该在服务中提取整个数据集,然后将其发送到客户端。这会导致内存不足。
到目前为止,我的策略是"低水平"。我使用Java套接字。该服务具有等待客户端套接字的ServerSocket。当客户端应用程序想要读取时,会创建套接字通信。客户端应用程序通过套接字通信将搜索条件发送到服务。然后,该服务检索与搜索条件匹配的数据。该服务在从HBase接收数据(使用经典HBase API提取)时,动态地将数据写入套接字的输出流(使用DataOutputStream和BufferedOutputStream)。另一方面,客户端应用程序读取套接字输入流并解码数据。为了不用这种低级套接字处理来打扰客户端应用程序代码,我创建了一个库来封装"这一点。
你怎么看?这是正确的方法吗?它是否太低"低水平"?是否有较少的"低水平"您可以建议将大量数据从应用程序传输到应用程序,同时保持良好的性能(REST,RMI,RPC,...)?