自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(69)
  • 资源 (2)
  • 收藏
  • 关注

原创 Hadoop_NameNode_代码分析_FSNameSystem(4)

(1)FSNameSystem中的defaultPermission是创建文件时的默认设置,缺省用户为fsOwner(可以通过hadoop.job.ugi设置,否则通过whoami获得),缺省用户组为supergroup,缺省权限为0777,可以通过dfs.upgrade.permission修改。blocksMap:保存数据块到INode和DataNode的映射关系。dir:指向系统使用的FSDirectory对象,操作命名空间。datanodeMap :保存了StorageID -> DatanodeD

2010-07-12 20:12:00 1115

原创 Hadoop_NameNode_代码分析_目录树(4)

<br />(1)FSDirectory管理内存中名字空间,而FSImage用来管理磁盘上的固化的目录树。<br />(2)FSDirectory中操作名字空间的方法分为记录日志且检查ready以及不记录日志不检查ready型(unprotected),明显后者用来加载固化目录树的时候。<br />(3)操作名字空间的方法大多数都比较相似,选择较复杂的rename操作来分析。rename涉及src<String>,dst<String>,因为内存中操作的都是INode节点,所以要使用getExistingP

2010-07-12 16:35:00 630

原创 Hadoop_NameNode_代码分析_日志_租约_9bit位实现方面(3)

(1)EditLogFileOutputStream:日志输出流使用双缓冲技术,使得在向磁盘同步数据时,其他准备写日志的线程不至于阻塞。一个NameNode可能在不同的StorageDirectory中有不同的日志文件要写,因此有ArrayList editStreams成员变量。isSyncRunning成员用来标识是否某一个流正在进行同步操作,如果是这样,close的时候需要等待同步完成。任何一个线程写一条日志或者setReady流也就是转换缓冲都会锁上所有的流,这对性能没有影响,因为写日志是向双缓冲中

2010-07-11 15:36:00 759

原创 Hadoop_NameNode_代码分析_目录树(2)

<br />(1)NameNode的内存中保存了庞大的目录树结构,这个结构用来保存文件目录结构和文件Block之间的映射,这种结构关系会固化在磁盘上,但是对树的改动频繁发生,什么时候将树写入磁盘呢?把每次操作应用到内存中的树上,并把操作记录成日志文件,每次操作不会改变固化在磁盘上的改动发生之前的目录树,适当的时候做一次固化操作并记录时间。<br />(2)NameNode上面的磁盘目录结构:<br />[hadoop@localhost dfs]$ ls -R name<br />name:<br />cu

2010-07-10 21:11:00 1302

原创 Hadoop_NameNode_代码分析_数据结构(1)

<br />(1)NameNode保存的两种信息:文件和block的映射、block和DataNode的映射。文件和block的映射,固化在磁盘上。而block和DataNode的映射在DataNode启动时上报给NameNode<br />(2)DatanodeProtocol:用于DataNode来调用NameNode上的方法,情景是DataNode向NameNode通信,方法参数传递到NameNode上;<br />ClientProtocol:提供给客户端,用于访问NameNode。它包含了文件角度

2010-07-10 19:56:00 1672

原创 Hadoop_DataNode_代码分析(4)

<br />(1)写操作:BlockReceiver作为处理writeBlock时候的主要类。写是通过管道实现的,写block可能是用户请求也可能是NameNode要求的block拷贝命令,不同情况处理不同。管道上的中间节点有四个方向的网络数据流,还有两个写block数据文件和校验文件的流。主线程负责读数据报直接转发给下一个DataNode,而单独启动新线程PacketResponder用来处理给上级的回复消息和接受下级的发送过来的消息。PacketResponder应用心跳机制,到一定时间会给上级发送心跳

2010-07-10 17:06:00 1066

原创 网络流关键路径

