我正在寻找处理来自大型索引的并行数据的方法, 我想到快照索引(到hdfs)然后提交spark作业来处理记录。
解决问题的其他方法是使用elastic with spark。
我的问题:
------ ------ EDIT
我的指数有点变化,有狗指数,狗关系指数。 狗指数:
...
{
name: "rex",
id: 1,
...
},
{
name: "bobby",
id : 2,
...
}
...
狗关系指数:
...
{
first_dog_id: 1,
second_dog_id: 2,
relation_type: "enemies",
...
}
...
这种关系是多对多的,所以每只狗在狗关系指数中可以有很多文件。我想创建2个RDD(狗和关系)并以某种方式将它们连接到内存而不广播数据(大型索引)
答案 0 :(得分:0)
Pt 1。
我不这么认为,AFAIK最接近的选择是使用扫描/滚动API(取决于你所使用的ES版本):ES v5.1 scroll api。 你可以出口'你的索引到那个文本文件。
Pt 2。
最简单的方法 - 代码方式 - 做你想要的(每个狗文档的弹性搜索查询),将使用elastic-hadoop加载你的dogRDD,然后为子查询行为,做类似的事情:
dogsRDD.mapPartitions { dogsPart =>
// this code is executed by the workers
dogsPart.map { dog =>
// do the dog specific ES queries here
}
}
但是,您无法使用elastic-hadoop
来执行此类狗专用工作,您必须使用scala ES连接器或HTTP,以及ES扫描/ scroll api。
您可能能够通过更具体的用例知识对此进行改进,也许您可以将工作分成多个可管理的步骤idk。
可能在你的生命周期的后期没有帮助,但我想以最具建设性的方式做一些观察:
我显然不清楚所有细节,但是,你用相关术语推断你的文件表明现有的数据模型会引起更多的麻烦。 ES没有加入。
考虑通过在写入时执行某些聚合,使查询时的生活更轻松
在行间阅读,听起来你有一个大指数?如果合适,您可以更好地拆分成更小的索引。我使用基于时间的索引取得了成功。即每日或每月的指数,具体取决于数据量。
同样,可能不是很有帮助,但是当您使用的数据适合群集的内存时,Spark可以做得最好,或者可以将作业合理地分解为,例如,基于时间的'碎片&#39 ;.或者可以通过将每个步骤的输出写入磁盘以释放内存来中断作业。我知道这一切都取决于用例!
ElasticSearch主要用例是查询,根据我的经验,它不适合批量/批量处理用例。
只是想我分享一些我的发现,以防它在某种程度上有用。 :)