免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1657 | 回复: 9
打印 上一主题 下一主题

[文本处理] shell解析日志,插入mysql数据库效率很低,请教大家如何提高效率,非常感谢! [复制链接]

论坛徽章:
3
程序设计版块每日发帖之星
日期:2016-02-27 06:20:00程序设计版块每日发帖之星
日期:2016-03-03 06:20:00数据库技术版块每日发帖之星
日期:2016-05-06 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-02-24 15:34 |只看该作者 |倒序浏览
日志sdc_02_17_2016(2).log:每个日志文件大概200M左右,日志行数10万行左右。
#Remark: DCS-p
#Software: WebTrends Data Collector        
#Version: 1.0
#Date: 2016-02-06 08:56:35
#Fields: date time c-ip  cs-uri-stem
2016-02-17 07:05:54 210.10.22.6  /NetCar/chehao.onclick agentId=&WT.cg_page=基本信息&WT.cg_onclick=测试号码
2016-02-17 07:05:54 21.13.33.6   /NetCar/chehao.onclick agentId=&WT.cg_page=基本信息&WT.cg_onclick=测试号码
2016-02-17 07:05:55 213.112.44.6 /NetCar/chehao.onclick agentId=&WT.cg_page=基本信息
2016-02-17 07:05:55 211.14.55.6   /NetCar/chehao.onclick agentId=&WT.cg_page=基本信息&WT.cg_onclick=测试
.....

通过shell程序,解析日志中数据,并插入mysql数据库,5万条数据大概插入1个小时,效率比较低,还需大家帮忙看下程序,如何能提高效率,非常感谢。

#!/bin/sh
a="sdc_02_17_2016(2).log"
HOSTNAME="10.22.0.17"
PORT="3306"
USERNAME="test"
PASSWORD="test"
DBNAME="dbtest"
TABLENAME="tabletest"

sed -i '/^#/d' $a

while read c1 c2 c3 c4
do
if [ "$c4" = "cs-uri-stem" ]; then
continue
fi

cg_page=$(echo $c4|grep -oP '(?<=WT.cg_page=)[^&]*')
cg_onclick=$(echo $c4|grep -oP '(?<=WT.cg_onclick=)[^&]*')

insert_sql="insert into ${TABLENAME}(dateid,times,ip,uristem,cg_page,cg_onclick,createdate) values('"$c1"','"$c2"','"$c3"','"$c4"','"$cg_page"','"$cg_onclick"',now())"

mysql --default-character-set=utf8  -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e  "${insert_sql}"  

done <$a


论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
2 [报告]
发表于 2016-02-24 15:42 |只看该作者
加上并发试试...并发数自己控制下...loop_operation里的注释行部分放你的操作...循环条件自己改下....
  1. #!/bin/bash
  2. basePath=$(cd $(dirname $0);pwd)
  3. operationList="$basePath/iplist"
  4. threadFile="$basePath/thread.pipe"
  5. threadNum=50

  6. Init_thread(){
  7.     thread_file=$1
  8.     thread_num=$2
  9.         rm -rf $thread_file
  10.         mkfifo $thread_file
  11.         exec 9<>$thread_file
  12.     if [ "$2" == 0 ];then
  13.         return
  14.     else
  15.         for num in $(seq 1 $thread_num);do
  16.             Operate_fd insert
  17.         done
  18.     fi
  19. }

  20. Operate_fd(){
  21.         case $1 in
  22.                 insert) echo " " 1>&9   ;;
  23.                 delete) read -u 9   ;;
  24.         esac
  25. }

  26. loop_operation(){
  27.     for host in $(awk '$0=$1' $operationList);do
  28.         Operate_fd delete
  29.         {

  30.             # ur cmds

  31.             Operate_fd insert
  32.         }&
  33.     done
  34.     wait
  35. }
  36. Main(){
  37.     Init_thread $threadFile $threadNum
  38.     loop_operation
  39. }
  40. Main
复制代码