/*输入一个石油管道网,管道可以双向流通石油,即可以使用网络流计算最大流输出网络最大流的关键路径,即降低某一管道的容量会使整个网络流降低。首先可以尝试的方式是先计算最大流,然后遍历所有容量饱和的边,降低这些边的容量重新计算网络流和原网络流比较,太慢。可以假象当前网络流已经达到最大,如果把一个饱和边的容量降低1,那么包和边的起点就会堆积1个流量而饱和边的终点会少了1流量,如果在残留网络中,从这个起点到终点有一条容量大于等于1的增广路径,就不会影响整个网络流。如果只考虑在饱和边上最多只能降低1个流量那么在残留网

2010-07-10 13:29:00 612

原创 Hadoop_DataNode_代码分析(3)

通过上面的一系列介绍,我们知道了DataNode工作时的文件结构和文件结构在内存中的对应对象。下面我们可以来开始分析DataNode上的动态行为。首先我们来分析DataXceiverServer和DataXceiver。DataNode上数据块的接受/发送并没有采用我们前面介绍的RPC机制,原因很简单,RPC是一个命令式的接口,而DataNode处理数据部分,往往是一种流式机制。DataXceiverServer和DataXceiver就是这个机制的实现。其中,DataXceiver还依赖于两个辅助类:Bl

2010-07-09 20:57:00 638

原创 Hadoop_DataNode_代码分析(2)

(1)由上文知FSVolume和Storage.StorageDirectory对应,由于HDFS规定了一个目录能存放Block的数目,FSDir对应一个StorageDirectory里面众多存放block的目录。由此FSVolumeSet= Storage,FSVolume=Storage.StorageDirectory,FSDir= StorageDirectory的子目录。FSVolume就是一个通常的那样一个目录,管理着数据块文件,detach文件和临时文件。FSVolume中的recoverD

2010-07-09 16:23:00 673

原创 单行道问题 隔边

某个城市有n个景点,景点之间有单行道或者双行道,但是双行道的交通事故较多,所以准备把一些双行道改为单行,但是要保证所有的景点之间都可以到达。转化,有一个强连通的有向图,求去掉那些边可以使得有向图保持强连通性。首先要找出图的隔边,在有向图中,隔边是指去掉一个方向的边就会破坏整个有向图的强连通性的双向边。定义rank表示某一个节点本身或者孩子通过回边所能达到的具有最小编号的深度前序遍历的节点的编号。注意一个节点的回边的意思是绕过父亲指向祖先。那么如果一个节点的某一个孩子的rank值大于这个节点的深度前序遍历编号

2010-07-09 14:11:00 1011

原创 Hadoop_DataNode_代码分析(1)

(1)StorageInfo类是通用存储信息的类,通用的意思是NameNode和DataNode上面文件目录结构共有的信息,这些信息包括layoutVersion(应用软件的版本和文件目录的版本一致),namespaceID(Storage的ID,作用还不清楚),cTime(就是创建时间),这些信息显然是非易失性的,应该放在目录的VERSION文件中。(2)从Storage类的注释中可知,Local storage可以有多个目录,每个目录有相同的VERSION文件,其中保存Local storage inf

2010-07-07 22:54:00 848

原创 hadoop_HDFS_DataNode初步

(1)一个DataNode上面的Block都是唯一的,多个DataNode可能存在相同的Block。(2)通信场景:1,NameNode上并不永久保存那个DataNode上有那些数据块的信息,而是通过DataNode启动时的上报,来更新NameNode上的映射表(DataNode和Block)。2,DataNode和NameNode建立连接以后,就会不断地和NameNode保持心跳。心跳的返回其还也包含了NameNode对DataNode的一些命令。3,DataNode当然也作为服务器接受来自客户端的访问,

2010-07-07 20:15:00 2861

原创 hadoop_UnixUserGroupInformation_以及相关RPC安全的问题

(1)在配置文件中使用hadoop.job.ugi指定用户组信息,用户名+组名(String[]),UnixUserGroupInformation的login方法首先尝试从Configuration中获得用户组信息,如果失败就从配置文件中读,如果失败就Get current user's name and the names of all its groups from Unix,Shell类中的内部类ShellCommandExecutor用来执行Shell程序。如果失败,则用户名为DrWho,组名为T

2010-07-06 17:31:00 582

原创 进化树问题

给定一棵树的每个叶子节点到其他叶子节点的最短距离,求这棵树上所有边的距离和。用叶子节点表示某一个物种,叶子节点之间的距离表示某一物种和另一物种之间差异,用树来描述是因为用树来描述满足物种差异性的三角关系M(i,k)+M(k,j)>=M(i,j)。这种树可能就叫做进化树吧,那么树上所有边的距离和就应该表示整个生物界物种多样性的程度了。回归到正题:给定一棵树的每个叶子节点到其他叶子节点的最短距离,求这棵树上所有边的距离和。首先考虑一下简单的情况,假设只有两个节点,那么树的距离和就是这两个节点的最短距离。如果存在

2010-07-06 15:31:00 1075

原创 Hadoop_RPC框架分析_Server部分

RPC框架的Server:(1)服务器需要一个listen线程(Listen内部类),需要一个已接受连接的列表(connectionList)(2)连接对象(Connection)需要包含和客户端连接的通道(SocketChannel),readAndProcess方法读取client端发过来的信息完成hrpc和version比较并做分头信息和调用信息分别处理,(3)processHeader用来处理头信息,会得到根据传来的协议字符串获得协议类(class),会根据UserGroupInformation得

2010-07-05 21:07:00 572

原创 Hadoop_RPC框架分析_Client部分

RPC框架:(1)RPC中保存Client对象的缓存,因为一个Client对象可能被多个线程用到,因此在Client对象中要有引用计数,从缓存中拿出一个Client时增加计数,放入缓存中时减少计数,如果发现计数为零则要从缓存中清除这个Client并断开Client的连接。(2)waitForProxy用来返回一个远程调用存根,可能出现的异常有:ConnectException(无法连接),SocketTimeoutException(远端繁忙)。如果超过用户设定的超时时间,则IOException。主要参数

2010-07-05 16:37:00 772

原创 Hadoop_IPC序列化对象的分析

IPC序列化对象的分析:序列化对象网络中传递格式,对象类名(UTF8.writeString)+对象数据,对象数据分一下几种情况(1)数组:数组长度+元素对象数据(递归)(2)字符串:UTF8.writeString(3)primitive type:DataOutput接口输出(4)枚举:枚举名字(UTF8.writeString)(5)Writable的实现类:Writable对象类名+对象实际数据关键问题是如何解读序列化数据,得到对象类名之后,首先利用保存的primitive type散列表查看一下(

2010-07-05 14:56:00 732

原创 HadoopIPC包源码分析

Hadoop的IPC:(1)实现RPC的一种方法,具有快速、简单的特点。 它不像Sun公司提供的标准RPC包,基于Java序列化。(2)IPC无需创建网络stubs和skeletons。(3)IPC中的方法调用要求参数和返回值的数据类型必须是Java的基本类型,String和Writable接口的实现类,以及元素为以上类型的数组。接口方法应该只抛出IOException异常。 构建思路:(1)采用客户/服务器模型(2)Server:它把Java接口暴露给客户端。指定好监听端口和接受远程调用的对象实例后,通过

2010-07-04 21:15:00 802

原创 思考过的逻辑题

(1)一个教授逻辑学的教授,有三个学生,而且三个学生均非常聪明! 一天教授给他们出了一个题,教授在每个人脑门上贴了一张纸条并告诉他们,每个人的纸条上都写了一个正整数,且某两个数的和等于第三个!(每个人可以看见另两个数,但看不见自己的) 教授问第一个学生:你能猜出自己的数吗?回答:不能,问第二个,不能,第三个,不能,再问第一个,不能,第二个,不能,第三个:我猜出来了,是144!教授很满意的笑了。请问您能猜出另外两个人的数吗?(2)一间囚房里关押着两个犯人。每天监狱都会为这间囚房提供一罐汤,让这两个犯人自己来分

2010-07-01 16:31:00 330

转载 SIGSEGV和SIGBUS

今天编程遇到了SIGSEGV错误,比较困惑,所以找了些资料,总结一下:(1)官方说法是: SIGSEGV --- Segment Fault. The possible cases of your encountering this error are: 1.buffer overflow --- usually caused by a pointer reference out of range. 2.stack overflow --- please keep in mind that the defa

2010-06-27 15:14:00 272

原创 给定自然数n和另外b个自然数,n用这b个数中若干个(可重复)的和来表示,求方法总数

<br /><br />C(i,j)表示i使用前j个数的组合<br />C(i,j) = C(i,j-1)+C(i-w[j],j-1)+C(i-2*w[j],j-1)+C(i-3*w[j],j-1)+.....<br />有上式得C(i-w[j],j) = C(i-w[j],j-1)+C(i-2*w[j],j-1)+C(i-3*w[j],j-1)+.....<br />所以C(i,j) = C(i,j-1)+C(i-w[j],j)<br />当自然数是1234567。。。时,问题等价于整数划分问题<br /

2010-06-26 11:16:00 281

原创 求三角形最大面积

<br /><br /><br />5<br />#-##----#<br />-----#-<br />---#-<br />-#-<br />-<br /> <br />#include<stdio.h><br />#define MAXNUM 10<br />char triangle[MAXNUM][MAXNUM];<br />bool f[MAXNUM][MAXNUM][MAXNUM];<br />int n;<br />void input(){<br />FILE* fp;<br />int

2010-06-24 11:10:00 225

原创 骨牌问题

<br /><br />#include<fstream><br />#include<iostream><br />#include<math.h><br />#define MAXNUM 6<br />#define AVG MAXNUM*6<br />#define INF 99999<br />using namespace std;<br />ifstream fin("input.txt");<br />int up[MAXNUM];<br />int down[MAXNUM];<br />in

2010-06-24 10:38:00 322

原创 Iterator接口包装

<br /><br />Iterator<T>接口可以被包装,方便操作。<br />import java.io.*;<br />import java.util.*;<br />public class FileUtil{<br />public static Iterator<String> getFileIterator(String filename)<br />throws IOException{<br />final FileReader fr = new FileReader(new Fil

2010-06-23 18:09:00 343

原创 电子眼问题:利用非递归深度遍历,树形动态规划,解决N图N节点最小覆盖问题,O(n)时间

<br /><br />#include<fstream><br />#include<math.h><br />#include<iostream><br />#define MAXNUM 100<br />using namespace std;<br />ifstream fin("input.txt");<br />//ofstream fout("output.txt");<br />int stack[MAXNUM];<br />int ptr[MAXNUM];<br />int index[M

2010-06-23 12:10:00 562

转载 设置vim语法高亮显示和自动缩进

<br />原帖地址:http://blog.chinaunix.net/u/22968/showart_432269.html<br />1、配置文件的位置<br />    在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root目录下,通常已经存在一个.vimrc文件。<br /> <br />2、设置语法高亮显示<br />1) 打开vimrc,添加以下语句来

2010-06-22 21:05:00 342 1

原创 消费者简单包装

消费者对象:消费队列、消费者ID、消费线程、线程终止标记、线程中断锁package exercise;import java.util.Vector;abstract public class Consumer {private Vector _queue = new Vector();private Object _waitForMonitor = new Object();//用来等待队列的信号private Thread _thread;//消费者用来消费的单线程private String _nam

2010-06-22 16:12:00 200

原创 任务监控的简单实现

<br /><br />实时多任务处理中,每个任务作为一个线程来运行。存在一个监控线程负责管理多个实时任务。实时任务存在出现异常的可能,因此监控线程需要能够及时发现异常的任务并进行处理。处理方式可能会随着异常出现的频率而不同,比如初次发生异常的任务可以通过重启任务来解决,经常发生异常的任务可以通过向管理员报警来解决。<br />监控线程通过读取任务的“心跳”信息来判断任务的状态,如果任务在一段时间间隔内没有更新“心跳”信息,监控线程就认为这个任务有可能发生了异常,当这种现象持续多次超过某一阈值时,就重启或者

2010-06-22 14:47:00 529

转载 通过 SSH 密钥验证实现在不同系统之间的脚本自动化

SSH 简介在日常工作中,我们越来越多的使用 SSH(Secure Shell) 客户端软件通过网络登录到开启 SSH 服务的远程系统上,并且在远程系统上执行操作。不同于传统的网络访问服务(例如 telnet, rlogin, ftp)用明文传送数据包括密码,SSH 通过把传输的数据加密在网络中进行安全的通信。SSH 提供多种安全验证方式,包括基于口令的和基于密钥的安全验证 RSA/DSA。通常我们使用基于口令的安全认证,通过输入远程系统的账户和口令同远程系统建立连接。例如使用 SSH 命令,用“账户 @

2010-06-21 17:54:00 436

原创 红黑树的一个简单实现

<br /><br />(1)理解了节点旋转的一种简单的想法,在指针赋值的时候一定要把所有的节点都要连接好,如果形成循环指针,递归的时候就会死循环。<br />(2)完全明白了红黑树定义的内涵,使得树到叶子的距离最大值不超过最小值的两倍。最大距离就是黑色节点之间都有红色节点插入。<br />(3)数据结构尤其是树的变化有很多种情况,测试的时候可以设定特殊的测试环境来进行白盒测试,比如递增插入或者递减插入。<br />(4)debug的时候在纸上模拟出bug情形,然后再跟踪,减少使用debug的时间,debu

2010-06-09 10:35:00 352

原创 Java解惑——笔记

(1)Java负数取余操作保留符号,因此判断i是否为奇数的方法(i%2 == 1)四分之一概率会出现错误,修改为(i%2 != 0)或者(i&1 != 0)(2)使用Java的float和double二进制格式无法精确表示小数,可以修改其打印格式,但是机器码中的表示是不精确的,因此在表达货币计算时,应该使用int或者long表示而降低货币单位,或者使用BigDecimal类,注意BigDecimal可以使用String或者Double构造,货币计算情况下不可以使用Double,因为Double是不准确的。总

2010-06-06 22:26:00 802 1

原创 公正:该如何做是好

功利主义:能使功利最大化的行为是正确的行为,功利是指所有相关人的快乐与痛苦的差额。食人问题按功利主义的判断是正确的行为,杀死一个孤儿而使得其他拥有家人的三个人幸存能使得功利最大化。现在存在三个问题:(1)但是杀人本身是否是犯罪,如果人生来被赋予生命权利,人人平等,任何人在任何情况下都没有夺取其他人生命的权利,否则则为犯罪。这样来看食人问题本身就是犯罪,但是人的这种权利是从何而来,在什么情况下会不成立?(2)如果通过抽签决定人的生死,那么食人行为是否在道德上正当呢?即,公平的决策之后的犯罪行为会发生什么道德变

2010-06-05 23:21:00 281

原创 Fork() Makes Trouble

<br /><br />一开始轻视了这道题,随意写了一个递归,结果还是认真画出递归树才修改正确。仔细的思考很重要啊!<br />#include<iostream><br />using namespace std;<br />int t,n,m,s,pid;<br />void solve(int i,int a){<br />int tpid = pid++;<br />if(tpid>1000 && ++s == m)<br />printf("Process ID=%d, A=%d/n",tpid,

2010-06-04 16:17:00 250

原创 Trie树应用,寻找最优前缀表示

<br />Trie,又称字典树、单词查找树,是一种树形结构,用于保存大量的字符串。它的优点是:利用字符串的公共前缀来节约存储空间。<br />相对来说,Trie树是一种比较简单的数据结构.理解起来比较简单,正所谓简单的东西也得付出代价.故Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.<br /><br />其基本性质可以归纳为:<br />1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。 <br />2. 从根节点到某一节点,路径上经

2010-06-03 15:26:00 350

原创 POJ 2560-Freckles 最小生成树

<br />prim算法最小生成树,一开始把所有点之间的距离算出来保存到邻接矩阵中,然后使用prim计算最小生成树。prim点集,kruskal边集。<br /><br />#include<iostream><br />#include<math.h><br />using namespace std;<br />#define MAXNUM 101<br />#define INF 999999<br />struct point{<br />double x;<br />double y;<br />

2010-06-03 13:47:00 354

原创 POJ 1179 多边形游戏

<br />首先考虑动态规划中遇到的状态,动态规划的状态不同于搜索,动态规划一般是自底向上的,在思考过程中不需要考虑节点值的变化,只需要考虑目前状态至最终状态的函数。而回溯法需要对目前的状态每一步转化保存变化过程,并最终和目标状态比较。考虑动态规划时可以直接从最初状态跳跃到最终状态,不必思考中间的转化过程,否则会对状态的理解混淆。<br />如何保存节点和边的状态是这道题的难点一,因为涉及到乘法和负数,还需要保存状态的两种权,即最大值最小值。节点和边都是需要编号的。整个图是多边形,所以状态可以用区间表示:节

2010-06-03 11:02:00 524

原创 位运算解决n皇后问题

#includeusing namespace std;int n;long limitrow;int sum;/* row:当前因为列不能添入皇后的位置 left:当前因为左对角线不能填入皇后的位置 right:当前因为右对角线不能填入皇后的位置*/void solve(long row,long left,long right){ long pos; if(row!=limitrow){ pos = limitrow & (~(row|left|ri

2010-06-02 19:41:00 320

原创 “菜奴”的原理

<br />炒作民生必需品的前提:(1)不起眼的,非必需的商品的价格突变政府不会干预。(2)之前产量大幅下跌。<br />炒作三部曲,对于可存储农产品:(1)热钱进入,大举建仓,全面收购,搞定上游。(2)控制下游,通过收取经销商,零售商的保证金,确保上下游行为一致,抛售收购反应迅速。(3)利用新闻媒体热点炒作概念。(4)对敲抬高价格。(5)解决方法,利用反垄断法狙击炒家。<br />对于非存储农产品:(1)利用大量资本,低价抛售,洗牌市场。(2)高于抛售时的市价收购农民的蔬菜,条件是炒家可以控制蔬菜输入市场

2010-06-02 18:58:00 355

原创 敌人的敌人是朋友的问题

<br /><br />输入是告诉某两个人是敌人,然后判断出某两个人是什么关系的问题。显然使用并查集来做。但是并查集只能表示两个元素之间有关联,还需要某种方法表示同一个集合中两个元素的关系,如果两个元素有关,要么就是敌人要么就是朋友。这样可以用从元素找到根的过程中的信息来判断两个元素的关系,可以使用权值的方法,在找到根的同时不断累加权值,最后判断奇偶,因为只有两种关系,如果多种关系还需要改变可以模3。<br />在试验算法的时候奇偶不用考虑一般情况,考虑一些特殊情况代入可以就好。<br />#include

2010-06-02 15:57:00 432

转载 剖析使用 ObjectOutputStream 可能引起的内存泄漏

<br /><br />使用 ObjectOutputStream 来进行对象序列化<br />相信大多数程序员在使用 Java 进行日常开发工作中,都曾经遇到需要把数据进行序列化的情况,比如写入文件或者写入 socket 流。Java 的类库也提供了丰富工具类供我们使用,这其中就包括 ObjectOutputStream。此类允许我们将 Java 对象的基本数据类型和图形写入 OutputStream,在需要将 Java 对象进行序列化操作时,使用该类可以极大为我们提供便利。但是使用不当也会引起一些麻烦。

2010-06-02 11:17:00 585 1

国际大学生程序设计竞赛例题解

国际大学生程序设计竞赛例题解(一).pdf郭嵩山李志业金涛梁锋电子书手册源码

2009-12-18

c++编程思想习题答案

是volume 1的课后答案,以前从网上下了几个,可是都不是,这个绝对正宗

2009-03-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除