摘要: 无论是做数据分析还是数据挖掘,都离不开数据。而MaxCompute不负责收集数据,他只负责处理数据,就好比你有台酸奶机但是没牛奶(MaxCompute比作酸奶机,数据比作牛奶)。所以先把海量的日志数据收集起来是第一步要做的工作。本文以高德实战经历来描述。

欢迎点击使用

概述


MaxCompute(原名ODPS),是阿里巴巴自主研发的海量数据处理平台。 主要服务于批量结构化数据的存储和计算,可以提供海量数据仓库的解决方案以及针对大数据的分析建模服务。支持PB级别数据分析,常用场景如下:大型互联网企业的数据仓库和BI分析、网站的日志分析、电子商务网站的交易分析、用户特征和兴趣挖掘等。
我们接入MaxCompute主要做两个工作,一是网站的日志分析,二是用户特征和兴趣挖掘。其中网站日志分析项目组内(高德开放平台)已经玩的比较溜了,“用户特征和兴趣挖掘”还在探索中。


无论是做数据分析还是数据挖掘,都离不开数据。而MaxCompute不负责收集数据,他只负责处理数据,就好比你有台酸奶机但是没牛奶(MaxCompute比作酸奶机,数据比作牛奶)。所以先把海量的日志数据收集起来是第一步要做的工作。本文以高德实战经历来描述,大家在使用时可根据实际情况来调整方法。
概念清晰了,我们就可以开始动手,下面说说如何将海量的日志收集起来。

数据收集


数据来源可以是来自MySQL,也可以是文本文件。不过我们的业务场景主要是生产大量的log(文本文件)。比如Nginx请求日志、PHP,Java,Node的服务日志、自建的埋点日志等。


首先我们要将这些日志收集起来,这里我们使用Fluentd 服务(类似的服务还有DataXLogHub、kafka等,都大同小异,这里我用Fluentd作描述只是方便),通过Fluentd我们轻松的创建任务去按时读取各台服务器上的日志文件。简单点说就是你只需要配置服务器上日志的路径,Fluentd就帮你把日志存储到MaxCompute的Table Store中,然后你就能愉快的通过MaxCompute分析数据了。


如果你的数据不是文本文件,可以参考这篇将数据导入MaxCompute的方法汇总

流程说明


在实际项目中使用MaxCompute有4种通用的方案,可根据实际情况来灵活变化,这里贴出流程图供大家参考;


方式一
最简单也是最通用的方法,使用Fluentd上传数据,适用于简单的数据存储。如果只是用来收集日志,出问题时容易排查问题可以选择这种方案;流程图如下:


方式二
比较进阶的方法,使用PyODPS上传数据,适用于较为复杂的数据存储。比如我们需要对收集的日志做转换,例如需要将IP地址转换成城市等;流程图如下:


方式三
比较复杂,易于扩展的方法,需要使用Fluentd和PyODPS上传数据,适用于需要对数据做大量分析的场景。例如多个部门需要的数据埋点也不一样,分析的方法和想得到的报表也不一样等;流程图如下:


方式四
最实时的方法,使用Datahub上传数据,适用于需要实时同步数据的业务场景。例如游戏日志处理,电商充值、购物等要求低延的场景;流程图如下:


Datahub服务提供了SDK,不过是Java的,通过SDK可以实现实时上传功能。因为Datahub服务接口不用创建MaxCompute任务(Task),所以速度非常快。可以向较高的QPS(Query Per Second)和较大的吞吐量的服务提供数据存储支持。Datahub上的数据只会被存储7天,之后会被删除,被删除之前会保存到MaxCompute的表中。也可通过异步的方式,调用接口同步Datahub中的数据到MaxCompute的表中。
如果服务本身就使用Java可以直接使用SDK,非Java服务就需要权衡成本。应该还有类似Fluentd的平台,可以到MaxCompute开源工具上查找。

日志数据格式定义


PS:使用Fluentd是可以自定义字段的,不需要像我们一样定义规范。我们团队之所以规范字段信息,是因为我们的业务场景比较复杂,主要是为了之后的扩展和统一管理(上百个项目)。如果你不需要做复杂的数据分析,建议直接使用Fluentd上传数据就行。当然我也建议大家像我们一样规范字段,这样做的好处是之后你能基于Fluentd做平台。


