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索引中...
  • quicknet
  • quicknet
  • 2014年12月24日 03:54
  • 4485

elasticsearch bulk操作

Elasticsearch Bulk Index JSON Data 我想尝试 buld index 一个json文件到一个新的Elasticsearch index 但是不能这么做,我有下面的j...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2017年02月02日 10:33
  • 865

亿级规模的Elasticsearch优化实战

本次分享主要包含两个方面的实战经验:索引性能和查询性能。 一. 索引性能(Index Performance) 首先要考虑的是,索引性能是否有必要做优化? 索引速度提高...
  • opensure
  • opensure
  • 2015年08月13日 19:43
  • 54069

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

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

RabbitMQ (四) 路由选择 (Routing)

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

控制Elasticsearch分片和副本的分配

ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本。通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题。不能运...
  • xtjsxtj
  • xtjsxtj
  • 2016年01月12日 09:25
  • 11612

elasticsearch的路由选择

集群介绍: cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这...
  • CCTV_End
  • CCTV_End
  • 2016年04月13日 18:55
  • 1456

Elasticsearch的路由(Routing)特性

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

ElasticSearch里面的路由功能介绍

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

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

索引分片分配能够控制索引分片在节点上怎么分布,那对于具体的文档能否控制具体节点的分布呢?答案是可以,根据路由公式shard = hash(routing) % number_of_primary_sh...
  • changong28
  • changong28
  • 2014年08月07日 22:56
  • 6563
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:elasticsearch 自定义hash function (routing)
举报原因:
原因补充:

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