攻城师的沟通修炼

软件开发做久了,都会有一些角色的转变,从最初的直接leader分配具体工作来做,到后来需要和不同部门一起协作开发,沟通都是必备技能与工具,无论升级为TL(team leader)、PM(project manager),还是继续做软件工程师。最初做研发时,可能更多的只是关注技术性的专业知识上,觉得做好分配给自己的本职工作是唯一目标。当你技术能力提升到一定高度的时候,领导会分配更大的项目让你负责,这时你发现,写代码不再是你8小时的全部内容,你需要和产品经理探讨需求,需要和其他攻城师讨论技术方案,需要和其他部门协调项目进度,需要和测试人员确认测试流程。。。。等等等等,你突然发现,沟通变得越来越重要,它已经成为你完成特定行动唯一真正有效的手段。
这种转型,对很多工程师来说是痛苦的,很多人当初选择做研发是觉得程序开发只面对机器而不是人,正好符合自己不善言辞的木讷内向性格,当自己在这行业学到很多技术,自以为可以松一口气的时候,突然发现自己的性格竟然不适合这个行业了,你是否在有了很多技术经验后有过这样的迷茫?
你是否在和别人沟通需求时这个表情?

你是否也像我曾经一样,在别人说观点时一直在寻找一次讲话的机会?或者干脆马上粗暴的打断别人来表达自己的立场?在产品经理提了一个大的需求改动时马上说这个做不了?在提出技术方案后意识到错误,但为了程序员的自尊以及觉得其他人都不懂技术而不去做道歉不做修改?在测试人员指出某个问题时觉得测试人员太过于较真,觉得这种情况一万年也不会出现而懒得修改?
最近读了一本工程师修炼的书,里面讲了最重要的一条就是沟通。
无论你从程序员升级为TL,还是PM,还是架构师,或者是高级工程师,其实都是一种晋级。沟通技术知识对你往上升是非常关键的技能。这种技能通常意味着维护你的职位,明确特定项目的潜在风险和当前问题。在单位等级结构的这一层上,你应该阻止产生问题、寻找问题并且解决问题。你的上级都在盯着看你的每一步动作。压力往往会非常大。对于靠技术吃饭的人来说,若想迈出跳至管理的第一步,阶梯上的下个台阶的特性已经大大变化了。尤其是,首先要求的技能是沟通范围、数量大大地拓宽了。

一、沟通原则
学习有效沟通是一个终身的过程——永远都有改善的余地。要学习的沟通原则包括:先听后说、专心致志(人和心思在一处)、正面思考等,这些原则有助于建立与别人的信任关系,使你成为更高超的沟通者。

1. 先听后说
你有没有发现自己在某次谈话中总是想寻求一次讲话的机会,而没有真正在听别人说什么?当你没有听时,你传递给那个对你讲话的人什么信息呢?
至少表面上,你显得不在乎别人说什么。大部分人会很快厌倦这样的谈话,因为他们说的话白白在空气中传播却没人去听。说话的人也许会想他还有更好的事要做,而结束此次谈话。如果你只是偶尔这样做,这种行为没什么大不了的。如果这是你的习惯做法,那么你是在自己与别人之间构筑一道墙。
你听的时候,是不是在找机会纠正对方?即便谈论的话题在往前走,但是你的思路还停留在刚才的某一点上?
这种情况说明,我们并没有在听别人说什么。讲话的人对你很在乎,从其忙碌的工作中抽出时间,为你提供这些宝贵的信息,所以应该认真去听他说什么。
当有人与你说话时,要看着他说,并试着理解他想沟通的内容。给对方足够的时间来表达他的观点,然后再向其询问要澄清的问题。向他表达非语言的反馈,例如点头,让他知道你在关注这次谈话。
我认为罗马人Epictetus说得好:“我们有两个耳朵,一个嘴巴,所以我们应该多听少说。”
2. 专心致志
不管你在哪里,都应专心致志。生活中有许多事情要分神,例如这个周末你要做什么,几分钟前开会回来如何解决会上的问题,怎样找个办法告诉老板某个负面的消息,小孩今晚的英式足球比赛几点开场……所有这些琐事都很容易让你想入非非。
一般来说,人在任何时刻最多只能同时处理7件±2件那么多的事。如果你的脑袋全是一些无关紧要的琐事,你就无法专心致志地做事。要是有人对你说话,你就会完全听不到他在讲什么。倘若他在问你问题,你可能要他们再说一遍。这种情况下,你其实是在浪费别人的时间,他们不会高兴的。如果房间里有个执行官,你就会给人家留下一个持久的坏印象:真是个浪费钱的家伙!
请你读些时间管理方面的书,列出每天需要关注事情的清单计划。在计划中安排好任务的优先级(当天、本周等),并标识每个任务准备投入的时间。这个办法能够让你通过计划安排好每件事,节省你的精力去记忆周围各种正在发生的事。
如果某个会议不是真的需要你参加,你就不要去;假如确实需要你参加,就一定要去,而且人和心思都花在那里。
我发现,坐直、将脚放在座位正下方、做笔记、直视正在讲话的人,能够自然而然地全神贯注于会议正在进行的事情,从说话和肢体语言两方面都给人以积极参与的正面印象。
不管你做什么,都要专心致志!
3. 正面思考
当你表达信息时,总有许多种方法去传递它们。信息需要真实和准确,然而表现出其意义的方式可以多种多样。
你可以以积极意义或消极意义提供信息。你可以基于所期望的结果选择某种方法。也可以采用不偏不倚的方式,不带情绪地列举事实,尽管这通常很难做到。
从沟通的观点来看,人们容易注意负面的东西。通常负面消息总会带来恐惧(当我感觉恐惧邻近时,我会把它当做“要求集中精力的行动”的信号)。
作为架构师,你需要避免不必要的偏见信息,让别人能够选择他们要关注的信息。你可以提供若干种替代方案,但这些方案应当是客观平等的。你需要察觉可能的办法,而不是为别人留下疑惑。
4. 尽早道歉
在一天的事务中,你可能注意到对他人做的某个事情不合适或不正确。记住放下自尊去给受影响的对方道一个歉。向别人诚心道歉并不是好玩或者容易之举,但你可以赢得别人的尊敬,展示你在尽力成长,尝试变得更好的意图。
如果你道歉,对方就有可能重新审视事情,而原谅你带来的任何苦恼伤痛。有些让人尴尬的事情转而有了积极意义。你与那人的关系就有了增进的机会,而不是就此冷淡。
人的本能倾向就是让冒犯别人后的情势不了了之。遗憾的是,你可能埋下了让它长大成祸患的种子,以致对你造成长期的影响。被得罪的人可能会耿耿于怀,在很长很长时间内记住这件事。那个人也许会把这件事告诉别人,说你是个什么类型的人。你和此人及周围其他人的交往能力可能大打折扣。最后,或许你已经忘记做过的事,但是对方却没有忘记。
道歉时,你要清楚地表达出要道歉的是什么,你说的是什么意思。如果你不是诚心道歉,虚假的说辞可能把事情弄得更糟。如果你不能表达诚意,就不要道歉,但你的目标应当是努力与你所交往的人修缮积极的关系。避免让道歉使你向错误的方向发展,限制你的个人成长。
5. 不要在缺陷上招致恼羞成怒
当你在开评审会(例如产品概念评估、需求评审、设计评审、代码评审、测试评审、产品发布评审)时,通常会检查出评审项目的一些缺陷。评审项目的作者对于这些暴露出的缺陷当然会感到不自在。

二、沟通策略
在我们研究了沟通的核心原则后,现在你可以应用一系列策略来展示恒定、高效的沟通风格。
1,多说“是”,少说“不是”
多想解决方案,解决问题,而不是粗暴的反对。
2,抑制想自卫的冲动
通常在交谈中,当我们听到并不完全对自己有正面意义的事情时,我们可能会找借口,我们可能会找办法转移话题,并责怪他人,以使自己脱离干系。或者我们想强词夺理,以阐述那些语句。应当避免做出此反应的冲动。相反,代之以等待,并接受别人所说的话。
在上一段描述的反应中,会谈的真正兴趣已经从对别人转移到你身上。听别人说话的行为至少暂时结束了,我们开始与会谈者发出警示信号:“我们把话题引向另一个方向吧,一个和我没关系的方向。”注意你正在用的肢体语言—胳膊交叉在胸前,或者头转向一边告诉别人“我不想听了”。
问自己这个问题:我能从这个人说的话中学到什么?”通常,他给出的信息也许并不是你乐意听到的,但其动机是好的,仍是你接受信息并获得个人成长的机会。
抑制想自卫的冲动的一个例外就是当手头的问题涉及企业政策或你的正直时。如果别人说的话使你真正涉及与公司政策冲突或你出于正直未做某事(假如,你已经正确做出了行动)时,你需要立即抨击这些说法。你可能想用澄清问题的办法来明确要点,比如“你的意思是我做过某事吗”。如果别人说“是的”,你就以“这并不准确”来明确回应;倘若人家回答“不是”,要感谢他澄清了此事。

转自:http://tech.weibo.com/?p=2103

 

Hadoop内置作业调度器与调度平台的集成

Hadoop 现在几乎已经成为业界在大数据上事实的标准,越来越多的企业开始采用hadoop进行数据的存储及处理。既然涉及数据处理,一个不可不提的术语就是“作业” or “job”,大量的作业必然要引入作业管理及调度,hadoop也不能例外。

传统企业中的调度工具,不管像是简单crontab,或者企业级的如control-M,很容易注意到,他们都主要考虑的是将作业分配到集群中的某一台,或者其中某几台上面运行。但是像hadoop  这种大规模分布式计算的集群,考虑都不足。通常Hadoop整个集群是作为一个整体对外服务,考虑的是集群整体资源利用的最大化,HDFS的多副本策略使得集群某一单独节点运行是否正常不再重要,hadoop的一个重要理念是移动计算而不是数据,所以hadoop会尽量在数据存储的节点进行运算,而传统调度工具需要支持这些特点就需要进行大量的改造,本文只讨论传统调度工具如何与hadoop内置调度器更好结合。作业监控部分则不在本文讨论范围内。

 hadoop 的内置调度机制

在 2008 年以前,集成在 JobTracker 中的原有调度算法仅有 FIFO。在 FIFO 调度中,JobTracker 从工作队列中拉取作业,最老的作业最先。当hadoop最初出现的时候,主要是设计用来进行大型的批处理例如网页索引,日志挖掘,用户将任务提交至队列,而后集群按照提交的先后顺序执行即可,FIFO也足够用了。然后,当越来越多的数据放在hadoop集群后,另一个问题出现了,人们开始希望在多个用户间共享集群。而此时Hadoop 只支持与 JobTracker 逻辑混合在一起的单一调度器。

于是2008年5月18日有人提交了一个Improvement的issue 。HADOOP-3412 (Refactor the scheduler out of the JobTracker ),调度器从jobtracker的代码中分离出来,调度器变成可插入式的,在JobTracker中加载和调用,用户可以在配置文件mapred-site.xml中的mapred.jobtracker.taskScheduler属性中指定自己的调度器。

当前Hadoop自带的调度器随着hadoop版本的不同会略有区别,但是最常见的三种调度器,分别是FIFO(默认调度器),Capacity Scheduler (容量调度器)和FairScheduler(公平调度器)以下逐一介绍其算法及其适用场景:

1. FIFO

 1.1 简介

FIFO(First In First Out)算法。所有用户的作业都被提交到一个队列中,然后由JobTracker按照作业提交时间的先后顺序选择将被执行的作业。 在hadoop的后期版本中,增加了优先级处理功能,可以通过设置mapred.job.priority属性 或者在JobClient 调用 setJobPriority() 方法来进行优先级设置(优先级可以设置为 VERY_HIGH, HIGH, NORMAL, LOW, VERY_LOW), Job scheduler在选择下一运行作业时,会选择一个最高优先级的作业,而后再根据提交时间排序,但是由于FIFO调度器不支持抢占,所以一个高优先级作业仍然可能被一个长期运行的低优先级作业所阻塞。FIFO不考虑各种作业资源需求的不同。

FIFO 是hadoop的默认调度器。

1.2 与传统调度工具的集成

FIFO方式适用于单系统,单用户的hadoop集群,作业提交给hadoop集群时一般需要传递的参数只有优先级

调度平台改造部分:

1)增加作业类型:map-reduce,hive,sqoop 。使得作业的命令行可以在调度平台中配置产生。

2)将作业的优先级转换成为hadoop标准(VERY_HIGH, HIGH, NORMAL, LOW, VERY_LOW), 并在想hadoop集群提交作业时同时设置作业优先级。

优先级设置的方法有以下两种

#1:作业源码中调用API       JobConf.setJobPriority(JobPriority.NORMAL)

#2:在执行的时候在命令行中添加以下参数 -D mapred.job.priority=HIGH

实际调度中通常会由调度平台动态生成命令行的方式进行。

 

2.Capacity Scheduler

2.1 简介

