Author Archive | idouba

内推职位–华为云计算

 

发布一个招聘信息,有意向的同学简历可以发到下面的两个邮箱,机会比较好,部门正在扩大规模。

部门:华为云计算PaaS

职位:云计算开发工程师,架构师,解决方案架构师,测试工程师,测试架构师

技术关键字:Kubernetes、Mesos、Openstack、Docker、Kafka、Redis、Nginx、Netflix等。

开发语言:GO、Java、C/C++、Python等

要求:本科以上,5年+

Base:杭州、深圳、西安、北京、南京

加分:了解熟悉AWS、AZURE、GAE等相关

级别:15,16,17,18。。。

 

Mail:idouba@idouba.net  cc: zhangchaomeng@huawei.com

Tags: , ,

Comments { 1 }

Java NIO 要点总结

来自Jenkov.com的比较完整但是足够brief的一个系列:Java NIO Tutorial,介绍了NIO的主要机制和其中几个重要对象的作用和工作。

1. 三个对象

NIO核心的三个对象:

  • Channels
  • Buffers
  • Selectors

简单讲三个对象:Channel 像IO的流,Buffer就像名字一样,就是个缓存。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。IO是面向流的,连接到一个源或者目标(对应于输入流或者输出流),如Java IO Overview中说明,比较典型的数据源和目标类型有:Files、Pipes、Network Connections、In-memory Buffers (e.g. arrays)、System.in, System.out, System.error。而Chanel也[......]

阅读全文

Tags:

Comments { 0 }

从Count看Oracle执行计划的选择

一、 前言

在调查一个性能问题的时候,一个同事问道,为什么数据库有些时候这么不聪明,明明表上有索引,但是在执行一个简单的count的时候居然全表扫描了!难道不知道走索引更快么?

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

二、实验条件

表中有20001000条记录,有二十多个字段,包括几个长度比较大的[......]

阅读全文

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 }