到新公司三个月了,上个月做的是Beacon项目,详细的设计思想还没有写文档。这两周开始搞Hadoop,开始阅读相关论文。开始编写MR程序。开始写java,大学时用java较多,工作后就一直在用c/c++/php/shell/js 等。并不排斥语言,各有各的优劣。只是需要从底层的角度去理解各程序的运行态。

Hadoop的原理架构方面的文章等再深入了解之后再写。先写下上周做的RTB日志分析MR程序的设计,懒得画图,仅用文字表述。

需求:
    1. 读入RTB log日志,对log日志进行分析 按照特定格式输出,并对某些字段做 异常 检测。日志为json格式,顺序无关。默认输入格式不可靠(必填字段 可能会没有 等)
    2. 对错误的字段进行出错次数统计,并记录错误日志。

现有代码:
    1. RTB字段对应的一个类,字段 为类的属性,序列化及反序列化时使用。类似于C/C++的结构体
    2. 一次读入字段,对每个值进行parse,在Parse的辅助类内添加异常报警代码。大量的if else 语句
    3. 依赖于公共的RTB对象,RTB对象属性变化时,线上对他依赖的程序会宕机。(强制检测,是好处,亦是风险)。

现有代码的不足:
    1. 代码量多,代码逻辑不少重复。过量的if语句
    2. 报警相关的数据存储结构跨越三个类,三个文件。辅助类型判断解析类承载了业务逻辑。
    3. 字段变更或者增删时 改动较多,库的依赖将导致牵一发而动全身。维护成本较高。
    4. 配置相关的代码文件跨越度太大,用的地方过于随意。机器间迁移运行时无法通过代码直观知道配置,易人维护成本高。环境迁移调试成本高。

现有代码的优点:
    1. 主要业务逻辑代码直观,RTB字段封装为jar类库,后期增加输入配置时,便于接入。字段类型变更时会导致依赖于其的程序宕机(也是一种好处,强制检测)
    2. RTB字段设计为类属性,代码效率较高。运行时直接栈上读取。

新业务环境下的改进:

目标:
    1. 业务逻辑清晰,输入输出字段对应关系明确。
    2. 字段的异常检测统一处理,统一报告错误。不能遍处理字段遍检测,因为输入字段可能没有,这种情况下如果对应的目标字段不允许为空就悲催了
    3. 简化配置:去除不必要的配置。如报警时的字段名称配置。配置统一处理,统一管理。
    4. warning异常时,记录原始输入字段

设计一:
设计的数据结构:
    LinkedHashMap保存输入字段与目标字段的映射关系。 RecordField 为自定义对象类。保存了目标Key, 目标Value,异常检测标准。
    private Map<String, RecordField> mapfields = new LinkedHashMap<String, RecordField>();
    初始化时如下:
          mapfields.put("vendor_id", new RecordField("vendorID", RecordField.E_NOT_EMPTY|RecordField.E_DIGITAL|RecordField.E_WARN));
          mapfields.put("request_time", new RecordField("requestTime", RecordField.E_NOT_EMPTY|RecordField.E_FATAL));
          mapfields.put("user_id", new RecordField("userID", RecordField.E_NOT_EMPTY));
          mapfields.put("campaign_id", new RecordField("campaignID", RecordField.E_NOT_EMPTY));

异常处理:
       RecordField 保存异常检测策略,检测时遍历每个字段,调用其Check方法获得异常结果即可。

交付代码时老员工强制要求使用现有的RTB类,出于尊重,只能用了。但又不想大量的if else语句及字符串的相等判断;于是有了设计二,主要用到了java的反射。

设计二:

linkedhaspmap 保存原始输入与目标输出之间的映射关系;
     对现有类(包含近百个public属性字段)的每个属性编写Set方法,方法名为void SetFieldName(String), 基本是体力劳动了,基本是对字段的类型转换复制(上一个设计中为制定 了一些配置规则自动转换)
     对每个原始输入字段,找到匹配的目标字段,通过目标字段反射获得其Set方法, 调用Set赋值;静态变量保存反射的函数地址,因反射查找函数的过程较慢
     异常检测:对需要做异常检测的字段专门编写其对应的Check方法,并保存需要做检测的字段数组,字段映射完成后遍历需要检测的字段,根据字段名获取对应的Check方法并   执行

