2015年5月7日

从Search Sort到Join

摘要: 发表于《程序员》2015年4月B的一篇文章,在博客归档下。根据杂志社要求,在自己博客发表该文章亦须注明:本文为CSDN编译整理,未经允许不得转载,如需转载请联系market#csdn.net(#换成@) Join原理在数据库厂商的文档中和经典的《数据库系统概念》中分别从应用和理论的角度上描述的足够详细。本文尝试从另外一个视角,通过数据结构中最基础的查找排序算法(Search&Sort)来类推和归纳最常用的三种Join方式的原理:嵌套循环连接(Nested Loop Join)、排序归并连接 (Sorted Merge Join)、 哈希连接(Hash Join)。进而了解三种方式之间的联系、演变以及原理决定的其应用上的细微差别。说明这几种表连接方式是数据库的技术,但和数据库索引等其他数据库技术一样,也是是典型的数据结构的延伸。 阅读全文

posted @ 2015-05-07 15:16 idouba.net 阅读(550) 评论(0) 推荐(0) 编辑

2014年12月23日

实际例子描述和分析“猎豹抢票跨站推荐功能有票刷不到”的疑似bug

摘要: 快过年了,又到了一年抢票时。今年douba和douma计划要带着doudou回姥姥家。昨天在家用抢票软件居然发现了一个bug,那就是在猎豹抢票中跨站推荐的车票几天里一直是没有,但是在12306手动尝试不同的跨站可以买到票,怀疑是猎豹在处理车次信息的时候对于变化的车次没有考虑到所致。在文中以实际操作尝试对这个bug做个比较详细的描述,并加上一点定位和分析,希望可以帮助这款神器的使用者和开发者提供些有用信息。按照douma的指示,今天上班来中午吃完饭不休息了,匆匆写下发表出来,供其他焦急的抢票战友们借鉴。不要只是懒懒的用工具刷,过于依赖神器,该动手时候要动动手才有可能抢到票。祝大家都能抢到心仪的车票。 阅读全文

posted @ 2014-12-23 08:24 idouba.net 阅读(766) 评论(2) 推荐(1) 编辑

2014年7月25日

最简单例子图解JVM内存分配和回收

摘要: 文中通过最简单的一个例子来demo下这jvm对象分配和回收的整个过程,代码很短,很简单,希望剖析的细一点,包括每一步操作后对象的分配和回收对内存堆产生的影响。设定上包括对堆中年轻代(年轻代中eden区和survivor区)、年老代大小的设定,以及设置阈值控制年轻代到年老代的晋升。 阅读全文

posted @ 2014-07-25 14:54 idouba.net 阅读(2262) 评论(5) 推荐(2) 编辑

2014年4月8日

B树在数据库索引中的应用剖析

摘要: 重点介绍数据结构中最经典的树(B树)在数据库索引中最经典的的几种应用,也会涉及到几种数据库中对此支持的细微不同,以期比较完整的讲明白其实现原理。最终会发现这几种被不同数据库厂商冠以不同名字东西原理上其实差不多,理论上其实是一个东西。本文只是略微空洞的介绍其实现,不涉及有任何具体的使用建议。 阅读全文

posted @ 2014-04-08 15:54 idouba.net 阅读(991) 评论(0) 推荐(0) 编辑

2014年3月28日

从Count看Oracle执行计划的选择

摘要: 试图从最简单的count来重新了解oracle查询计划的选择,以及最终产生的结果。虽然有些结果会让人觉得有些意外,并且可能会鄙视,这个查询计划选择真的不够聪明。但稍微用心点的去了解,做的已经足够细致了。大多数情况下,根据我们输入的信息,来自输入的SQL、表结构、索引状况、统计信息,会得出一个比较优的计划。所以和前面一直试图讲到索引和join方式一样,所有这样的选择不是因为数据库厂商这样规定的,而是基于存储的数据的实际情况,就应该(甚至说不得不)这么去选择。 阅读全文

posted @ 2014-03-28 11:12 idouba.net 阅读(1755) 评论(1) 推荐(1) 编辑

2014年2月26日

【hadoop代码笔记】Mapreduce shuffle过程之Map输出过程

摘要: 一、概要描述 shuffle是MapReduce的一个核心过程,因此没有在前面的MapReduce作业提交的过程中描述,而是单独拿出来比较详细的描述。 根据官方的流程图示如下:本篇文章中只是想尝试从代码分析来说明在map端是如何将map的输出保存下来等待reduce来取。 在执行每个map task时,无论map方法中执行什么逻辑,最终都是要把输出写到磁盘上。如果没有reduce阶段,则直接输出到hdfs上,如果有有reduce作业,则每个map方法的输出在写磁盘前线在内存中缓存。每个map task都有一个环状的内存缓冲区,存储着map的输出结果,默认100m,在每次当缓冲区快满的时候由一个 阅读全文

posted @ 2014-02-26 20:48 idouba.net 阅读(3305) 评论(1) 推荐(1) 编辑

2014年2月7日

【hadoop代码笔记】hadoop作业提交之汇总

摘要: 汇总自己空间内关于mapreduce作业提交的几篇博文,对mapreduce作业提交过程的代码进行完整描述。 阅读全文

posted @ 2014-02-07 16:51 idouba.net 阅读(1486) 评论(0) 推荐(0) 编辑

2014年1月28日

【Hadoop代码笔记】Hadoop作业提交之Child启动reduce任务

摘要: 一、概要描述在上篇博文描述了TaskTracker启动一个独立的java进程来执行Map任务。接上上篇文章,TaskRunner线程执行中,会构造一个java –D** Child address port tasked这样第一个java命令,单独启动一个java进程。在Child的main函数中通过TaskUmbilicalProtocol协议,从TaskTracker获得需要执行的Task,并调用Task的run方法来执行。在ReduceTask而Task的run方法会通过java反射机制构造Reducer,Reducer.Context,然后调用构造的Reducer的run方法执行red 阅读全文

posted @ 2014-01-28 16:28 idouba.net 阅读(1691) 评论(0) 推荐(0) 编辑

2014年1月23日

【Hadoop代码笔记】Hadoop作业提交之Child启动map任务

摘要: 一、概要描述在上篇博文描述了TaskTracker启动一个独立的java进程来执行Map或Reduce任务。在本篇和下篇博文中我们会关注启动的那个入口是org.apache.hadoop.mapred.Child的这个Java进程是如何执行用户定义的map或Reduce任务的。接上篇文章,TaskRunner线程执行中,会构造一个java –D** Child address port tasked这样第一个java命令,单独启动一个java进程。在Child的main函数中通过TaskUmbilicalProtocol协议,从TaskTracker获得需要执行的Task,并调用Task的ru 阅读全文

posted @ 2014-01-23 12:56 idouba.net 阅读(2166) 评论(0) 推荐(1) 编辑

2014年1月22日

【Hadoop代码笔记】Hadoop作业提交之TaskTracker 启动task

摘要: 一、概要描述在上篇博文描述了TaskTracker从Jobtracker如何从JobTracker获取到要执行的Task。在从JobTracker获取到LaunchTaskAction后,执行addToTaskQueue方法来把要执行的Task加入到queue。在本篇博文中,我们来关注下该方法后,TaskTracker怎么来处理这些Task。实际上,TaskTracker初始化时,会初始化并启动两个TaskLauncher类型的线程,mapLauncher,reduceLauncher。在TaskTracker从JobTracher获取到任务后,对应的会把任务添加到两个TaskLauncher 阅读全文

posted @ 2014-01-22 15:57 idouba.net 阅读(2001) 评论(0) 推荐(2) 编辑

导航