ElasticSearch-River-Kafka实现动态Index、Type数据同步

背景

我们在做大数据的项目时经常遇到数据同步的问题,kafka到es是一个比较常见的数据同步管道。有这样的一个需求,kafka入es的过程中,我们需要达到如下效果:kafka中同一个topic数据流可以动态的插入到es不同的type里面,当然,它们是同一个index。什么叫动态插入?举个例子:譬如我们按照时间来切分type,每个小时为单位,那么,在三点到四点之间,数据就会同步到type为2018011003里面,在四点到五点之间,数据就会同步到type为2018011004里面。将这个需求往深处想的话,同样,是不是可以实现动态index插入呢?答案是可以的。

实现原理

river这个es插件大家不知道听过没,我们可以利用river实现该功能。网上有很多现成的开源插件elasticsearch-river-kafka,它们都有个共同点就是只能静态的同步数据。这里的静态指的是不能动态生成index和type。所以,我们基于开源库elasticsearch-river-kafka,可以自己动手修改代码,来实现我们想要的功能。而且,这个插件本身就是支持自定义开发的。

步骤

kafka:v0.10
elasticsearch:v1.7.0

一:代码库地址

github:elasticsearch-river-kafka
我是fork别人的开源项目,在此基础上自己修改的代码,原项目地址

二:安装该插件

  • 方式一
    去你安装elasticsearch的机器上,找到es下的bin目录执行安装插件命令
cd $ELASTICSEARCH_HOME
./bin/plugin --install <plugin-name> --url https://github.com/zhuyinglinfeng/elasticsearch-river-kafka/archive/master.zip
  • 方式二
    如果你本地已经clone了该项目,直接本地编译打包,然后把zip包发送到安装elasticsearch的机器上面,再执行安装插件命令
cd $ELASTICSEARCH_HOME
./bin/plugin --install <plugin-name> --url file:<zip_path>

三:配置river(这个是重点哦)

一条river代表着一条同步规则,创建river很简单,执行如下的命令即可

curl -XPUT 'localhost:9200/_river/<river-name>/_meta' -d '
{
     "type" : "kafka",
     "kafka" : {
        "zookeeper.connect" : <zookeeper.connect>, 
        "zookeeper.connection.timeout.ms" : <zookeeper.connection.timeout.ms>,
        "topic" : <topic.name>,
        "message.type" : <message.type>
    },
    "index" : {
        "index" : <index.name>,
        "frequency.index" : <frequency.index>,
        "type" : <mapping.type.name>,
        "frequency.type" : <frequency.type>,
        "bulk.size" : <bulk.size>,
        "concurrent.requests" : <concurrent.requests>,
        "action.type" : <action.type>,
        "flush.interval" : <flush.interval>
    },
    "statsd" : {
        "host" : <statsd.host>,
        "prefix" : <statsd.prefix>,
        "port" : <statsd.port>,
        "log.interval" : <statsd.log.interval>
    }
 }'
参数名字 是否必填 默认值 描述
river-name 名字
zookeeper.connect localhost zoo的地址
zookeeper.connection.timeout.ms 10000 zoo连接超时时间
topic elasticsearch-river-kafka topic名字
message.type json kafka消息类型,json/string
index kafka-index ES索引
frequency.index 动态索引切分频率,1mon/1day/1hour/10min
type status ES类型
frequency.type 动态类型切分频率,1mon/1day/1hour/10min
bulk.size 100 单次处理的消息数量
concurrent.requests 1 并发请求数
action.type index 同步行为,index(插入)/delete(删除)/raw.execute(执行语句)
host localhost statsd服务地址
port 8125 statsd端口
prefix kafka-river statsd键值前缀
log.interval 10 statsd上报metrics时间间隔

Note:
如果填写了frequency.index参数,表示index根据时间动态创建,index参数可以不用填写,即使填写也不会生效
如果填写了frequency.type参数,表示type根据时间动态创建,type参数可以不用填写,即使填写也不会生效

Example:
将kafka中topic名字为topic-test流中的数据同步到index为index-test里面,并且每隔10min动态切换type类型

curl -XPUT 'localhost:9200/_river/river-test/_meta' -d '
{
    "type": "kafka",
    "kafka": {
        "zookeeper.connect": "localhost",
        "zookeeper.connection.timeout.ms": 10000,
        "topic": "topic-test",
        "message.type": "json"
    },
    "index": {
        "index": "index-test",
        "frequency.type”: "10min",
        "bulk.size": 100,
        "concurrent.requests": 1,
        "action.type": "index",
        "flush.interval": "5s"
    }
}'

四:重启elasticsearch

查询进程号:ps -ef | grep elastic
关闭进程:kill -9 pid
启动:./bin/elasticsearch -d

五:验证

到此为止,理论上已经全部完成,现在可以往kafka中写数据了,不出意外,如果你的<flush.interval>参数设置很短的话,几秒后es中就可以查看数据了

升级维护

  • 插件删除
./bin/plugin --remove <plugin-name>
  • 删除river
    和删除elasticsearch数据方式一样,利用es提供的接口命令删除即可
curl -XDELETE 'localhost:9200/_river/river-test/'
  • 代码升级
    如果你想要手动改写代码,也很简单,fork一下代码库,自己本地升级代码,然后按照上面的步骤就可以

自定义elasticsearch-river-kafka开发

......待完善

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 概述 监控预警平台, eagle + eye (鹰眼)的合体词, 寓意可以快速发现问题, 并及时作出响应,Eagl...
    Kungfu猫熊阅读 7,360评论 0 52
  • 创城工作结束了额 又迎来了十九大工作 加不完的班 整不完的材料 心情超级郁闷 见人就想骂 一肚子火 即便这样工作也...
    一朵太阳花shl阅读 142评论 0 0
  • “宝贝蛋子,下午咱练歌吧,好久没唱了,都没气唱了都”。“好,我陪你练”!“你先唱我pk你可以吗”。“好啊”!“那我...
    宝宝的宝贝蛋子阅读 294评论 2 1
  • 2017年4月19日23时55分,当我第一次从刘润老师的《五分钟商学院》中看到这个概念,就被其深深震撼,耐心读了三...
    飘舞的星空阅读 1,481评论 0 2