[英]Index large amount of data into elasticsearch
我在HBase中拥有超过60亿个社交媒体数据(包括内容/时间/作者和其他可能的字段),在48个服务器中有4100个区域,我现在需要将这些数据刷新到Elasticsearch中。
我对ES的批量API很清楚,并且在Java中使用MapReduce批量使用仍然需要花费很多天(至少一周左右)。 我可以改用spark,但我认为不会有太大帮助。
我想知道是否还有其他技巧可以将这些大数据写入ElasticSearch? 像手动写入es索引文件并使用某种恢复将文件加载到本地文件系统中一样?
感谢任何可能的建议,谢谢。
==============
有关集群环境的一些详细信息:
spark 1.3.1独立(我可以在纱线上更改它以使用Spark 1.6.2或1.6.3)
Hadoop 2.7.1(HDP 2.4.2.258)
ElasticSearch 2.3.3
AFAIK Spark是从以下2个选项中进行索引的最佳选择。 以下是我提供的方法:
ID建议使用不同的搜索条件创建多个Spark / Mapreduce作业(根据类别或其他内容将60亿个社交媒体数据分为6部分)并并行触发它们。 例如,基于数据捕获时间范围(scan.setTimeRange(t1,t2))或具有一些模糊行逻辑(FuzzyRowFilter)的速度,肯定可以加快速度。
要么
您还可以考虑在通过spark或mapreduce插入数据时同时为它们创建索引。
例如,在SOLR的情况下, clouder具有NRT hbase lily indexer ...,即当同时基于WAL(预写日志)条目填充hbase表时,它将创建solr索引。 检查弹性搜索是否有类似的东西。
即使它也不适合ES,也不必费心,而使用Spark / Mapreduce程序自行提取数据时,您可以自己创建。
ID建议如果您对Spark没问题,那是一个很好的解决方案。Spark支持hadoop 2.1中ES的本机集成。 看到
elasticsearch-hadoop以RDD(弹性分布式数据集)(准确地说是Pair RDD)的形式提供了Elasticsearch和Apache Spark之间的本机集成,可以从Elasticsearch读取数据。 RDD有两种形式:一种用于Scala(将数据作为带有Scala集合的Tuple2返回),另一种用于Java(将数据作为包含java.util集合的Tuple2返回)。
将数据写入Elasticsearch借助elasticsearch-hadoop,Map / Reduce作业可以将数据写入Elasticsearch,使其可通过索引进行搜索。 elasticsearch-hadoop支持(所谓的)旧的和新的Hadoop API。
我发现了一个提高自己的大容量索引性能的实用技巧。
我可以在客户端中计算哈希路由,并确保每个批量请求都包含具有相同路由的所有索引请求。 根据路由结果和ip的分片信息,我将批量请求直接发送到相应的分片节点。 此技巧可以避免大量重新路由的成本,并减少可能导致EsRejectedException的大量请求线程池占用。
例如,我在不同的计算机上有48个节点。 假设我将包含3000个索引请求的批量请求发送到任何节点,这些索引请求将根据路由重新路由到其他节点(通常是所有节点)。 客户端线程必须等待整个过程完成,包括处理本地批量和等待其他节点的批量响应。 但是,没有重新路由阶段,网络成本就消失了(转发到副本节点除外),客户端只需等待更少的时间。 同时,假设我只有1个副本,则批量线程的总占用仅为2个。 (客户端->主碎片和主碎片->复制碎片)
路由哈希:
shard_num = murmur3_hash (_routing)%num_primary_shards
尝试看一下: org.elasticsearch.cluster.routing.Murmur3HashFunction
客户端可以根据对Cat api的请求获得分片和索引别名。
碎片信息网址: 猫碎片
别名映射网址: cat别名
注意事项:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.