摘要: DateNode的功能主要分为三大类:和DFSClient的交互;和NameNode的交互;本身提供数据存储的功能。 DataNode引用了FSDataset来提供数据存储功能,FSDataset是这个存储结构的入口,对于DataNode上面所有的Block的操作都要经过FSDataset,由此管理在此DataNode上存储的block。FSDataset的类图如下:DataStorageDataStorage主要提供存储元信息,如文件目录,存储目录的状态转移管理,Version文件等等。DataStorage内部有一个List<StorageDirectory>数据结构,表示此D 阅读全文
posted @ 2012-08-10 10:58 nod0620 阅读(1257) 评论(0) 推荐(0) 编辑
摘要: DataNode查看他的属性,可以分成以下几个方面:1.offerService()方法,此方法在DataNode主循环中执行,做的事情包括和NameNode心跳交互;通知NameNode一段时间以来收到的block;本机block的报告2.DataXceiverServer,主要处理block的读写3.BlockScanner,对本机block的扫描和校验处理4.FSDataset,本机block存储的入口5.ipcServer,主要是DataNode和DataNode之间recover block时使用。这里主要说明第1点,其它几点在另外一文中已经介绍过,offerService的主要流程 阅读全文
posted @ 2012-08-10 10:41 nod0620 阅读(5406) 评论(0) 推荐(0) 编辑
摘要: 首先DataNode自身就是一个Runnable的实现,也就是说DataNode是以一个单独的线程在运行着的。DataXceiverServer,DataXceiverDataNode在Block的数据流读写方面都交给了DataXceiverServer,DataXceiverServer也是运行在一个单独的线程当中,在主循环当中阻塞监听dfs.datanode.address配置的端口号,当有连接过来时,新建一个DataXceiver实例,并且在单独的线程当中运行DataXceiver。DataXceiver根据前面建立的Socket,建立DataInputStream,读取请求的操作,请. 阅读全文
posted @ 2012-08-07 14:30 nod0620 阅读(1374) 评论(0) 推荐(0) 编辑
摘要: 1.在项目中使用Set<String>实例,在使用Set的contains方法时,在方法内部其实用到对象的hashcode和equals方法进行查找Set内部的数据结构,contains方法的参数是Object类型,在项目中误传入Long型数据,结构导致方法返回false,内部原因是String和Long的hashcode的计算方法不对所导致。这个地方的contains方法JDK可以泛型成contains(String str)就不会有这个问题了。2.timeline的性能非常的低下,底层的架构采用了推和拉结合的模式,当用户的粉丝数大于500时使用拉模式,成为明星用户;结果在当前用 阅读全文
posted @ 2012-07-24 21:31 nod0620 阅读(283) 评论(0) 推荐(0) 编辑
摘要: JDK1.5引入了Doug Lea大神的concurrent框架,其中AbstractQueuedSynchronizer是concurrent框架的基本,从大神的paper中可以看到1.传统的synchronized不能进行中段,这个不合适2.如果将concurrent重心放在少数竞争下优化锁,而在其他情况下放任缓慢执行的策略是不正确的3.需要可预测的维护效率,即使在同步竞争激烈的情况下,理想中无论多少线程试图通过一个同步点的开销应该是恒定的4.设计的目标是总时间的减少,因为有可能在此之间一个线程可以通过同步点,然后他没有立即执行5.在高吞吐量的基本上,更重要的是线程的公平调度AQS设计思路 阅读全文
posted @ 2012-07-23 19:35 nod0620 阅读(2036) 评论(0) 推荐(2) 编辑
摘要: concurrent包里面有很多Lock的具体实现,其具体的实现都是基于AQS实现的ReentrantLockReentrantLock是可重入的互斥锁,重点是重入和互斥,ReentrantLock 将由最近成功获得锁的线程所持有,当这个线程再次尝试拥有这个Lock时就是重入。互斥就是在某一时间只有一个线程能持有Lock。 public void lock() { sync.lock(); }获得锁方法,Sync是AQS的抽象子类,实现可重入和互斥的大部分功能。在Sync的子类中有FairSync和NonfairSync两种代表公平锁策略和非公平锁策略Sync lock方法留给子类去实现,No 阅读全文
posted @ 2012-07-23 19:33 nod0620 阅读(728) 评论(0) 推荐(0) 编辑
摘要: 图左边是线程池的类结构,右边是放入线程池执行的任务类结构ExecutorServiceExecutorService定义了线程池的基本的方法,AbstractExecutorService是个抽象类,实现了ExecutorService的部分,主要是实现了几个submit()方法,并且提供方法将提交进来的任务封装成FutureTask,ThreadPoolExecutor则实现线程池的管理.FutureTaskFutureTask内部引用了一个AQS的实现,当FutureTask没有执行完毕的时候,FutureTask的get()方法所在线程阻塞在AQS阻塞队列上,所以get()方法可以认为是 阅读全文
posted @ 2012-07-17 15:03 nod0620 阅读(1530) 评论(0) 推荐(0) 编辑
摘要: 首先说下线程的死锁,个人想法(从艺术家吃饭说起): 1.必须有资源想被多个线程独占,但是资源不能共享,也就是一次只能一个线程用 2.一个线程抢占一个资源然后再等待另外一个线程(大家都这样) 3.资源不能被强占,大家都是优先级相同的线程,都在那里等 4.发生循环等待了(多个锁)避免死锁就是打破上面任何一条 一个并发程序好坏大致需要两个方面:响应速度和伸缩性,也即是有多快和有多少,这往往是相互矛盾的两方面,我们需要做的就是平衡这两方面。 从并发程序的特点看,我们可以从以下几方面入手性能的优化: 1 多线程执行那么必须在多个线程里面上下切换,这需要操作系统保存上个线程的多线程,创建或者唤醒下个线程, 阅读全文
posted @ 2012-07-16 13:49 nod0620 阅读(340) 评论(0) 推荐(0) 编辑
摘要: single thread executionsingle thread execution主要思想是:在同一时刻,对于某一共享资源,只能有一个人访问,即资源同步。package gate;public class Person { private String name; private String address; public synchronized void setNameAddress(String name,String address){ this.name = name; this.address = address;... 阅读全文
posted @ 2012-07-16 13:40 nod0620 阅读(814) 评论(0) 推荐(0) 编辑
摘要: 先看一段代码: package com.abc;import java.io.IOException;import java.util.Iterator;import java.util.StringTokenizer;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.T... 阅读全文
posted @ 2012-06-20 11:26 nod0620 阅读(12262) 评论(1) 推荐(3) 编辑