RTB日志分析MR程序设计的更多相关文章

  1. 日志分析_使用shell完整日志分析案例

    一.需求分析 1. 日志文件每天生成一份(需要将日志文件定时上传至hdfs) 2. 分析日志文件中包含的字段:访问IP,访问时间,访问URL,访问状态,访问流量 3. 现在有"昨日" ...

  2. 海量WEB日志分析

    Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, ...

  3. 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用

    https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...

  4. Awk使用及站点日志分析

    Awk使用及站点日志分析 Awk简单介绍 概述 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入, ...

  5. Spark SQL慕课网日志分析(1)--系列软件(单机)安装配置使用

    来源: 慕课网 Spark SQL慕课网日志分析_大数据实战 目标: spark系列软件的伪分布式的安装.配置.编译 spark的使用 系统: mac 10.13.3 /ubuntu 16.06,两个 ...

  6. hadoop入门之海量Web日志分析 用Hadoop提取KPI统计指标

    转载自:http://blog.fens.me/hadoop-mapreduce-log-kpi/ 今天学习了这一篇博客,写得十分好,照着这篇博客敲了一遍. 发现几个问题, 一是这篇博客中采用的had ...

  7. 【转】gc日志分析工具

    性能测试排查定位问题,分析调优过程中,会遇到要分析gc日志,人肉分析gc日志有时比较困难,相关图形化或命令行工具可以有效地帮助辅助分析. Gc日志参数 通过在tomcat启动脚本中添加相关参数生成gc ...

  8. 海量日志分析方案--logstash+kibnana+kafka

    下图为唯品会在qcon上面公开的日志处理平台架构图.听后觉得有些意思,好像也可以很容易的copy一个,就动手尝试了一下. 目前只对flume===>kafka===>elacsticSea ...

  9. ELK+Kafka集群日志分析系统

    ELK+Kafka集群分析系统部署 因为是自己本地写好的word文档复制进来的.格式有些出入还望体谅.如有错误请回复.谢谢! 一. 系统介绍 2 二. 版本说明 3 三. 服务部署 3 1) JDK部 ...

随机推荐

  1. python中enumerate的使用

    在python的应用中,当我们使用一个数组或者列表的时候既要遍历索引又要遍历元素的时候通常的做法是这样的: >>> lsi = [1,2,3,4,5,6,7,8,9] >> ...

  2. python学习之--内置函数:

    Python内置函数: Python内置了很多有用的函数,我们可以直接调用.要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数. 1. 内置函数调用之--abs()函数: ...

  3. Metasploit介绍

    Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估, 提供真正的安全风险情报.这些功能包括智能开发,密码审计 ...

  4. Java 8 的 JVM 有多快?Fork-Join 性能基准测试

    Java 8 已经发布一段时间了,许多开发者已经开始使用 Java 8.本文也将讨论最新发布在 JDK 中的并发功能更新.事实上,JDK 中已经有多处java.util.concurrent 改动,但 ...

  5. bzoj2705

    一个常用的结论(方法) 只要知道gcd(i,n)=L 的i的个数s,我们就能很轻易得出答案 gcd(i,n)=L gcd(i/L,n/L)=1 不难得到这样的s=与n/L互质的个数=phi(n/L) ...

  6. the private key for is not installed on this mac

    the private key for is not installed on this mac 如果提交 时出现这个问题, 有可能是 keychain重复了, 1:要去keychain中把旧的删除, ...

  7. 基础算法(搜索):NOIP 2015 斗地主

    Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3& ...

  8. android学习—— LayoutInflater的使用

    在实际开发种LayoutInflater这个类还是非常有用的,它的作用类似于findViewById(),不同点是LayoutInflater是 用来找layout下xml布局文件,并且实例化!而fi ...

  9. log4net封装类 zz

    封装说明: 1.使用静态方法调用即可写入日志. 2.在日志信息写入之前,定义委托处理日志信息,便于记录日志信息之前,显示给用户. 3.添加代码配置Log4net,避免应用程序总是携带配置文件.如果需要 ...

  10. HDJ -- 1022

    #include<iostream> #include<cstdio> #include<string> #define MAXN 10 using namespa ...