论坛徽章:
3
程序设计版块每日发帖之星
日期:2016-02-27 06:20:00程序设计版块每日发帖之星
日期:2016-03-03 06:20:00数据库技术版块每日发帖之星
日期:2016-05-06 06:20:00
3 [报告]
发表于 2016-02-24 15:59 |只看该作者
谢谢您,我也是这周才接触shell的。通过查找资料及咨询,才写的上面的程序。您写的好多看不太懂,毕竟我学的不精,不好意思,不知道能否在我写的上面进行优化,可以解决此事。再次感谢您的回复。回复 2# 我是一隻羊


   

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
4 [报告]
发表于 2016-02-24 16:03 |只看该作者
先将处理完的数据生成文件 再用mysql的load方式 把文件里的数据加载进数据库

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-12-17 06:20:00
5 [报告]
发表于 2016-02-24 16:09 |只看该作者
先判断你导入慢的瓶颈在哪,如果排除是本机IO或数据库服务器瓶颈,只是你脚本效率问题,可以先格式化你的日志,使用mysql 的load data infile  速度会很快的。

论坛徽章:
3
程序设计版块每日发帖之星
日期:2016-02-27 06:20:00程序设计版块每日发帖之星
日期:2016-03-03 06:20:00数据库技术版块每日发帖之星
日期:2016-05-06 06:20:00
6 [报告]
发表于 2016-02-24 16:38 |只看该作者
我刚接触shell,上面的语句也是写起来挺费劲的,能否在上面的基础上处理,多谢!回复 5# vagrant_1220


   

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
7 [报告]
发表于 2016-02-24 17:31 |只看该作者
找找慢在哪里,是连接慢,还是IO慢,是硬盘慢,还是网络慢,或是数据表结构不合理造成数据库操作慢。
看这个情况,每一条日志就要做一次数据库连接,建立连接是比较耗时的操作,建议在循环里生成所有的插入语句(使用扩展的插入语句),然后在循环外执行一次mysql操作即可。这只是根据现有的程序结构来说,楼上几位说的 load data 的方法更好,速度飞快哦。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-10-11 06:20:0015-16赛季CBA联赛之山东
日期:2016-05-28 18:18:5615-16赛季CBA联赛之新疆
日期:2017-04-12 22:55:4715-16赛季CBA联赛之青岛
日期:2017-06-26 18:30:0315-16赛季CBA联赛之四川
日期:2017-09-04 12:27:0315-16赛季CBA联赛之福建
日期:2018-02-09 14:28:3315-16赛季CBA联赛之同曦
日期:2018-04-17 12:43:3415-16赛季CBA联赛之浙江
日期:2018-07-14 13:27:4015-16赛季CBA联赛之吉林
日期:2018-09-13 15:48:2915-16赛季CBA联赛之新疆
日期:2016-05-07 05:05:3215-16赛季CBA联赛之八一
日期:2016-03-14 12:32:06程序设计版块每日发帖之星
日期:2015-12-12 06:20:00
8 [报告]
发表于 2016-02-24 17:38 |只看该作者
感觉你那个每插入一条数据,就要重新连接数据库,是不是这个原因引起的?

论坛徽章:
3
程序设计版块每日发帖之星
日期:2016-02-27 06:20:00程序设计版块每日发帖之星
日期:2016-03-03 06:20:00数据库技术版块每日发帖之星
日期:2016-05-06 06:20:00
9 [报告]
发表于 2016-02-25 14:08 |只看该作者
您好,能根据我的程序,调整为load file的方式吗?毕竟我刚接触shell,这样如果方便提供,我参考下,非常感谢!回复 7# seesea2517


   

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
10 [报告]
发表于 2016-02-29 14:24 |只看该作者
回复 9# bzh_516

大概类似这样,没有测试,请参考:
  1. #!/bin/sh
  2. a="sdc_02_17_2016(2).log"
  3. HOSTNAME="10.22.0.17"
  4. PORT="3306"
  5. USERNAME="test"
  6. PASSWORD="test"
  7. DBNAME="dbtest"
  8. TABLENAME="tabletest"

  9. temp_file="xxxxxxxxxxxx.sql.tmp"    #### 修改的地方

  10. sed -i '/^#/d' $a

  11. while read c1 c2 c3 c4
  12. do
  13. if [ "$c4" = "cs-uri-stem" ]; then
  14. continue
  15. fi

  16. cg_page=$(echo $c4|grep -oP '(?<=WT.cg_page=)[^&]*')
  17. cg_onclick=$(echo $c4|grep -oP '(?<=WT.cg_onclick=)[^&]*')

  18. echo "$c1\t$c2\t$c3\t$c4\t$cg_page\t$cg_onclick" >> $temp_file  #### 修改的地方

  19. done <$a

  20. #### 修改的地方
  21. #### createdate 设置为默认值为当前时间就不用导入它了
  22. mysql --default-character-set=utf8  -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e  "lode data local infile $temp_file into table ${TABLENAME}"
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP