Archive | 二月, 2014

牵一只蜗牛去散步

douma发给我的一篇文章,让douba好好阅读。

上帝给我一个任务
叫我牵一只蜗牛去散步。
我不能走太快,
蜗牛已经尽力爬,为何每次总是那么一点点?
我催它,我唬它,我责备它,
蜗牛用抱歉的眼光看着我,
彷佛说:「人家已经尽力了嘛!」
我拉它,我扯它,甚至想踢它,
蜗牛受了伤,它流着汗,喘着气,往前爬…
真奇怪,为什么上帝叫我牵一只蜗牛去散步?
「上帝啊!为什么?」
天上一片安静。
「唉!也许上帝抓蜗牛去了!」
好吧!松手了!
反正上帝不管了,我还管什么?
让蜗牛往前爬,我在后面生闷气。
咦?我闻到花香,原来这边还有个花园,
我感到微风,原来夜里的微风这么温柔。
慢着!我听到鸟叫,我听到虫鸣。
我看到满天的星斗多亮丽!
咦?我以前怎么没有这般细腻的体会?
我忽然想起来了,莫非我错了?
是上帝叫一只蜗牛牵我去散步。分享:
教育孩子就像牵着[......]

阅读全文

Tags: ,

Comments { 0 }

要回家了,要离家了

要回到老家了,看老妈了。老妈摔伤躺着床上已经二十多天了,一直拖到现在才回家,很惭愧,很心疼。再有两个小时的飞机行程就到家了,看看父母,看看奶奶。晚上就可以躺在奶奶的大炕上了。

要离开小家了,想着小家。豆豆和以前每天一样在电话那头嗷嗷的喊叫,把douba的心都勾引到二十六七分钟自行车车程的小家。惦记着豆豆,惦记着douma。

机场大巴可真快呀!感觉比平时打车还快。二十分钟就到了机场了。

刚才打电话豆豆一直在喊叫,听douma说我们豆豆在吃饭的时候,和妈妈姥姥围在餐桌边上,眼睛一直还望门口看,豆豆是在等爸爸回家呀!douba真感动!

今天是douba的生日。

 

 

Tags:

Comments { 0 }

oracle索引原理精简总结

结合使用整理Oracle的索引,主要权威的来自于Oracle? Database ConceptsOracle? Database Performance Tuning Guide

尝试用最少的字数介绍oracle的几种常用索引原理,主要是想简单分析其存储结构来说明其检索方式,和解释为什们某种索引使用与某种场合。(数据结构中最简单的ArrayList和LinkedList的使用场景)。阐述原因只有一个,就是因为其存储结构决定的。

B树索引?(默认类型)

存储结构:

B+树,不多描述。和其他几种关系数据库一样,就是根据索引列(一个或多个)来构造一个B+树来存储索引。非叶子节点两个区域:存储下级子节点的值的范围,和到对应子节点地址(典型B+树的结构),主要作用是导航;叶子节点存储索引的键值和行的ROWID。另外,索引的叶子节点间构成了一个双向链表。类似mysql的myisam引擎[......]

阅读全文

Tags: ,

Comments { 1 }

【hadoop代码笔记】Mapreduce shuffle过程之Reduce获取mapper输出

一、概要描述

上篇博文从代码分析来说明在map端是如何将map的输出保存下来等待reduce来取,在本篇文章中将重点分析reduce端的代码,即Reduce端如何在ReduceTask执行之前把其需要的输出拷贝过来,然后作为reduce的输入进行执行。本篇文章中的大部分内容在?hadoop作业提交之Child启动reduce任务一文中有过描述。本篇只是着重介绍Reduce获取输入部分内容。即reduce task在执行之前的不断地拉取当前job里每个map task的最终结果,然后对从不同地方拉取过来的数据不断地做merge,也最终形成一个文件作为reduce task的输入文件。

Reduce需要集群上若干个map任务的输出作为其特殊的分区文件。Map 任务完成后,会通知其父tasktracker状态更新,然后tasktracker通知jobtracker。通过心跳机制来完成。因此jobtracker知道map输出和tasktracker之间的映射关系。Reducer的一个getMapCompletionEvents线程定期询问jobtracker以便获取map输出位置。每个map任务完成的时间可能不同,因此只要有一个任务完成,reduce任务就开始复制其输出。这就是reduce任务的复制阶段。其实是启动若干个MapOutputCopier线程来复制完所有map输出。在复制完成后reduce任务进入排序阶段。这个阶段将由LocalFSMerger或InMemFSMergeThread合并map输出,维持其顺序排序。在reduce阶段,对已排序输出的每个键都要调用reduce函数,此阶段的输出直接写到文件系统,一般为HDFS上。(如果采用HDFS,由于tasktracker节点也是DataNoe,所以第一个块副本将被写到本地磁盘。 即数据本地化)

二、 流程描述

1.在ReduceTak中 构建ReduceCopier对象,调用其fetchOutputs方法。
2. 在ReduceCopier的fetchOutputs方法中分别构造几个独立的线程。相互配合,并分别独立的完成任务。
2.1 GetMapEventsThread线程通过RPC询问TaskTracker,对每个完成的Event,获取maptask所在的服务器地址,即MapTask输出的地址,构造URL,加入到mapLocations,供copier线程获取。
2.2构造并启动若干个MapOutputCopier线程,通过http协议,把map的输出从远端服务器拷贝的本地,如果可以放在内存中,则存储在内存中调用,否则保存在本地文件。
2.3LocalFSMerger对磁盘上的map 输出进行归并。
2.4nMemFSMergeThread对内存中的map输出进行归并。
3.根据拷贝到的map输出构造一个raw keyvalue的迭代器,作为reduce的输入。
4. 调用runNewReducer方法中根据配置的Reducer类构造一个Reducer实例和运行的上下文。并调用reducer的run方法来执行到用户定义的reduce操作。
5.在Reducer的run方法中从上下文中取出一个key和该key对应的Value集合(Iterable<VALUEIN>类型),调用reducer的reduce方法进行处理。
6. Recuer的reduce方法是用户定义的处理数据的方法,也是用户唯一需要定义的方法。
[......]

阅读全文

Tags: , , ,

Comments { 0 }

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

一、概要描述

shuffle是MapReduce的一个核心过程,因此没有在前面的MapReduce作业提交的过程中描述,而是单独拿出来比较详细的描述。 根据官方的流程图示如下:

mapreduce shuffle

? 本篇文章中只是想尝试从代码分析来说明在map端是如何将map的输出保存下来等待reduce来取。 在执行每个map task时,无论map方法中执行什么逻辑,最终都是要把输出写到磁盘上。如果没有reduce阶段,则直接输出到hdfs上,如果有有reduce作业,则每个map方法的输出在写磁盘前线在内存中缓存。每个map task都有一个环状的内存缓冲区,存储着map的输出结果,默认100m,在每次当缓冲区快满的时候由一个独立的线程将缓冲区的数据以一个溢出文件的方式存放到磁盘,当整个map task结束后再对磁盘中这个map task产生的所有溢出文件做合并,被合并成已分区且已排序的输出文件。然后等待reduce task来拉数据。

二、 流程描述

  1. ?在child进程调用到runNewMapper时,会设置output为NewOutputCollector,来负责map的输出。
  2. ?在map方法的最后,不管经过什么逻辑的map处理,最终一般都要调用到TaskInputOutputContext的write方法,进而调用到设置的output即NewOutputCollector的write方法
  3. NewOutputCollector其实只是对MapOutputBuffer的一个封装,其write方法调用的是MapOutputBuffer的collect方法。
  4. MapOutputBuffer的collect方法中把key和value序列化后存储在一个环形缓存中,如果缓存满了则会调用startspill方法设置信号量,使得一个独立的线程SpillThread可以对缓存中的数据进行处理。
  5. SpillThread线程的run方法中调用sortAndSpill方法对缓存中的数据进行排序后写溢出文件。
  6. 当map输出完成后,会调用output的close方法。
  7. 在close方法中调用flush方法,对剩余的缓存进行处理,最后调用mergeParts方法,将前面过程的多个溢出文件合并为一个。

[......]

阅读全文

Tags: , , ,

Comments { 2 }