背景:
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參數:表示認證用戶和密碼