Hadoop DataNode启动之asyncDiskService

客户端在删除HDFS里的文件时,首先是更新NN里的元数据,然后通过心跳向DN发送块删除指令,DN接到指令执行块删除操作,和异步块报告一样,这个过程也是异步的,原因是出于性能和实时性的考虑,在DN中,每个文件卷都有一个专门的线程池来接收删除指令,该池的默认删除线程有4个,从名字可以看出,该类并不只是用于块删除操作的,在以后的版本中可能会增加其他的服务线程。该类在异步块报告线程启动后紧跟创建,下面分析下这个类。

public FSDataset(DataStorage storage, Configuration conf) throwsIOException {

.....

for (int idx = 0; idx <storage.getNumStorageDirs(); idx++) {

roots[idx] =storage.getStorageDir(idx).getCurrentDir();

}

//异步磁盘服务类的创建

asyncDiskService = newFSDatasetAsyncDiskService(roots);

registerMBean(storage.getStorageID());

}

看下FSDatasetAsyncDiskService的构造函数,该类的代码比较简短

FSDatasetAsyncDiskService(File[] volumes) {

//创建一个线程工厂,用于产生空线程

threadFactory = newThreadFactory() {

public ThreadnewThread(Runnable r) {

return newThread(threadGroup, r);

}

};
    // 为每个文件卷创建一个线程池

for (int v = 0 ; v <volumes.length; v++) {

//创建线程池,并以KV形式放入MAP中,核心线程默认一个,最大线程4个

ThreadPoolExecutor executor= new ThreadPoolExecutor(

CORE_THREADS_PER_VOLUME, MAXIMUM_THREADS_PER_VOLUME,

THREADS_KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,

newLinkedBlockingQueue<Runnable>(), threadFactory);

// This can reduce thenumber of running threads

executor.allowCoreThreadTimeOut(true);

//以KV形式放入MAP中,到现在有文件卷,有线程池,那么里面的线程到底做些什么操作呢?

executors.put(volumes[v],executor);

}

}

更多详情见请继续阅读下一页的精彩内容

相关阅读:

Hadoop datanode重新加载失败 无法启动解决步骤

Hadoop中的datanode起不起来

Hadoop中datanode与NameNode之间的心跳机制

HJadoop分布式环境部署之namenode或datanode启动失败

Hadoop 1.0.0的分布式配置(一个namenode 两个个datanode)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/0e5c9fd3b5d60bc2db8418c09c04468c.html