我目前正在使用solr作为nosql数据库。我已经索引了各种类型的文档,它们之间有时有关系。对于新的用例,我必须执行solr不支持的join。我想知道是否有一种方法可以向hadoop提交map reduce作业,hadoop可以从solr中提取数据并执行连接。我正在寻找:讨论现有的开源项目示例代码或者一个批评告诉我这不是容易做到的,或者在一般情况下。提前谢谢。注意:我在这里看到一些关于相关或类似主题的问题:这里,这里和这里,但我没有得到我想要的。
disho6za1#
你有两个基本的选择。1) 使用solr restapi通过同时发出大量请求来手动连接记录。此策略要求您使用solr记录id或查询项定义Map器,然后针对solr集群运行所有Map器。如果您发送带有超时的同步请求,并且拥有一个性能合理的solr集群,那么可以根据需要将记录写入您的reducer。2) 直接在Map器中读取solr核心索引,并执行reduce-side连接。这可能会稍微困难一些。因为每个核心都被编入索引并写入一个层次文件夹结构,所以在mapper setup()方法中必须有一些逻辑,这些逻辑可能从给定的核心读取元数据。当然,您可能还需要将所有内核都放入hdfs中。但是,一旦您使用现有的solrjava索引读取器api解析了solr输入,就可以很容易地将它们正确地发送到您的reducer中,以实现标准的reduce-side连接。3) 如果一个小数据集(<1g)正在连接到另一个大数据集,您可以通过发出rest查询将其读入,并将其作为一个大的、丑陋的、静态可用的对象缓存在内存中,或者将其数据作为文件存储在分布式缓存中。您甚至可以在Map器的setup()部分发出查询,并在每个示例本地缓存它们。无论如何:在solr中连接数据并不是特别容易。你选择的任何解决方案都有缺点。正确的解决方案是重做solr索引,使它们充分非规范化,并使用标准map/reduce、hive或pig等工具进行连接。
1条答案
按热度按时间disho6za1#
你有两个基本的选择。
1) 使用solr restapi通过同时发出大量请求来手动连接记录。
此策略要求您使用solr记录id或查询项定义Map器,然后针对solr集群运行所有Map器。如果您发送带有超时的同步请求,并且拥有一个性能合理的solr集群,那么可以根据需要将记录写入您的reducer。
2) 直接在Map器中读取solr核心索引,并执行reduce-side连接。
这可能会稍微困难一些。因为每个核心都被编入索引并写入一个层次文件夹结构,所以在mapper setup()方法中必须有一些逻辑,这些逻辑可能从给定的核心读取元数据。当然,您可能还需要将所有内核都放入hdfs中。但是,一旦您使用现有的solrjava索引读取器api解析了solr输入,就可以很容易地将它们正确地发送到您的reducer中,以实现标准的reduce-side连接。
3) 如果一个小数据集(<1g)正在连接到另一个大数据集,您可以通过发出rest查询将其读入,并将其作为一个大的、丑陋的、静态可用的对象缓存在内存中,或者将其数据作为文件存储在分布式缓存中。您甚至可以在Map器的setup()部分发出查询,并在每个示例本地缓存它们。
无论如何:在solr中连接数据并不是特别容易。你选择的任何解决方案都有缺点。正确的解决方案是重做solr索引,使它们充分非规范化,并使用标准map/reduce、hive或pig等工具进行连接。