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搜索):

  1. 在solr中创建一个集合(类似于hbasetable)
  2. 索引: 使用 NRT lily 索引器或自定义 mapreduce solr 文档创建器将数据加载为 solr 文档。

    如果您不喜欢 NRT lily 索引器,您可以使用 spark 或 mapreduce 作业与 Solrj 进行索引 例如:Spark Solr: 用于从 Solr 读取数据作为 Spark RDD 并使用 SolrJ 将对象从 Spark 索引到 Solr 的工具。

  3. 数据检索:使用 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;
    

    }

另请参阅

  1. 我在“”中的回答

  2. https://community.hortonworks.com/articles/7892/spark-dataframe-to-solr-cloud-runs-on-sandbox-232.html

注意:我认为弹性搜索也可以实现同样的效果。但根据我的经验,我对 Solr + solrj

很有信心

我看到两种可能性:

  1. Livy REST Server - 由 Cloudera 创建的新 REST 服务器。您可以以 REST 方式提交 Spark 作业。它是由最大的大数据/Spark 公司之一的 Cloudera 新开发的,因此很有可能在未来开发,而不是放弃
  2. 您可以 运行 Spark Thrift 服务器并像通过 JDBC 连接到普通数据库一样连接。 Here 你有文档。工作流程:读取数据,预处理,然后由 Spark Thrift 服务器共享

如果您想将第三方应用程序与 Spark 隔离,您可以创建简单的应用程序,该应用程序将具有用户友好的端点,并将端点收到的查询转换为 Livy-Spark 作业或将要使用的 SQL使用 Spark Thrift 服务器