CapacityScheduler 是Yahoo开发并捐献的,容量调度器是设计目标是让hadoop应用程序真正成为一个共享的,多租户的集群,并且使得集群的吞吐量和利用率最大化。说的有点绕口,咱们细说下容量调度器的来龙去脉。

传统上企业中每个系统都会有自己的私有服务器用来保证自己的系统在高峰情况,或者接近高峰情况下也能达到预设的SLA,而这样基本上都会导致很差的资源平均利用率,并且企业内众多的独立集群也带来更大的管理成本。

在企业内共享大规模的hadoop集群使得我们可以更加高效,低成本的使用计算资源,但是人们总是担心使用共享集群的话,如果其他系统占用了大量资源的话将会使得他们自己的应用在需要的时候无法获取足够的资源以致应用无法达到预定的SLA.

而容量调度器正是设计用来共享一个大规模的集群,并给予每个系统性能保证。中心思想是各系统按照自己计算的需要,共同投资一个hadoop集群,集群中的可用资源在各系统中分享。这样的集群有个附加的好处是单个系统可以利用别的系统的闲置计算资源进行计算,使得资源的利用更加弹性及高效。

而在各系统间共享集群就必须使系统对多租户( multi-tenancy)设计有很强的支持,因为必须给予每个系统性能保证。并且要确保集群在遇到一个异常的应用/用户/数据集等也不受影响。CapacityScheduler提供一系列严格的限制来确保一个应用/用户/队列不能消耗不恰当的集群资源,同时CapacityScheduler还限制了一个单一的用户/队列可以初始化/等待的应用程序数量来确保集群的公平使用和稳定性。

利用闲置资源有个问题,大部分的系统是一个大的项目群,里面有众多的子系统,他们希望闲置资源优先用于满足同一项目群内子系统的需求,如仍有剩余再共享给其他系统使用,[MAPREDUCE-824]提出了层次队列(hierarchical queues )的概念,资源优先在子队列中共享,如还有剩余再共享给其他队列。此功能在0.21.0版本中实现。

2.2 特性

以下是Apache Hadoop 2.0.2-alpha官方文档中的特性说明,很官方,很权威。

 

层次队列-层次队列的支持可以确保资源在一个系统的子队列中共享,而后才允许其他队列使用空闲资源,使得资源分配更加可控及可预测。

性能保证-各个队列只分配了集群的一小部分性能,这样只有部分容量供队列进行处置。所有提交进同一个队列的应用程序都可以访问队列所分配的容量,管理员可以给每一个队列配置软性的限制或者硬性限制。

安全-每个队列都有严格的访问控制列表(ACLs) ,可以控制那个用户可以提交进入哪个队列,同时也有安全机制来保证用户不能查看 and/or 修改其他用户的程序,同样也支持按队列/按系统的管理角色。

弹性-空闲的资源可以分配给其他超过其处理容量的队列。如果将来某一个时刻先前空闲的队列再次需要这些资源,在这些资源所分配到的任务完成后,空闲资源会被重新分配给先前空闲的队列(不支持抢占)这样保证了资源以一种可预期,弹性的方式分配给队列。这个还能同时防止人为的资源孤岛,提高了集群的使用率。

多租户-提供了多种的限制来保证一个单应用/用户/队列独占队列或者集群,避免集群不堪重负。

易维护– 1)配置可动态加载,队列的定义及属性可以在运行时改变,可以将对晕乎的影响降到最低,同时也提供控制台接口可以让用户或者管理员查看当前系统中各个队列的资源分配情况,管理员可以在运行时增加队列,但是注意不能在运行时删除。2),清空队列,管理员可以在运行时停止一个队列,队列处于停止状态时已经在队列中的作业会继续完成,但是不能往里再新增作业

基于资源的调度 – 支持一些资源密集的作业,作业可以指定一个高于默认值的资源需求量,进而可以满足作业的不同的资源需求,当前,资源内存仅支持内存

上面的看起来有的复杂,还需要了解的几个很重要的特性是:

支持多用户多队列,支持多系统多用户共享集群

单个队列是FIFO调度方式,队列内可以开启优先级控制功能(优先级控制默认是关闭状态)。

支持资源共享,队列内资源有剩余时,可共享给其他缺资源的队列。

当某个tasktracker上出现空闲slot时,调度器的调度策略是,先选择资源利用率(numSlotsOccupied/capacity)低的队列,然后在队列中考虑FIFO和优先级进行作业选择,选择的时候会判断做业所在的用户资源未超限,以及有足够内存满足作业的内存需求。

计算能力调度器调度job时会考虑作业的内存限制,为了满足某些特殊job的特殊内存需求,可能会为该job分配多个slot;例如一个slot是1G内存,一个需要2G内存的程序就会被分配2个slot。fifo及公平调度器不具备此功能。

 

2.3  配置实例

 

2.4  与传统调度工具的集成

增加作业类型及优先级的需求同章节1.2,此外还需要进行队列配置

1)在调度平台上新增hadoop队列配置,配置好队列,及队列的资源限制后,可以使用调度工具指定作业在某一队列中运行。

map-reduce作业:可以在作业代码中设置代码属于的队列 conf.setQueueName(“queue1”);

或者在执行的时候在命令行中添加以下参数 -D mapred.job.queue.name=queue1

hive:在执行hive任务时,设置hive属于的队列,例如queue1:

set mapred.job.queue.name=queue1;

2)设置作业的内存资源量

通过设置一下两个属性,可以设置每个task所需要的内存量,如有必要,调度器会为每个task可以申请多个slot以获取根多内存,但最大值不超过mapred.cluster.max.map.memory.mb及mapred.cluster.max.map.memory.mb ,可以将值设置为-1以禁用此功能。

mapred.job.reduce.memory.mb

mapred.job.map.memory.mb

 

请注意:tasktracker需要先设置

mapred.tasktracker.vmem.reserved,

mapred.task.default.maxvmem,

mapred.task.default.maxvmem,以启用内存监控功能。

3.Fair Scheduler

 3.1 简介

公平调度器是由facebook贡献的,适合于多用户共享集群的环境的调度器.

公平调度器在设计时有以下4个主要目标:

1)即使在与大作业共享集群的时候也能迅速的完成小作业。不像Hadoop默认的FIFO调度器,公平调度器可以在大作业运行时让小作业的执行也能取得执行进展,同时又不会使大作业处于资源“饥饿”状态。

2)在一个共享集群里,可以同时运行一些实验性的作业同时对集群中的生产作业提供可靠的SLA。

3)便于管理及配置,程序在遇到一些异常情况的时候也能做出合适的处理,用户也仅在他们需要一些高级功能的时候才需要进行配置。

4)支持在运行时进行重配置,而不需要重启集群。

公平调度器按资源池(pool)来组织作业,并把资源公平的分到这些资源池里。默认情况下,每一个用户拥有一个独立的资源池,以使每个用户都能获得一份等同的集群资源而不管他们提交了多少作业。按用户的 Unix 群组或作业配置(jobconf)属性来设置作业的资源池也是可以的。在每一个资源池内,会使用公平共享(fair sharing)的方法在运行作业之间共享容量(capacity)。用户也可以给予资源池相应的权重,以不按比例的方式共享集群。

除了提供公平共享方法外,公平调度器允许赋给资源池保证(guaranteed)最小共享资源,这个用在确保特定用户、群组或生产应用程序总能获取到足够的资源时是很有用的。当一个资源池包含作业时,它至少能获取到它的最小共享资源,但是当资源池不完全需要它所拥有的保证共享资源时,额外的部分会在其它资源池间进行切分。

3.2 特性

公平调度器的主要特性如下:

支持多用户多队列

资源公平共享(公平共享量由优先级决定)

保证最小共享量

支持时间片抢占

限制作业并发量,以防止中间数据塞满磁盘

 

3.2.1 Pools

公平调度器将作业分为‘pools’,而后在pool间公平的共享资源,每个pool内可以使用FIFO或者公平共享(fair sharing)的方式进行调度。作业在哪个pool由一个Jobconf 属性决定,“pool name property”默认取mapreduce.job.user.name,所以是每个用户一个pool,但是也可以取其他属性,例如group.name,这样就可以每个unix 组一个group。

一个通常使用的方法是把pool名称设为一个未使用的属性名,例如pool.name,而后将此值默认设为mapreduce.job.user.name,这样既可以让每个用户一个pool,也可以通过直接设置pool.name 将作业制定到一个特殊的pool。以下是一个mapred-site.xml中进行配置的简单示例:

<property>

<name>mapred.fairscheduler.poolnameproperty</name>

<value>pool.name</value>

</property>

 

<property>

<name>pool.name</name>

<value>${mapreduce.job.user.name}</value>

</property>

 

3.2.2 最小份额