使用Fluentd去管理数据收集方式确实能帮我们节省大量人力,而且方式相当便捷,分分钟就能上线泡咖啡!但Fluentd带来便利的同时就需要我们遵守它的规则。默认四个字段如下:
1、content 日志内容
2、ds 天,Fluentd自动生成
3、hh 小时,Fluentd自动生成
4、mm 分钟,Fluentd自动生成


如上可以看到真正能控制的字段只有content,其他字段Fluentd都帮你自动生成。所以在你要做数据分析时就需要用到无数的LIKE,这样不但会导致查询速度慢,最主要和最痛苦的是稍微复杂点的数据分析都无法实现,用LIKE去模仿等于、不等于、包含、不包含难度太高。你好不容易(其实并没有很不容易)把平台搭建好,并说这个服务多牛。一个月后PM要你产出一个报表你发现没办法,PM会觉得你做的啥玩意儿…
这个时候我们可以在埋点时对数据格式做下处理,用些小技巧。比如用各种符号做分隔符,定义一套log格式标准,总归有很多办法解决问题。马总不是说过嘛,解决问题的最好办法就是不给他发生的机会……


比如:我们通过程序在服务器上埋点了大量日志文件,文件名为“log/20160605.log”每天通过日期定时生成。每条埋点日志的格式为:
“name:amap|ip:19.19.19.19|uuid:110112|param:sdfsdf=123&fsdf=123|url:get-user-info|time:123123123”
使用 ‘|’和‘:’号分隔,这样便于得到。

核心代码


1、封装MaxCompute连接
这样方便我们随时随地使用MaxCompute的强大功能,只需要在代码中调用一句 “odps = OdpsConnect().getInstance()” ;


不同区域、不同网络环境下的MaxCompute服务连接请参考这里


2、创建MaxCompute Table用来存储我们的海量日志,上万亿条数据都不在话下。


有几点需要特别注意:
1)MaxCompute Table只支持添加数据,不支持删除与修改数据。如果要删除脏数据只能先备份整张表到B,再删除这张表A,再新建表A,最后将表B的备份信息处理后重新导入表A;所以,导入数据一定要慎重。
2)分区信息可以创建很多个,但是在导入、导出、某些特殊查询时都要全量带上。比如你的分区字段为“a,b,c,d”,最后你在导出数据时必须指定"a,b,c,d"的内容,只指定‘a,b’或者‘a.c’都是不行的。所以设置分区字段也要慎重,尽量字段设置少点,这里建议通过数据量来设置,建议每个分区存储2W条左右的数据。


3、将所有日志数据存储到我们上一步创建的“test_amap_analys” 表中


有几点需要特别注意:
1)使用MaxCompute一定要记住,数据为重,分区先行。存储数据,下载数据都要先设置好分区再操作数据。
2)Nginx中拿到的IP参数能被伪造,不能直接使用,需要了解的话可看这篇文章 HTTP_X_FORWARDED_FOR伪造


如上述对你有帮助,请快速前往MaxCompute开通使用吧!
现在日志已存储到MaxCompute表中,然后你就能愉快的通过大数据开发套件(DataIDE)加工数据了。最后,可在Quick BI中做报表展现。


相关系列文章:从数据加工到BI报表自动化展现

相关产品推荐

  • 大数据计算服务 MaxCompute
    提供完善的数据导入方案以及多种经典的分布式计算模型,能快速解决海量数据计算问题,有效降低企业成本,并保障数据安全。了解更多>
  • 大数据开发套件 DataIDE
    做为MaxCompute可视化控制台,由数据开发工具、数据同步工具、工作流设计器、数据管理和离线调度系统组成,为您提供拖拽式工作流开发界面、离线任务调度运维等功能。了解更多>
  • Quick BI
    极致简单的报表多维分析工具,提供海量数据实时在线分析、拖拽式操作、智能加速、丰富的可视化效果、报表第三方嵌入等功能。了解更多>
  • 推荐引擎
    实时预测用户对物品偏好,个性化推荐,千人千面,支持企业定制推荐算法。了解更多>