`

一次印象深刻的bug调试经历

阅读更多

最近一段时间,再做一个用pig写的基于曝光数据的为大广告主提供一些搞搞效果数据的项目,最近苦逼的加班了好久,周末加过班、晚上加班、回家以后跑数据还得加班,总之是我大学毕业一年半以来最苦逼的日子。

 

本来给pm的档期是今天上线,可是由于需求太紧张、工期紧,直到昨天还在看自己跑出来的数据是否合理。然后发现了曝光数据一个字段根本没有上报,导致数据有数据丢失的现象,然后就临时采用生成随机值补全的方式来处理(用PM的话说,是比没有数据好一点点哭),然后C君就开始改自己的pig脚本呢,然后上线重跑。其实本来说调个bug应该不是什么太难的事情,可是现实正是如我经常说的“数据大了什么都有可能是问题”一样,每次fix一个bug以后,就要跑大量的数据,如果修改的是只需要跑最近几天的数据还有,最怕的就是跑基础的数据,因为基础数据需要的是几十天甚至四百多天的数据,每天将近1G,甚至有的数据是几十G。

 

------------------------------------------------------华丽的分割线。。。。。。。。。。。。。。。

 

不介绍背景了,直接切入主题。

昨天晚上因为fix了bug,要重跑数据,于是乎,C君就启动了任务,然后我就启动了我的任务等待(依赖关系,后面还有其他的依赖关系),最终C君的任务在凌晨0点左右跑完了,我的任务自然就跑起来了,不过,又过了一个多小时,我发现自己的数据还没有生成,就去oozie的监控页面查看job情况,发现失败了。然后我就自然而然的以为是由于任务跑重了造成了,然后就重启了job。感觉没有问题了,等到了3点左右,我发现任务失败,然后就仔细去Hadoop的任务监控页面进行查看,发现Java内存溢出,这时候完全没有头绪了,已经正常跑了,然后就想可能是由于这个oozie队列任务太多,分配的内存少了,然后换了个queue。然后我就睡觉了,睡到早上7点多醒来(我定了个5点半的闹钟,根本没有听见。。),发现任务依然失败,然后就么有头绪了。后来看着看着问题,就又睡着了(实在太困了)。。。后来九点多,起床洗漱去上班,在路上一直在想,想到应该是由于昨天跑的数据,有些被过滤的app端的数据又有了,导致加载入udf中的数据太多了,“恩,对,就是这样”,然后我就开始分析应该怎么解决,在到公司之前已经想好了。让程序的join从pin维度降到campaign维度。然后回来以后就跟老大一起分析,说了自己的想法。

 

下一步就开始解决问题。先去请教了一个pig大牛,确认了是由于加载数据太多导致的,如果不是在udf里面的话,除了特殊操作外,pig会利用磁盘来优化的。因为加载数据量为70天的曝光数据,大牛说了个可能是特殊的账号导致的,但是,由于数据量太大,因此也不能确定。然后还有一个方案,配置了一下Hadoop的mapreduce的的内存,认为有可能是默认太小导致的,但是发现还是不OK;然后就分析因为是订单数据,用户账号应该不会为空,就排除了这种排查;下面就是终极方案,把pin维度拆成campaign维度来操作,然后就开始写程序了。

 

写了程序,逻辑不能改造,最重要的是要保证输出的schema和原来的保证一致,纠结了好久,然后就改呀改呀改呀,最终还没有改好;我就又去请求大牛了。去之前我先去让C君确认一下昨天改的随机生成id的feature是OK的,问了一下数据量,然后他说这次修复,也就是增加了10%以内的数据,然后我就开始怀疑不是数据量增大的问题。从大牛那回来以后,我就开始check我的订单数据里面的pin,老大也跟我说越来越感觉不是数据量的问题,然后他就开始check曝光数据。后来,我发现了订单里面有个pin为0,我就让老大看看曝光数据里面有多少pin为0的曝光,后来一个shell执行完了,发现问题已经水落石出了,一天的曝光里面pin为0的量为40w,然后要加载70天的数据,这样算下来是2800w,尼玛,这不内存溢出就怪了。后来发现这个pin为0的订单是正常的,曝光数据里面应该是有错误上报的,上报了很多的0,正好那个人在10月19号买了东西,有了订单,这样这个bug暴露出来了。。继续check,想为什么以前没有问题,因为19号的数据跑了很多次了,后来发现是由于C君在自己的pig脚本里面进行了这个过滤,但是昨天让他改成使用UDF来判断,但是UDF里面没有对这个0的情况进行过滤,导致昨天晚上跑任务暴露出来了这个bug。虽然0 pin是正常的,但是曝光里面不正常,所以就丢去这一个人影响也不大。然后就过滤了pin。

 

最终,纠结的一天过去了,今天也上不了线了。然后我跑了下程序,不到5分钟一天的数据跑完了。。

 

最终总结了一下:

1. 初期的数据调研很重要,哪怕花现在的两倍或者三倍时间都值得,因为现在已经跑了三四次数据了

2. codereview的重要性,如果大家都遵守约定,提交cr,这样的话UDF里面就不会漏掉0这个pin了

3. 排查问题要进行多方面的了解,如果我了解到只是增加了10%,那么我就会直接找特殊情况了,本来我以为是两倍或者三倍了

4. 加强沟通,前期不沟通,后期的修改成本是很高的

5. 架构的设计,设计一定要合理,否则会出现工作量加重后者难以扩展的情况

6. 二八原则,编码只占20%,其他占80%

 

最近很苦逼,但是痛并快乐着酷

 

下面是我的一个个人公众帐号,微信扫一扫,可以关注一下哦~


2
2
分享到:
评论
2 楼 商人shang 2015-11-10  
qindongliang1922 写道
楼主的集群多大,2800万数据,会导致内存溢出? 我以前也用pig分析电商数据,计算各种曝光,点击,下单率,没有出现过楼主说的问题


不是说一共有2800w,而是加载到UDF里面的数据有2800w,这样的话,内存就很大了。整体的曝光数据是亿级别的
1 楼 qindongliang1922 2015-11-10  
楼主的集群多大,2800万数据,会导致内存溢出? 我以前也用pig分析电商数据,计算各种曝光,点击,下单率,没有出现过楼主说的问题

相关推荐

    机械设计同轴剥皮机sw18可编辑非常好的设计图纸100%好用.zip

    机械设计同轴剥皮机sw18可编辑非常好的设计图纸100%好用.zip

    node-v12.22.5-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Honeywell BR-310 条形码扫描器手册

    Honeywell BR-310 条形码扫描器手册

    中国诗词APP「西窗烛」产品需求文档.docx

    中国诗词APP「西窗烛」产品需求文档

    unity开发的教程.doc

    当然可以!Unity开发是一个非常受欢迎的游戏开发工具,适合初学者入门。以下是一些Unity开发的教程,供您参考: 1. Unity官方文档:Unity官方网站提供了详细的文档和教程,包括Unity的基本概念、工具使用、场景编辑、游戏逻辑编写等。您可以根据自己的需求和水平选择相应的教程。 2. Unity官方的Unity Creator在线课程:Unity Creator是Unity的在线教育平台,提供了许多免费的Unity Creator教程和课程,适合初学者入门。您可以根据教程的内容和难度选择适合自己的课程。 3. Unity中文社区:Unity中文社区是一个非常活跃的社区,提供了许多Unity开发的教程和资源。您可以搜索相关的教程和资源,与其他开发者交流和学习。 4. Unity教程网站:有许多网站提供了Unity开发的教程和资源,如游戏学院、编程教室等。这些网站提供了许多基础和进阶的Unity开发教程,适合初学者和有一定基础的开发者。 5. Unity插件开发:Unity插件开发是Unity开发的一个重要方向,适合有一定基础的开发者。您可以学习如何创建自定义的Unity插件,

    node-v12.19.1-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    惠普服务器安装说明

    惠普服务器安装说明

    node-v12.18.2-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v12.22.4-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    python烟花代码示例

    附件是一个简单的烟花效果的代码示例。 在Python中,可以使用多种方式来模拟烟花效果,其中一种常用的方法是使用turtle模块,它提供了一个画布和一个小海龟,可以用来绘制各种图形。 这段代码首先导入了turtle模块和random模块,然后在屏幕上绘制了10次烟花爆炸的效果。每次爆炸都是由5个小圆组成,颜色随机选择,圆的大小也是随机的。 请注意,这段代码需要在支持turtle模块的Python环境中运行,并且需要有图形界面的支持。如果你在没有图形界面的环境中(比如某些服务器或者命令行界面),这段代码可能无法正常运行。

    基于MATLAB和Simulink通过正运动学和逆运动学设计了PID控制器.zip

    基于MATLAB和Simulink通过正运动学和逆运动学设计了PID控制器.zip基于MATLAB和Simulink通过正运动学和逆运动学设计了PID控制器.zip基于MATLAB和Simulink通过正运动学和逆运动学设计了PID控制器.zip基于MATLAB和Simulink通过正运动学和逆运动学设计了PID控制器.zip基于MATLAB和Simulink通过正运动学和逆运动学设计了PID控制器.zip基于MATLAB和Simulink通过正运动学和逆运动学设计了PID控制器.zip

    基于python的深度学习的声学回声消除基线代码

    基于深度学习的声学回声消除基线代码 # 数据准备 按照以下文件结构,放好语音,我直接使用的是AEC-Challenge 数据集中的合成数据集 ```angular2html └─Synthetic ├─TEST │ ├─echo_signal │ ├─farend_speech │ ├─nearend_mic_signal │ └─nearend_speech ├─TRAIN │ ├─echo_signal │ ├─farend_speech │ ├─nearend_mic_signal │ └─nearend_speech └─VAL ├─echo_signal ├─farend_speech ├─nearend_mic_signal └─nearend_speech ``` 数据处理脚本为 `data_preparation.py`

    Dell Edge Gateway 3002 安装和操作手册

    Dell Edge Gateway 3002 安装和操作手册

    88888888888.mp3

    88888888888.mp3

    Java毕设之ssm002学院党员管理系统+jsp.rar

    环境说明: 开发语言:java 框架:springboot,vue JDK版本:JDK1.8 数据库:mysql5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat11+ 开发软件:idea/eclipse(推荐idea) Maven包:Maven3.3.9+

    node-v12.18.4-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    KR-18 y KR-24 INSTALACIÓN INTRODUCCIÓN

    KR-18 y KR-24 INSTALACIÓN INTRODUCCIÓN KR-18 和 KR-24 安装说明

    node-v12.22.4-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Qt开发的教程.doc

    Qt开发是一种使用Qt库进行应用程序开发的强大技术。Qt是一个跨平台的C++应用程序开发框架,它提供了许多用于创建图形用户界面(GUI)和网络应用程序的工具。 以下是一个简单的Qt开发教程,它涵盖了Qt的主要概念和基本步骤: **步骤1:安装Qt** 首先,你需要安装Qt库。你可以从Qt官方网站下载并安装它。安装完成后,你还需要安装一些开发工具,如Qt Creator。 **步骤2:创建你的第一个Qt项目** 在Qt Creator中创建一个新的项目。你可以选择创建一个简单的窗口应用程序,这将为你提供一个基本的框架来开始你的开发工作。 **步骤3:理解Qt的基本概念** 理解Qt的基本概念是学习Qt开发的关键。这些概念包括窗口、控件、布局、信号和槽等。理解这些概念将帮助你更好地理解如何使用Qt库来创建GUI应用程序。 **步骤4:学习布局系统** Qt的布局系统允许你轻松地管理窗口中的控件位置。理解布局系统将帮助你创建具有整洁和一致外观的GUI应用程序。 **步骤5:使用信号和槽** 信号和槽是Qt中用于处理事件和交互的主要机制。学习如何使用信号和槽来连接控件的行

    一体式离子传感器 用户手册 PR-3003

    一体式离子传感器 用户手册 一体式离子传感器 用户手册 (485 型) PR-3003-*-N01-* Ver 1.0

Global site tag (gtag.js) - Google Analytics