elasticsearch 自定义hash function (routing)

原创 2016年05月31日 16:28:31

本次研究基于elastic search verison 2.1.1

为何想要自定义hash function?

本意是想提高elasticsearch的indexing速度。

具体思路就是:

1.将自己的数据在生成的时候就按照预先设定的routing逻辑分片好。

2.这样真正执行大批量bulk导入的时候,每个bulk里面都是一个shard的数据,就可以直接写到对应的shard,而不需要再分发到不同的shard。

3.减少了大量的网络t通讯开销。


可惜的是,经过实际研究发现,es已经不建议自定义设置hash function:

原文在这里:https://www.elastic.co/guide/en/elasticsearch/reference/2.3/breaking_20_crud_and_routing_changes.html#_routing_hash_function

关键部分如下:

In addition, the following routing-related node settings have been deprecated:

cluster.routing.operation.hash.type
This was an undocumented setting that allowed to configure which hash function to use for routing.murmur3 is now enforced on new indices.
cluster.routing.operation.use_type
This was an undocumented setting that allowed to take the _type of the document into account when computing its shard (default: false). false is now enforced on new indices.

虽然结果是不能自定义,但是研究过程中某些发现,还是值得列出来:


1.elastic search 默认hsah function 为Murmur3HashFunction

   The default hash function that is used for routing has been changed from djb2 to murmur3. This change should be transparent unless you relied on very specific properties of djb2. This will help ensure a better balance of the document counts between shards.

2.elastic search 的源码里面还有两个hash function:

a.simple hash function :就是最简单的string hash,使用的java的默认实现

b.djb2 hash function :应该是es2.0版本以前,一直使用的hash function 

2.es 为啥不建议在去修改默认的hsah function呢?

  只能猜测,就以我的目的来讲,如果我真的自定义了hash function,那么我每个bulk都持续写入一个shard的情况下,必然导致这个shard的load非常高,然后产生大量的segment,进而引起merge 瓶颈,最终效率说不定还不如把数据分发给所有shard来的快。

当然这还需要实际测试和验证。


相关文章推荐

ElasticSearch路由哈希算法的实现

当收到一个建立索引请求时,ElasticSearch首先要做的事就是决定在哪一个shard上对其进行索引。ElasticSearch使用djb2哈希算法对指定或者默认的key进行哈希,然后mod索引中...

Elasticsearch的路由(Routing)特性

Elasticsearch的路由机制与其分片机制有着直接的关系。Elasticsearch的路由机制即是通过哈希算法,将具有相同哈希值的文档...
  • cnweike
  • cnweike
  • 2014年10月14日 16:54
  • 14010

ElasticSearch里面的路由功能介绍

在ElaticSearch里面,路由功能算是一个高级用法,大多数时候我们用的都是系统默认的路由功能,我们知道一个es索引可以分多个shard和每个shard又可以有多个replia,那么现在思考一个问...

Elasticsearch模块功能之-路由(routing)

索引分片分配能够控制索引分片在节点上怎么分布,那对于具体的文档能否控制具体节点的分布呢?答案是可以,根据路由公式shard = hash(routing) % number_of_primary_sh...

RabbitMQ (四) 路由选择 (Routing)

上一篇博客我们建立了一个简单的日志系统,我们能够广播日志消息给所有你的接收者,如果你不了解,请查看:RabbitMQ (三) 发布/订阅。本篇博客我们准备给日志系统添加新的特性,让日志接收者能够订阅...

分布式搜索elasticsearch高级配置之------分片分布规则设置

分片分布是把索引分片分布到节点的过程。这个操作会在初次启动集群,副本分配,负载均衡,或增加删除节点时进行。 下面是一些与分片分布相关的设置: cluster.routing.allocatio...

elasticsearch文档-字段的mapping

原文链接

c++中关于hash_map自定义equal function和hash function

我们知道hash_map是利用hash table实现的一种数据结构,能够快速根据KEY值查找对应的VALUE。hash_map特点是查找快,但是占用内存高,因为hash_map在初始化的时候需要为每...

SQL自定义函数function

用户定义自定义函数像内置函数一样返回标量值,也可以将结果集用表格变量返回。 sql函数必须有返回值。标量函数:返回一个标量值。 表格值函数{内联表格值函数、多表格值函数}:返回行集(即返回多个值)...

SQL Function 自定义函数

转自:http://www.cnblogs.com/xueyuangudiao/archive/2011/08/03/2126580.html 产生背景(已经有了存储过程,为什么还要使用自定...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:elasticsearch 自定义hash function (routing)
举报原因:
原因补充:

(最多只允许输入30个字)