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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM