我目前使用 Solr 作为 NoSQL 数据库。我索引了各种类型的文档,有时它们之间存在关系。
对于新的用例,我必须执行 Solr 不支持的等价连接。
我想知道是否有一种方法可以向 hadoop 提交 map-reduce 作业,然后 hadoop 可以从 Solr 中提取数据并执行连接。
我在寻找:
- 讨论
- 执行此操作的现有开源项目
- 示例代码
- 或批评告诉我这既不容易做到,也不能在一般情况下做到。
提前致谢。
你有两个基本的选择。
1) 使用 SOLR REST API 通过同时发出大量请求来手动加入记录。
此策略将要求您使用 SOLR 记录 ID 或查询术语定义映射器,然后针对 SOLR 集群运行所有映射器。如果您发送带有超时的同步请求,并且有一个性能合理的 solr 集群,那么可以根据需要将记录写入您的减速器。
2)直接在您的映射器中读取 SOLR 核心索引,并进行减少侧连接。
这可能会稍微困难一些。因为每个核心都被索引并写入分层文件夹结构,所以您必须在映射器 setup() 方法中包含一些可能从给定核心读取元数据的逻辑。此外,当然,您可能必须将所有内核放入 HDFS。但是,一旦您使用现有的 SOLR Java 索引阅读器 API 解析了 SOLR 输入,就很容易将这些输入正确地发送到您的 reducer 以进行标准的 reduce 侧连接。
3) 如果一个小数据集 (< 1G) 正在连接到另一个大数据集,您可以通过发出 REST 查询将其读入,并将其作为一个大的、丑陋的、静态可用的对象缓存在内存中,或者将其数据存储在分布式缓存作为文件。您甚至可以简单地在映射器的 setup() 部分发出查询,并在每个实例本地缓存它们。
无论如何:在 SOLR 中加入数据并不是特别容易。您寻求的任何解决方案都会有缺点。正确的解决方案是重做 SOLR 索引,使它们充分非规范化,并使用标准 map/reduce、HIVE 或 PIG 等工具进行连接。