背景:
1)需要将yarn queue user的资源使用展示出来
2)数据已经存储在mysql里,需要过滤后插入到influxdb
3)由于历史数据比较多,用户的CPU、内存的数据分别有200万
分析:
1)查询mysql中m_bizhadoop_yarn_queue_userinfo的表中查询出用户的useMemory、useCpu
2)然后用influx cli逐条读取,插入到influxdb
操作:
1)查询mysql,sql如下
select id,username,sum(useMemory),sum(useCpu),ts from m_bizhadoop_yarn_queue_userinfo where id>=2931485 group by ts,username ORDER BY id ASC;
2)然后插入到influxdb
${INFLUXCOMMAND} -host ${influxdbHost} -port ${influxdbHort} -username ${influxdbUser} -password ${influxdbPassword} -database ${influxdbDatabase} -execute "insert ${influxdbCpuTable},username=${username} value=${cpu} {time}"
但是这种通过influx cli插入效率特别低,每秒只能插入一条
3)调整influx 插入方式,批量插入
想到的是用influx http api接口,格式如下
curl -i -XPOST ‘http://localhost:8086/write?db=mydb‘ --data-binary @cpu_data.txt
cpu_data.txt格式
cpu_load_short,host=server02 value=0.67 cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257 cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257
说明:
1)如果你的数据文件的数据点大于5000时,你必须把他们拆分到多个文件再写入influxDB。因为默认的HTTP的timeout的值为5秒,虽然5秒之后,influxDB任然会试图把这批数据写进去,但是会有数据丢失的风险
2)2XX:如果你写了数据后收到HTTP 204 no content,说明写入成功了
3)4XX:表示influxDB不知道你发的是什么鬼
4)5XX:系统过载或是应用受损
4)我的操作
首先需要对文件进行大小判断,判断是否大于5000行
#cpu insert #判断文件是否存在且数据大于0 if [ -s ${dbSelectCpuResult} ] then echo "0" > ${INFLUXDBCPUSTATUS} #统计文件里的数据行数 cpu_number=$(cat ${dbSelectCpuResult}|wc -l) #格式化数据,生成influx HTTP api接口能接收的格式 sed -i -e ‘s/^[0-9]\+\t/user_cpu_info,username=/‘ -e ‘s/\t/ /g‘ -e ‘s/ / value=/‘ ${dbSelectCpuResult} #判断文件行数是否小于5000行 if ((${cpu_number}<=5000)) then echo "insert ${dbSelectCpuResult} into influxdb" curl -i -XPOST "${influxdbHost}:${influxdbHort}/write?db=${influxdbDatabase}" -u${influxdbUser}:${influxdbPassword} --data-binary @${dbSelectCp uResult} else #分裂源文件 split -l 5000 ${dbSelectCpuResult} -d -a 3 ${pwdDir}/result/cpu_ for cpu_file in `ls ${pwdDir}/result/cpu_*` do echo "${cpu_file} into influxdb" curl -i -XPOST "${influxdbHost}:${influxdbHort}/write?db=${influxdbDatabase}" -u${influxdbUser}:${influxdbPassword} --data-binary @${cpu_fi le} if [ $? = 0 ] then rm -f ${cpu_file} fi done fi fi
说明:
1)split参数介绍:-l 表示分裂行数,-d表示使用数字作为后缀,-a表示接收多少位的数字
2)-u参数:表示认证用户和密码