部门要搭建一套druid环境,买的是阿里云的服务
overload使用一台机器,middleManager使用两台机器
其他的查询组件也都部署在这三台机器上
因为这几个节点设计indexService,也就是灌库任务,我们主要关心灌库
下面是灌库过程中遇到的一堆坑
druid灌库会启动hadoop的mr任务,会读s3上数据,会将生成的segment写到deep storage上。
涉及最本质的三个问题:
1.数据从哪来
2.数据在哪计算
3.数据写哪去
阿里提供的druid集群,本身有一套自带的hadoop做mr计算,有自带的hdfs做deep storage
我们这次druid灌库一直都使用这个自带的hadoop和hdfs
1.准备好了灌库脚本和灌库数据,启动灌库命令后立刻报错
这个问题在另一篇文章中详细讨论
2.灌库任务无法连接s3
虽然在家目录的.aws配置了访问s3桶的秘钥,但是druid灌库json中也有这个秘钥配置,改成新的秘钥之后,问题解决
3.索引创建任务失败
权限问题解决后,继续提交灌库任务,报错如下:索引创建任务失败
阿里同学说他去看了druid灌库任务启动的mr作业,去druid自带的hadoop的web控制台(yarn控制台)看,发现mr作业失败了
于是他很机智的让我在灌库json中加了下面这行,问题解决,这个地方是我感觉整个过程中最能体现他们经验的地方,佩服
Mr任务成功
但是灌库任务仍然是失败的
报错日志变成了下面这个新的,很宽泛的一个错误
到谷歌上查“segmentDescriptorInfo does not exist.”,有几篇文章提到是时间戳格式没写对
下面贴一下灌库用的json和准备灌库的数据,下面是修改之后能最终灌库成功的,错误的原因我写在后面
下面详细解释下灌库用的json
1.加载的数据是tsv文件,是用制表符分割的
2.paser中包括时间列和维度列,columns中是所有列的表头,指标列并不在这里面
3.这是一个小时级的灌库任务,druid统一采用utc时区,注意intervals中的写法
4.如果想指定哪个时区查询,在查询语句中指定
下面写下上面的报错原因是为啥?
因为我的intervals开始的时候写的是2019-03-01, 要索引的时间段内没有数据
但是报错日志也是太宽泛了,就不能报错到“灌库数据时间和json中的intervals时间不符”?
开始的时候我们都没注意到这个错误,当时还怀疑是灌库mr任务访问s3有问题,于是从druid.io官网下载了一个quickstart的灌库json和灌库数据
灌库命令如下
curl -X 'POST' -H 'Content-Type:application/json' -d @/home/orion_data/druid-script/druid_ingest/detail_report/template/template_mock.json http://overloadip:port/druid/indexer/v1/task -s
灌库数据是从tar.gz的quickstart中粘贴出来的,这里就不粘贴了
灌库任务是天级别
灌库数据是json类型
日期格式是iso
我执行了这个灌库脚本,数据完美灌入,看来访问s3没问题,然后我就黔驴技穷,过了一段时间,阿里云工程师说是我的灌库数据中的时间戳和json中的intervals不符,太低级的错误了,看来还是缺乏经验啊
另外在灌库控制台日志中还能看到druid本身使用的hdfs路径
但是druid灌库启动的mr作业用的yarn web地址是overload节点的8088端口