通常情况下,活动的pool(内有作业的)会在集群中平分map和reduce的slots,但是也可以对指定的pool设置一个最小的map和reduce的slot的份额。这样pool在活动时就会给予指定的slot数量,即便公平份额是小于指定的份额。这样设置以后在非生产作业与生产作业共享hadoop集群的时候对保证生产作业的SLA非常有用。最小份额的设置有以下3个影响

1)pool的公平份额会大于等于其设置的最小份额,slot会冲其他pool的份额中取缺额以达到pool预设份额,有个例外是如果每个活动pool的最小份额加起来大于集群中全部slot的数量,如果遇到这种情况,每个pool中的份额都会成比例的缩小。

2)少于其最小份额的pool会在slot有空闲时最先获得slot。

3)可以给pool设置一个抢占超时(preemption timeout)属性,如果获得的slot不足最小份额,允许其杀死其他作业的task来获得slot,带抢占的最小份额实际使用起来有点像SLA。

请注意,如果一个pool不是活动的,其最小份额并不会被预留,slot会分配给其他pools。

 

3.2.3 抢占

就像上一小节说到的那样,调度器会将一个pool中作业的task杀死一边满足另一个pool的最小份额,我们把这样的动作成为抢占,准确的说这个称为最小份额抢占(min share preemption),因为还有一个类型的抢占称为公平份额抢占(fair share preemption),如果pool间slot份额未公平共享,也自动会将作业的task杀死以公平分配slot。公平份额的抢占远比最小份额抢占保守,因为未获得公平份额的作业通产是一些非生产的作业,可以容忍一定程度的不公平,公平份额抢占只有在一个pool只获得低于一半的公平份额,并且达到一个预设的抢占超时后才会发生,这个超时通常会设置的比较高(例如10分钟)

两种抢占调度器都会从过度调度的pools中杀死最近启动的一个task,以使抢占导致的资源浪费降到最低。

 

3.2.4 运行作业限制

公平调度器可以限制每个pool,每个用户可以并行运行的作业。这样就可以有效限制集群上产生的中间文件,作业根据提交时间和优先级运行,如果提交的作业超过限制则会等到正在运行的作业完成后再调起。

 

3.2.5 作业优先级

在pool内,无论pool内的调度模式是FIFO还是公平共享(fair sharing)都可以使用优先级来控制作业调度。

1)在FIFO的pools中,作业使用hadoop的默认调度器FIFO,首先根据优先级,而后根据提交时间排序决定下一调起作业。

2)在公平共享的pools中,作业优先级被用来设置作业的权重以控制作业所得到的slot份额,普通优先级的权重是1.0,每个优先级级别间权重为上一级别的两倍。例如一个高优先级的权重为2.0,这样他就得到普通优先级两倍的slot份额。

 

3.2.6 pool 权重

pool可以赋予权重以使集群中的资源不公平的共享。例如一个权重设为2.0的pool得到一个设为1.0的pool的两倍的份额。

3.2.7 延迟调度

公平调度器包含一个延迟调度的算法以提高数据的本地性。hadoop的一个重要理念是移动计算而非移动数据,计算尽量在存储数据的节点上运行,但是公平调度的算法是总是将slot分配给份额比较少的pool中的第一个作业,这就引起作业的数据本地性很差,需要通过网络将数据传输到本地。 1)如果队列头的作业是一个小作业,那么在集群的一个心跳期间接受到的数据就是作业所需的本地数据的几率会很低,从而如果我们总是将slot分配给队列头作业的话,小作业的本地性就会很差。

2)公平调度器有个很强的趋势是给作业分配刚刚完成task的slot,因为当一个task完成,作业就低于其公平份额,

延迟调度算法可以暂时的牺牲公平性来提高数据的本地性,如果队列头的任务无法在tasktracker中进行一个本地任务,他会发出心跳,并且跳过,这样其他的运行作业就会根据pool份额和pool内的调度规则来寻找一个可以运行本地task的作业,但是如果队列头的作业等待的了足够长的时间,他就会允许在数据同一机架的服务器上调去,如果再有足够长的时间,就会允许在不同机架上调起。这个延迟的时间被称为本地延迟(locality delays),通常只延迟几秒就已经足够答复提供数据的本地性。本地延迟在mapred-site.xml中设置,可以设置为0表示禁用。默认值设为1.5倍心跳时间。

3.2.8 管理

公平调度器包含一个web界面可以显示活动pools,作业和其公平公平份额,将作业在pool间移动或者改变作业的优先级。同时,作业的配置文件在被改变时会自动重新加载以便在运行状态下自动重配置。

3.2.9 调度算法

公平分享的一个简单的实现方式就是,无论何时一个slot空闲下来,就将其分配到运行task数最少的那个pool,这样就保证了各个pool间获得相等的slots,除非pool的需求少于其公平份额,那多余的slots就会在其他pool间平分。一下两个特性让公平调度器的算法更加复杂

1) Pool权重意味着某些pool会获得根多的slots,例如一个权重为2的pool获得的slots就会比一个权重为1多两倍,这个通过把调度算法改为将slot分配到runningTasks/Weight 最小的pool来实现。

2)最小份额意味着少于其最小份额的pool会最先得到slots,当我们把pools排序来选择下一个调度的pool时候,我们将少于其最小份额的pool放在大于其最小份额的pool前面,而那些小于其最小份额的pool通过其少于最小份额的比例进行排序。

公平调度器采用一个层次的调度来分配tasks,首选根据如上策略选择一个pool来分配task,而后pool内通过fifo或者fair sharing 来进行作业的内部调度。

 3.2.10 fair share 计算

最后再说一下pool的公平共享量的计算方法。公平共享量是基于最小共享量和共享资源量计算得到的,它反映的是某个pool经过资源共享(某些pool的资源用不了,会自动共享给其他pool)之后,一共可以获取的资源总量,一般会大于等于最小共享量。

如果每个pool没有配置最小共享量,且提交了无限量的作业,则让每个pool的slotsAssigned / weight值相同即可。(其中slotsAssgined表示分配给该pool的slot数,weight表示pool的权重)。

而有了最小共享量minShare和pool中的需求量demand(该pool中所有作业尚需的slot总数)后,计算公平共享量fairShare需注意以下两种情况:

(1) 某些pool中的最小共享量可能用不完

(2) 给配给某些pool的资源量小于其最小共享量

考虑到以上两种情况,调度器设计了基于比率R的公平资源分配方法(设集群中资源总量为totalSlots):

[1] 如果一个pool的demand<R*weight,则该pool的fairShare=demand

[2] 如果一个pool的minShare>weight,则该pool的fairShare=minShare

[3] 除此之外,所有pool的fairShare=R*weight

[4] 所有pool的的fairShare之和应为totalSlots

通过以上算法计算出的公平共享量即为“公平调度器”的“公平”含义之所在,应尽量保证每个pool获取的资源量为fairshare,如果一定时间期限内达不到,则抢占资源。

r的算法详见下图:

 

 

 3.3  与传统调度工具的集成

集成上与2.4节类似,调度服务器通过使用不同的操作系统用户调起作业进入合适的pool。

 

参考资料

——————————————————————————————————

【1】 Hadoop 中的调度

【2】Refactor the scheduler out of the JobTracker

【3】如何编写Hadoop调度器

【4】Hadoop MapReduce Next Generation – Capacity Scheduler

【5】(MAPREDUCE-824)Support a hierarchy of queues in the capacity scheduler

【6】Hadoop-0.21.0公平调度器算法解析

 

 

ORACLE 的DRIVING_SITE HINT 在INSERT AS SELECT中无效

一个朋友问个SQL在本地表连接执行的部分非常快,当执行到最后通过DBLINK连接远程DB表时就很慢(本地执行后记录小于100条然后和远程DB连接。lot@pkgmes lt表1000W 并且有连接字段的PK)。后来在select部分添加hint /*+  DRIVING_SITE (lt) */  后,会把本地表传到远程去比对,子查询速度在1s以内。但是加上前面的insert hint好像是失效了,又变得很慢表和索引的统计信息都是最新的。

其实不光是INSERT AS SELECT中无效CREATE TABLE AS SELECT之类的也会无效

原因:

What happened?  That’s actually expected behaviour, a distributed DML statement must execute on the database where the DML target resides. The DRIVING_SITE hint cannot override this. DRIVING_SITE hint means that entire cursor (not a subquey) is supposed to be mapped remotely. That also means CREATE TABLE cannot be executed remotely (which is also the reason why you get ORA-2021 when you try to accomplish this with an Create Table table_name@remote_database).

So keep in mind when using the DRIVING_SITE hint this is merely for query optimization and not intended for DML or DDL.

解决办法
Create a view on the remote database (A) and then issue the insert
query by selecting from the view@link_name.

 

