V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
whnzy
V2EX  ›  Hadoop

每天要处理亿级的日志文件,该怎么做?

  •  1
     
  •   whnzy · 2015-06-30 18:08:08 +08:00 · 10681 次点击
    这是一个创建于 3432 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在要做到每天处理亿级的日志文件,公司根本没有现成的系统.日志是由nginx打下的请求日志,要在日志中筛选需要的信息,有些还是加密的请求,需要解密.
    我当时用python 搭建起一套系统,一天可以处理完,但是随着数据的增加,我为了提高查询数据库的速度,将一些内容放到了内存中,但是随着数据的增加,内存已经爆掉.
    mongo,多维数组什么的都已经尝试过了,已经无能为力了,我刚刚毕业,没有那么多的经验,手中只有两台服务器可用,而且内存一个4G,一个1G,cpu最多的一个也才是双核的.
    请教该怎么搞?

    73 条回复    2015-07-01 21:33:34 +08:00
    xujif
        1
    xujif  
       2015-06-30 18:10:30 +08:00
    内存问题,只能队列处理啊,一次处理一部分,如果处理不及,只能加机器或者cpu
    repus911
        2
    repus911  
       2015-06-30 18:10:34 +08:00
    这是服务器么 估计还没我的本本配置好
    whnzy
        3
    whnzy  
    OP
       2015-06-30 18:12:30 +08:00
    @xujif 我已经用了队列了,因为要进行数据挖掘,所以存储结构复杂.每次存库要查询mysql,导致速度越来越慢,所以我将信息存到了内存中.现在内存不够用了哦
    whnzy
        4
    whnzy  
    OP
       2015-06-30 18:13:02 +08:00
    @repus911 QAQ,公司穷,AWS的,我的本本也比这个好
    nullcc
        5
    nullcc  
       2015-06-30 18:15:48 +08:00
    elasticsearch+logstash+kibana
    zhicheng
        6
    zhicheng  
       2015-06-30 18:17:35 +08:00
    都用 AWS 了,还有什么解决不了的。开 spot instance 超大内存多核的机器,一个小时跑满不就好了。这个量级上,不是应该用人去解决的。
    omi4399
        7
    omi4399  
       2015-06-30 18:18:32 +08:00
    买买买买买,花钱就能解决的问题
    whnzy
        8
    whnzy  
    OP
       2015-06-30 18:21:49 +08:00
    @zhicheng 我擦,我得给老大提提了
    whnzy
        9
    whnzy  
    OP
       2015-06-30 18:27:30 +08:00
    烦烦烦死
    julypanda
        10
    julypanda  
       2015-06-30 18:42:29 +08:00
    splunk
    xdeng
        11
    xdeng  
       2015-06-30 18:55:19 +08:00
    golang
    mhycy
        12
    mhycy  
       2015-06-30 19:02:04 +08:00
    @whnzy 请问方便给份样本测试下么?企鹅已申请。。
    AntiGameZ
        13
    AntiGameZ  
       2015-06-30 19:02:09 +08:00
    @julypanda 估计LZ是用不起 Splunk的
    jason52
        14
    jason52  
       2015-06-30 19:02:12 +08:00 via Android
    莫非是渣浪~知乎有个开发2g怎么玩的问题
    em70
        15
    em70  
       2015-06-30 19:09:09 +08:00 via Android
    awk 专注处理日志文件三十年
    20150517
        16
    20150517  
       2015-06-30 19:10:00 +08:00 via Android
    弄个hive不就好了?
    whnzy
        17
    whnzy  
    OP
       2015-06-30 19:16:47 +08:00
    @20150517 可是没有 集群啊
    whnzy
        18
    whnzy  
    OP
       2015-06-30 19:17:09 +08:00
    @xdeng 这.... 没有人会用吧
    whnzy
        19
    whnzy  
    OP
       2015-06-30 19:18:31 +08:00
    @em70 = -= awk 有些还是处理不了的
    20150517
        20
    20150517  
       2015-06-30 19:19:54 +08:00 via Android
    @whnzy 一台也行,多台也行,不用一定好多集群
    kaneg
        21
    kaneg  
       2015-06-30 19:33:13 +08:00 via iPhone
    想要马儿跑得快,还要马儿不吃草。玩QQ游戏的电脑配置也比你的要好吧
    Septembers
        22
    Septembers  
       2015-06-30 19:34:54 +08:00
    qsl0913
        23
    qsl0913  
       2015-06-30 19:39:30 +08:00
    日志的查询需求具体是,查明细?做统计?
    em70
        24
    em70  
       2015-06-30 19:42:09 +08:00 via Android
    @whnzy 只能用一种工具解决吗,awk可以帮你快速筛选记录,然后给Python后续处理啊,你用python去查找那不慢死,awk命令完全可以达到数据库的性能

    另外可以创建一个内存盘,把当前处理的日志拷贝到内存盘里让awk处理,那更加酸爽
    paulw54jrn
        25
    paulw54jrn  
       2015-06-30 20:17:24 +08:00
    丢Redshift吧..
    rssf
        26
    rssf  
       2015-06-30 20:33:55 +08:00
    这已经不是技术能解决的了,给老大提,这算毛的服务器啊。如果老板1毛钱都不想花在硬件上,趁早换地
    yghack
        27
    yghack  
       2015-06-30 20:36:05 +08:00
    ELK
    sunchen
        28
    sunchen  
       2015-06-30 20:44:45 +08:00
    aws的话试试redshift
    sunchen
        29
    sunchen  
       2015-06-30 20:45:33 +08:00
    @paulw54jrn 赞同,redshift谁用谁知道
    scys
        30
    scys  
       2015-06-30 20:54:42 +08:00
    服务器性能不足,请最少配置16G的内存给日志服务器。
    realpg
        31
    realpg  
       2015-06-30 21:00:54 +08:00
    @jason52 你刚说完这个,又有一大堆渣浪的回帖卧槽离职时候忘了把自己的内存拔下来了……
    summic
        32
    summic  
       2015-06-30 21:20:55 +08:00
    分而治之
    ms2008
        33
    ms2008  
       2015-06-30 21:40:36 +08:00
    elk妥妥的
    msg7086
        34
    msg7086  
       2015-06-30 21:55:05 +08:00
    4G内存?不要搞笑了。我5年前家用的破电脑都有8G。敢不敢让你们领导买台旧电脑来处理?

    @realpg 内存才几个钱……比ssd还便宜吧……
    hitsmaxft
        35
    hitsmaxft  
       2015-06-30 22:12:28 +08:00
    额。。我跑工具脚本的虚拟机都都是 6g 内存, 你这玩意用4g的。。
    daoluan
        36
    daoluan  
       2015-06-30 23:09:56 +08:00
    这些日志用来做什么?
    sophymax
        37
    sophymax  
       2015-06-30 23:13:25 +08:00 via iPad
    明显要上集群啊
    xiawinter
        38
    xiawinter  
       2015-06-30 23:17:24 +08:00   ❤️ 2
    @nullcc 很多人用这个方案,但这个方案题主跑不起来,太慢了。 题主可以考虑 heka, 我们数据量比这还要高点,两台机器往 elasticsearch里扔, elasticsearch 需要 12G 内存, 未用 SSD, 不过能用 ssd 速度快很多。

    logstash 是 jruby 来做正则解析的,不知道为什么他们会用这么个方案,百思不得其解的慢。 heka 做法非常好, 如果不能及时处理数据,会缓存到 /var/cache/hekad/ 下面,这样不会造成机器卡死。 数据传输和处理有点延迟很正常,硬盘做大点, 准备 100G 应当就差不多。 几天不做都死不了。

    如果转运过程还需要去查询 mysql, 那么我认为设计方案可能可以优化一下,类似日志的数据分析不应该做即时分析的,可以先把数据格式化后,之后开始做计算。 否则可能让数据阻塞在原来的地方。

    请求加密是指传过来的数据是加密的,然后解密这部分数据? 感觉很多东西都混在一起,耦合有点高。
    chinabrowser
        39
    chinabrowser  
       2015-07-01 01:26:00 +08:00
    赶快GCE 这个同等配置可比AWS便宜
    9
        40
    9  
       2015-07-01 01:39:32 +08:00
    最近在做跟楼主一样的东西,ELK 是很适合的方案,不要把数据放数据库中去,那是自杀的做法。
    其中 logstash 可以换成 fluentd,不多说了,直接看这个 kibana 的 demo 吧,http://demo.elastic.co/packetbeat/
    darrenxyli
        41
    darrenxyli  
       2015-07-01 01:43:51 +08:00
    elasticsearch+logstash+kibana
    YORYOR
        42
    YORYOR  
       2015-07-01 08:49:32 +08:00
    这tm 比我们渣浪还惨啊 擦
    shiznet
        43
    shiznet  
       2015-07-01 09:05:17 +08:00
    @whnzy awk先做一次筛选 减少数据规模 然后在用其他工具处理呢
    whnzy
        44
    whnzy  
    OP
       2015-07-01 09:29:52 +08:00
    @qsl0913 做统计,听说过一个 solar的东西
    whnzy
        45
    whnzy  
    OP
       2015-07-01 09:33:05 +08:00
    @daoluan 挖掘日志中的用户信息的.
    whnzy
        46
    whnzy  
    OP
       2015-07-01 09:33:35 +08:00
    @paulw54jrn 这个在infoQ上看到过一次,研究下
    whnzy
        47
    whnzy  
    OP
       2015-07-01 09:36:02 +08:00
    真是谢谢大家了,感觉要重新设计下了,题主也是开发经验不足,架构的东西现在出现的问题,向前找原因,一开始就错了.
    c89758972
        48
    c89758972  
       2015-07-01 09:40:39 +08:00
    @realpg 麻蛋啊,我之前的公司就是.我倒是想过拿回自己的,可那行政balabala的,当时内存也便宜啊,4G99,就没在意.
    popok
        49
    popok  
       2015-07-01 09:43:13 +08:00
    处理啥啊,直接删。哈哈
    whnzy
        50
    whnzy  
    OP
       2015-07-01 09:46:21 +08:00
    @c89758972 你们都是自己的服务器啊
    whnzy
        51
    whnzy  
    OP
       2015-07-01 09:48:47 +08:00
    @popok 不要闹好不好呀,数据很重要哒
    c89758972
        52
    c89758972  
       2015-07-01 09:49:45 +08:00
    @whnzy 这倒不是,是自己有内存多,刚好公司又缺内存,申请又麻烦就拿过去用了.结果都是悲剧,没能拿回来.哎
    fxxkgw
        53
    fxxkgw  
       2015-07-01 10:23:42 +08:00
    ELK太占内存了 logstash匹配速度太慢 配置这么点的服务器根本承受不了
    loryyang
        54
    loryyang  
       2015-07-01 11:08:32 +08:00
    亿级别的话,简单的还是用批处理吧,kafka+hadoop
    实时流的技术难度太高了,而且稳定性是个很大的难题。
    数据先用kafka导到hdfs,然后每天运行mr任务,可以上面架一个hive,写写sql就行。hadoop的整套实践方案,还是相对简单一些
    不过一个应届生,要搞定这整一套环境,还是有点困难的。。
    loryyang
        55
    loryyang  
       2015-07-01 11:09:55 +08:00
    额,没看到你只有两台服务器,那忽略我吧。。。
    fengyqf
        56
    fengyqf  
       2015-07-01 11:19:16 +08:00
    亿级日志的规模,竟然用1G 4G的服务器
    lunaticus7
        57
    lunaticus7  
       2015-07-01 11:26:41 +08:00
    没折腾过nginx日志,不过对原始数据做好预处理,很多情况下可以极大的提高系统的性能,awk sed都可以用,一个比较通用的思路是,在进入流程中大运算量步骤之前,尽量筛掉无用的数据
    由于机器配置低,所以做好分治+流式的规划,同时可以看看负载是耗在那一块了,可以考虑多线程,把cpu尽量用起来
    Chip
        58
    Chip  
       2015-07-01 11:29:29 +08:00
    花钱能解决的问题,Splunk大法好。
    typcn
        59
    typcn  
       2015-07-01 11:56:30 +08:00
    直接 fopen 全部读一遍,然后 fseek 到文件尾部,流式读取这个日志,插入队列

    这个 CPU 基本 0% ,内存超不过 5MB

    数据库如果无需复杂功能的话可以简单实现一个,挂个 epoll ,异步拿数据,然后转成 binary 每隔几秒 append 一次磁盘,这个 CPU 不会超过 5%,内存超不过 100MB
    typcn
        60
    typcn  
       2015-07-01 12:02:02 +08:00
    看错了,,,是离线日志,直接 while(line = getline())
    JohnSmith
        61
    JohnSmith  
       2015-07-01 12:29:26 +08:00
    @xdeng +1 有许多现成的方案
    EF0718
        62
    EF0718  
       2015-07-01 12:32:20 +08:00
    elasticsearch+logstash+kibana
    smileawei
        63
    smileawei  
       2015-07-01 12:36:58 +08:00 via iPhone
    即使你现在勉强解决了,等下次性能瓶颈的时候怎么办,老板会觉得,上次都搞定了,这次也可以的。然后。。。
    minotaur
        64
    minotaur  
       2015-07-01 12:57:24 +08:00
    流处理,内存中只保留热门数据,冷门数据都持久化到磁盘。
    一毕业就做这个还挺有意思的。
    whnzy
        65
    whnzy  
    OP
       2015-07-01 15:38:05 +08:00
    不知道有没有人用过GoAccess,想请教下.
    9hills
        66
    9hills  
       2015-07-01 15:41:20 +08:00
    上面说elasticsearch的,lz那点内存还敢跑elasticsearch?我32G内存的机器都OOM。。
    9hills
        67
    9hills  
       2015-07-01 15:42:08 +08:00
    ES的文档里说了:A machine with 64 GB of RAM is the ideal sweet spot

    64G为佳。。
    Pacer
        68
    Pacer  
       2015-07-01 15:46:07 +08:00
    首先~~ 把机器内存和 CPU 升级一下吧~
    跟老板要 16GB 4核 吧
    Clarencep
        69
    Clarencep  
       2015-07-01 16:04:31 +08:00
    这么多log肯定有很多是冗余的,垃圾信息的,清理下,然后免费版的splunk就够用的了
    paw
        70
    paw  
       2015-07-01 18:58:23 +08:00
    kafka spark


    不要求实时的话 mapreduce去


    PS:不管咋样,跟BOSS说加机器去。。。。
    luw2007
        71
    luw2007  
       2015-07-01 19:47:15 +08:00
    看日志处理完干嘛。
    错误日志可以使用全文搜索引擎报错。
    hb1412
        72
    hb1412  
       2015-07-01 21:31:23 +08:00
    可以看看sumologic
    loading
        73
    loading  
       2015-07-01 21:33:34 +08:00 via Android   ❤️ 1
    花十万开发工具 vs 花一万上新机器
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   982 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:30 · PVG 04:30 · LAX 12:30 · JFK 15:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.