influxdb批量导入

背景:

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 @${dbSelectCpuResult} 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_file} if [ $? = 0 ] then rm -f ${cpu_file} fi done fi fi

 

说明:

1)split参数介绍:-l 表示分裂行数,-d表示使用数字作为后缀,-a表示接收多少位的数字

2)-u参数:表示认证用户和密码

 

相关文章