LoadRunner结果分析

 

本文为技术部朱晖同学做LR压力测试时的原创文章。

针对吞吐率和TPS的关系,这个在结果分析中如何使用,就个人经验和朋友讨论后,提出如下建议指导,欢迎同僚指正。

 

相关定义

  • 响应时间=网络响应时间+应用程序响应时间
  • 响应时间=(N1+N2+N3+N4)+(A1+A2+A3)
  • TPS:Trasaction per second也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息来估计得分。客户机使用加权协函数平均方法来计算客户机的得分,测试软件就是利用客户机的这些信息使用加权协函数平均方法来计算服务器端的整体TPS得分。一般来说系统的TPS取决于系统事务最低处理能力的模块的TPS,经验值10-100
  • HPS:Hit per second也就是点击数/秒,指的是一秒钟的时间内用户对WEB页面的链接、提交按钮等点击的总和。一般与TPS成正比关系,是衡量B/S系统的一个主要指标
  • Throughput/s:吞吐率,指的是每秒系统处理的客户的请求的数量,也可以理解为单位时间内客户接收到的服务的反馈量
  • 吞吐率:测试过程中每秒从服务器返回的字节数。

从定义上来看,如果TPS很小,但是吞吐率比较大,说明服务器的返回的页面文件(字节数)是比较大的,此时根据页面细分图,如果存在页面问题,考虑页面压缩。

还应根据A1—A3,N1—N3实际考虑。

如果A1或者A3比较大,说明webserver处理可能存在问题,如果A2比较大,则说明DBserver处理存在问题,建议sql优化。

当增大系统的压力(或增加并发用户数)时,吞吐率和TPS的变化曲线呈大体一致,则系统基本稳定。

若压力增大时,吞吐率的曲线增加到一定程度后出现变化缓慢,甚至平坦,同时TPS也趋于平坦,查看系统资源使用,如果资源使用率比较低,说明服务器硬件资源不存在问题,查看网络流量,估计网络带宽存在问题。

同理若点击率/TPS曲线出现变化缓慢或者平坦, 点击率(用户每秒发出的请求数)如果在压力增加时,趋于平坦,很可能是服务器响应时间增加,观察服务器资源使用情况,确定是否是服务器问题。

TPS是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息来估计得分。客户机使用加权协函数平均方法来计算客户机的得分,测试软件就是利用客户机的这些信息使用加权协函数平均方法来计算服务器端的整体TPS得分。

一般的,评价系统性能均以每秒钟完成的技术交易的数量来衡量。系统整体处理能力取决于处理能力最低模块的TPS值。依据经验,应用系统的处理能力一般要求在10-100左右。不同应用系统的TPS有着十分大的差别,一般需要通过性能测试进行准确估算。

经验分析:

1、当增大系统的压力(或增加并发用户数)时,吞吐率和TPS的变化曲线呈正比变化,则系统基本稳定

2、若压力增大时,吞吐率的曲线增加到一定程度后出现变化缓慢,甚至平坦,同时TPS也趋于平坦,查看系统资源使用,如果资源使用率比较高,则说明服务器硬件资源存在问题,需要拓展硬件或者优化应用。反之,则说明服务器硬件资源不存在问题,查看网络流量,估计网络带宽存在问题。

3、点击率/TPS曲线出现变化缓慢或者平坦,很可能是服务器响应时间增加,观察服务器资源使用情况,确定是否是服务器问题或者应用问题

转自:http://tech.weibo.com/archives/1106

转:今天四周年纪念

相恋六年,今天是结婚4周年的日子。
曾经无数次感叹时间飞逝,四年前的今天怀着无法用语言形容的复杂心情领了结婚证。
之后的这四年从来没有记住过这个日子,平平淡淡的,没有留下任何记录。
过日子就是这样,从结婚的那一天开始,就过着柴米油盐酱醋茶的日子,
08年结婚,09年买房,10年怀孕,11年产下了彤彤, 12年买车……
回想起来,我们一起经历了好多看似平淡却不平庸的事情,
一起努力工作、一起还房贷车贷,一起孕育彤彤……
想想,挺美好的,知足常乐。
这些年,我们的幸福,少不了父母伟大的爱,
所以,在我们的纪念日里,不能缺少对父爱和母爱的感恩。
接下来的日子是辛苦并快乐的,
不怕辛苦,因为伴着快乐幸福……
一起继续幸福前行吧,愿真情不变……
愿健康顺利……