【问题标题】:How to join RDDs based on elastic-hadoop如何基于 elastic-hadoop 加入 RDD
【发布时间】:2017-05-23 23:04:29
【问题描述】:

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

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

我的问题:

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

-----编辑------

我的索引发生了一点变化,有 Dogs 索引,一个与狗的关系索引。 狗指数:

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

狗关系指数:

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

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

【问题讨论】:

  • 关于2.,我想我会先将狗数据和骨骼数据读入Spark中的内存,而不是每次给狗一根骨头时都敲ES。
  • @ImDarrenG 如何在内存中合并这两个列表?如何在第一个 RDD 的分区上运行并在第二个 RDD 上查询?
  • 我的第一个直觉是通过某个键加入 RDD,但假设这不起作用,请提供有关您的用例的更多信息,否则我们只是在猜测?
  • @ImDarrenG,我更新了问题..
  • 有多少数据 - 太多数据无法放入 Spark 集群的内存中?您想通过 Spark 工作实现什么目标?

标签: hadoop apache-spark elasticsearch hdfs bigdata


【解决方案1】:

第 1 点。

我不这么认为,AFAIK 最接近的选择是使用扫描/滚动 API(取决于您使用的 ES 版本):ES v5.1 scroll api。 您可以通过这种方式将索引“导出”到文本文件。

第 2 点。

最简单的方法 - 代码方面 - 做你想做的事(每个狗文档的弹性搜索查询)是使用 elastic-hadoop 加载你的 dogsRDD,然后对于子查询行为,执行如下操作:

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 扫描/滚动 api。

您可能能够通过对您所拥有的用例的更具体的了解来改进这一点,也许您可​​以将工作拆分为多个可管理的步骤 idk。

在你生命周期的后期可能没有帮助,但我想以最具建设性的方式提出一些意见:

  • 我显然不知道所有细节,但是,您正在用关系术语对您的文档进行推理,这表明现有的数据模型将引起更多的麻烦。 ES 不做连接。

  • 考虑通过在写入时执行一些聚合来简化查询时的工作

  • 字里行间,听起来你有一个大索引?如果合适,您可能会更好地拆分成更小的索引。我已经成功使用基于时间的索引。即每天或每月的索引,具体取决于数据量。

  • 同样,可能不是很有帮助,但是当您使用的数据适合集群的内存时,Spark 表现最好,或者可以将作业合理地分解为(例如,基于时间的“碎片”)。或者可以通过将每个步骤的输出写入磁盘来释放内存来分解工作。我知道这完全取决于用例!

  • ElasticSearch 的主要用例是查询,根据我的经验,它不适用于批处理/批量处理用例。

只是想我会分享一些我的发现,以防它在一些小方面有用。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2014-08-29
    • 1970-01-01
    • 2018-12-04
    • 2014-11-20
    • 2023-03-13
    相关资源
    最近更新 更多