如何基于elastic-hadoop

时间:2017-01-09 16:13:59

标签: hadoop apache-spark elasticsearch hdfs bigdata

我正在寻找处理来自大型索引的并行数据的方法, 我想到快照索引(到hdfs)然后提交spark作业来处理记录。

解决问题的其他方法是使用elastic with spark

我的问题:

  1. 快照API输出可以是文本文件而不是二进制文件吗?
  2. 如何使用spark-elastic并对特定文档执行子查询? (假设我有狗的索引,然后我想找到每条狗的骨头)?
  3. ------ ------ EDIT

    我的指数有点变化,有狗指数,狗关系指数。 狗指数:

    ...
    {
      name: "rex",
      id: 1,
      ...
    },
    {
      name: "bobby",
      id : 2,
      ...
    }
    ...
    

    狗关系指数:

    ...
    {
       first_dog_id: 1,
       second_dog_id: 2,
       relation_type: "enemies",
       ...
    }
    ...
    

    这种关系是多对多的,所以每只狗在狗关系指数中可以有很多文件。我想创建2个RDD(狗和关系)并以某种方式将它们连接到内存而不广播数据(大型索引)

1 个答案:

答案 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主要用例是查询,根据我的经验,它不适合批量/批量处理用例。

只是想我分享一些我的发现,以防它在某种程度上有用。 :)