永发信息网

如何从hdfs缓存中直接读取数据

答案:1  悬赏:0  手机版
解决时间 2021-03-14 09:41
如何从hdfs缓存中直接读取数据
最佳答案
一、文件的打开
1.1、客户端
HDFS打开一个文件,需要在客户端调用DistributedFileSystem.open(Path f, int bufferSize),其实现为:

public FSDataInputStream open(Path f, int bufferSize) throws IOException {
return new DFSClient.DFSDataInputStream(
dfs.open(getPathName(f), bufferSize, verifyChecksum, statistics));
}

其中dfs为DistributedFileSystem的成员变量DFSClient,其open函数被调用,其中创建一个DFSInputStream(src, buffersize, verifyChecksum)并返回。

synchronized void openInfo() throws IOException {
LocatedBlocks newInfo = callGetBlockLocations(namenode, src, 0, prefetchSize);
this.locatedBlocks = newInfo;
this.currentNode = null;
}

private static LocatedBlocks callGetBlockLocations(ClientProtocol namenode,
String src, long start, long length) throws IOException {
return namenode.getBlockLocations(src, start, length);
}

在DFSInputStream的构造函数中,openInfo函数被调用,其主要从namenode中得到要打开的文件所对应的blocks的信息,实现如下:
LocatedBlocks主要包含一个链表的List<LocatedBlock> blocks,其中每个LocatedBlock包含如下信息:
· Block b:此block的信息
· long offset:此block在文件中的偏移量
· DatanodeInfo[] locs:此block位于哪些DataNode上
上面namenode.getBlockLocations是一个RPC调用,最终调用NameNode类的getBlockLocations函数。
1.2、NameNode
NameNode.getBlockLocations实现如下:
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
郑州银基商贸城08年开张时间
窗户上的冰花形成是凝华,不是凝固,室内中的
发兴诊所地址在什么地方,想过去办事
有"水"子的古诗
六年级上册语文四单元成语故事竭泽而渔加拼音
为什么我的鼻子老是塞着
中国邮政储蓄银行重庆巴南区五布营业所在什么
鹦鹉躺着只能喘气闭着一只眼怎么办?吓死我了
艺高广告这个地址在什么地方,我要处理点事
您好,我想请教您一篇以If I were Yao Ming为
革命先锋拥有的崇高精神是神什么
以前胎死腹中得胎儿现在办农和医院开证明应该
尤其是男生回答 一个妹子看到自己有好感的男
i7-3630QM HD4000 显卡驱动求助
本人车有全险,借他人开,如出险,保险公司会
推荐资讯
被拉布拉多咬破了脚,流了一点血,要打预防针吗
葡萄酒的赠品酒壶嘴的使用方法
谁知道哪里有那种按摩店的按摩油卖?叫什么大
终结者哪部最好看
亖这是什么字
广东省潮州市湘桥区信鸽协会地址在什么地方,
公安机关传讯后说明犯罪事实是投案自首吗能减
昨晚我的眼睛痒,用力揉了揉,今天早上发现眼
帝国时代2-征服者之福州牧场里的人口复制器在
1983唱的对不起我爱你是哪部电影的主题曲?
手机支付宝,怎么实名认证,截图给我看看,谢
33岁女,离异,算命的说我离婚后这辈子会很惨
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?