我在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
答案 0 :(得分:2)
AFAIK Spark是索引以下2个选项的最佳选择。 以及以下是我提供的方法:
我建议使用不同的搜索条件创建多个Spark / Mapreduce作业(根据类别或其他内容将60亿个社交媒体数据分成6个部分)并并行触发它们。 例如,基于数据捕获时间范围(scan.setTimeRange(t1,t2))或者使用一些模糊行逻辑(FuzzyRowFilter),绝对应该加快速度。
OR
您还可以考虑在通过spark或mapreduce插入数据时,可以同时为它们创建索引。
例如在SOLR的情况下: clouder有NRT hbase lily indexer ...即,当hbase表基于WAL(预先写入日志)条目同时填充时,它将创建solr索引。检查任何有弹性搜索的东西。
即使它不适用于ES,也不必费心,使用Spark / Mapreduce程序自行摄取数据,您可以自己创建。
我建议如果你对火花没问题,这是一个很好的解决方案 Spark支持hadoop 2.1的ES本机集成。 见
答案 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
有些注意事项: