将大量数据索引到elasticsearch

时间:2016-12-15 10:43:29

标签: elasticsearch apache-spark indexing mapreduce hbase

我在HBase中拥有超过60亿的社交媒体数据(包括内容/时间/作者和其他可能的领域),48个服务器中有4100个区域,我现在需要将这些数据刷新到Elasticsearch中。

我很清楚ES的批量API,并且使用Java中的批量使用MapReduce仍需要花费很多天(至少一周左右)。我可以使用spark,但我认为它不会有太多帮助。

我想知道是否还有其他技巧可以将这些大数据写入ElasticSearch?比如手动写入es索引文件并使用某种类型的恢复来加载本地文件系统中的文件?

感谢任何可能的建议,谢谢。

==============

有关我的群集环境的一些详细信息:

火花1.3.1独立(我可以在纱线上更改它以使用Spark 1.6.2或1.6.3)

Hadoop 2.7.1(HDP 2.4.2.258)

ElasticSearch 2.3.3

2 个答案:

答案 0 :(得分:2)

AFAIK Spark是索引以下2个选项的最佳选择。 以及以下是我提供的方法:

划分(输入扫描标准)并征服60亿社交媒体数据:

我建议使用不同的搜索条件创建多个Spark / Mapreduce作业(根据类别或其他内容将60亿个社交媒体数据分成6个部分)并并行触发它们。 例如,基于数据捕获时间范围(scan.setTimeRange(t1,t2))或者使用一些模糊行逻辑(FuzzyRowFilter),绝对应该加快速度。

OR

一种流媒体方式:

您还可以考虑在通过spark或mapreduce插入数据时,可以同时为它们创建索引。

例如在SOLR的情况下: clouder有NRT hbase lily indexer ...即,当hbase表基于WAL(预先写入日志)条目同时填充时,它将创建solr索引。检查任何有弹性搜索的东西。

即使它不适用于ES,也不必费心,使用Spark / Mapreduce程序自行摄取数据,您可以自己创建。

选项1:

我建议如果你对火花没问题,这是一个很好的解决方案 Spark支持hadoop 2.1的ES本机集成。 见

  

elasticsearch-hadoop provides native integration between Elasticsearch and Apache Spark, in the form of an RDD (Resilient Distributed Dataset) (or Pair RDD to be precise) that can read data from Elasticsearch. The RDD is offered in two flavors: one for Scala (which returns the data as Tuple2 with Scala collections) and one for Java (which returns the data as Tuple2 containing java.util collections).

选项2:你知道比火花慢一点

Writing data to Elasticsearch With elasticsearch-hadoop, Map/Reduce jobs can write data to Elasticsearch making it searchable through indexes. elasticsearch-hadoop supports both (so-called) old and new Hadoop APIs.

答案 1 :(得分:0)

我找到了一个实用的技巧来提高自己的批量索引性能。

我可以计算客户端中的哈希路由,并确保每个批量请求包含具有相同路由的所有索引请求。根据ip的路由结果和分片信息,我直接将批量请求发送到相应的分片节点。这个技巧可以避免批量重新路由成本,并减少可能导致EsRejectedException的批量请求线程池占用。

例如,我在不同的机器上有48个节点。假设我向任何节点发送包含3000个索引请求的批量请求,这些索引请求将根据路由重新路由到其他节点(通常是所有节点)。客户端线程必须等待整个过程完成,包括处理本地批量并等待其他节点的批量响应。但是,如果没有重新路由阶段,网络成本就会消失(除了转发到副本节点),客户端只需要等待更少的时间。同时,假设我只有1个副本,则批量线程的总占用率仅为2。 (client-> primary shard和primary shard - > replica shard)

路由哈希:

  

shard_num = murmur3_hash(_routing)%num_primary_shards

尝试查看:org.elasticsearch.cluster.routing.Murmur3HashFunction

客户端可以通过请求cat apis来获取分片和索引别名。

分片信息网址:cat shards

别名映射网址:cat aliases

有些注意事项:

  1. ES可能会更改不同版本的默认哈希函数,这意味着客户端代码可能与版本不兼容。
  2. 这个技巧是基于哈希结果基本平衡的假设。
  3. 客户端应考虑容错,例如与对应的分片节点的连接超时。