REST API 用于处理存储在 hbase 中的数据
REST API for processing data stored in hbase
我在 hbase store 中有很多这样的记录(百万条)
key = user_id:service_id:usage_timestamp value = some_int
这意味着用户在 [= 为 some_int 使用了一些 service_id 34=]。
现在我想提供一些休息时间 api 来汇总这些数据。例如 "find sum of all values for requested user" 或 "find max of them" 等。所以我正在寻找最佳实践。简单的 java 应用程序不符合我的性能预期。
我目前的方法 - 通过 apache spark 应用程序聚合数据,看起来不错,但在 java rest api 中使用它存在一些问题,因为 spark 不支持请求-响应模型(我也查看了 spark-job-server,看起来原始且不稳定)
谢谢,
有什么想法吗?
如果您使用的是 Cloudera(即 Cloudera 搜索),我会提供 Hbase + Solr
Solrj api 用于聚合数据(而不是 spark),与休息服务交互
Solr解决方案(在cloudera中其Cloudera搜索):
- 在solr中创建一个集合(类似于hbasetable)
索引: 使用 NRT lily 索引器或自定义 mapreduce solr 文档创建器将数据加载为 solr 文档。
如果您不喜欢 NRT lily 索引器,您可以使用 spark 或 mapreduce 作业与 Solrj 进行索引 例如:Spark Solr:
用于从 Solr 读取数据作为 Spark RDD 并使用 SolrJ 将对象从 Spark 索引到 Solr 的工具。
数据检索:使用 Solrj 从您的网络服务调用中获取 solr 文档。
在 Solrj 中,
有FieldStatInfo可以实现Sum,Max等....
有 Facets 和 Facetpivots 来分组数据
rest支持分页API调用
您可以将 solr 结果与 Jersey 或其他一些 Web 服务集成,因为我们已经以这种方式实现了。
/**This method returns the records for the specified rows from Solr Server which you can integrate with any rest api like jersey etc...
*/
public SolrDocumentList getData(int start, int pageSize, SolrQuery query) throws SolrServerException {
query.setStart(start); // start of your page
query.setRows(pageSize);// number of rows per page
LOG.info(ClientUtils.toQueryString(query, true));
final QueryResponse queryResponse = solrCore.query(query, METHOD.POST); // post is important if you are querying huge result set Note : Get will fail for huge results
final SolrDocumentList solrDocumentList = queryResponse.getResults();
if (isResultEmpty(solrDocumentList)) { // check if list is empty
LOG.info("hmm.. No records found for this query");
}
return solrDocumentList;
}
另请参阅
注意:我认为弹性搜索也可以实现同样的效果。但根据我的经验,我对 Solr + solrj
很有信心
我看到两种可能性:
- Livy REST Server - 由 Cloudera 创建的新 REST 服务器。您可以以 REST 方式提交 Spark 作业。它是由最大的大数据/Spark 公司之一的 Cloudera 新开发的,因此很有可能在未来开发,而不是放弃
- 您可以 运行 Spark Thrift 服务器并像通过 JDBC 连接到普通数据库一样连接。 Here 你有文档。工作流程:读取数据,预处理,然后由 Spark Thrift 服务器共享
如果您想将第三方应用程序与 Spark 隔离,您可以创建简单的应用程序,该应用程序将具有用户友好的端点,并将端点收到的查询转换为 Livy-Spark 作业或将要使用的 SQL使用 Spark Thrift 服务器
我在 hbase store 中有很多这样的记录(百万条)
key = user_id:service_id:usage_timestamp value = some_int
这意味着用户在 [= 为 some_int 使用了一些 service_id 34=]。
现在我想提供一些休息时间 api 来汇总这些数据。例如 "find sum of all values for requested user" 或 "find max of them" 等。所以我正在寻找最佳实践。简单的 java 应用程序不符合我的性能预期。
我目前的方法 - 通过 apache spark 应用程序聚合数据,看起来不错,但在 java rest api 中使用它存在一些问题,因为 spark 不支持请求-响应模型(我也查看了 spark-job-server,看起来原始且不稳定)
谢谢,
有什么想法吗?
如果您使用的是 Cloudera(即 Cloudera 搜索),我会提供 Hbase + Solr
Solrj api 用于聚合数据(而不是 spark),与休息服务交互
Solr解决方案(在cloudera中其Cloudera搜索):
- 在solr中创建一个集合(类似于hbasetable)
索引: 使用 NRT lily 索引器或自定义 mapreduce solr 文档创建器将数据加载为 solr 文档。
如果您不喜欢 NRT lily 索引器,您可以使用 spark 或 mapreduce 作业与 Solrj 进行索引 例如:Spark Solr: 用于从 Solr 读取数据作为 Spark RDD 并使用 SolrJ 将对象从 Spark 索引到 Solr 的工具。
数据检索:使用 Solrj 从您的网络服务调用中获取 solr 文档。 在 Solrj 中,
有FieldStatInfo可以实现Sum,Max等....
有 Facets 和 Facetpivots 来分组数据
rest支持分页API调用
您可以将 solr 结果与 Jersey 或其他一些 Web 服务集成,因为我们已经以这种方式实现了。
/**This method returns the records for the specified rows from Solr Server which you can integrate with any rest api like jersey etc... */ public SolrDocumentList getData(int start, int pageSize, SolrQuery query) throws SolrServerException { query.setStart(start); // start of your page query.setRows(pageSize);// number of rows per page LOG.info(ClientUtils.toQueryString(query, true)); final QueryResponse queryResponse = solrCore.query(query, METHOD.POST); // post is important if you are querying huge result set Note : Get will fail for huge results final SolrDocumentList solrDocumentList = queryResponse.getResults(); if (isResultEmpty(solrDocumentList)) { // check if list is empty LOG.info("hmm.. No records found for this query"); } return solrDocumentList;
}
另请参阅
注意:我认为弹性搜索也可以实现同样的效果。但根据我的经验,我对 Solr + solrj
很有信心我看到两种可能性:
- Livy REST Server - 由 Cloudera 创建的新 REST 服务器。您可以以 REST 方式提交 Spark 作业。它是由最大的大数据/Spark 公司之一的 Cloudera 新开发的,因此很有可能在未来开发,而不是放弃
- 您可以 运行 Spark Thrift 服务器并像通过 JDBC 连接到普通数据库一样连接。 Here 你有文档。工作流程:读取数据,预处理,然后由 Spark Thrift 服务器共享
如果您想将第三方应用程序与 Spark 隔离,您可以创建简单的应用程序,该应用程序将具有用户友好的端点,并将端点收到的查询转换为 Livy-Spark 作业或将要使用的 SQL使用 Spark Thrift 服务器