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;

influxdb批量导入

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参数:表示认证用户和密码

 

influxdb批量导入

上一篇:MySQL数据库限制远程登陆IP、设置密码策略


下一篇:Ubuntu 18 安装MySQL 5.7