一起艳学大数据Hadoop(三)——java操作HDFS的增删改查

news/2024/5/20 4:03:07 标签: 大数据, hadoop, java, hdfs, hadoop集群

这里写图片描述

具体过程描述如下:

1、Client调用DistributedFileSystem对象的create方法,创建一个文件输出流(FSDataOutputStream)对象
2、通过DistributedFileSystem对象与Hadoop集群的NameNode进行一次RPC远程调用,在HDFS的Namespace中创建一个文件条目(Entry),该条目没有任何的Block
3、通过FSDataOutputStream对象,向DataNode写入数据,数据首先被写入FSDataOutputStream对象内部的Buffer中,然后数据被分割成一个个Packet数据包
4、以Packet最小单位,基于Socket连接发送到按特定算法选择的HDFS集群中一组DataNode(正常是3个,可能大于等于1)中的一个节点上,在这组DataNode组成的Pipeline上依次传输Packet
5、这组DataNode组成的Pipeline反方向上,发送ack,最终由Pipeline中第一个DataNode节点将Pipeline ack发送给Client
6、完成向文件写入数据,Client在文件输出流(FSDataOutputStream)对象上调用close方法,关闭流
7、调用DistributedFileSystem对象的complete方法,通知NameNode文件写入成功

DFSOutputStream内部原理

打开一个DFSOutputStream流,Client会写数据到流内部的一个缓冲区中,然后数据被分解成多个Packet,每个Packet大小为64k字节,每个Packet又由一组chunk和这组chunk对应的checksum数据组成,默认chunk大小为512字节,每个checksum是对512字节数据计算的校验和数据。
当Client写入的字节流数据达到一个Packet的长度,这个Packet会被构建出来,然后会被放到队列dataQueue中,接着DataStreamer线程会不断地从dataQueue队列中取出Packet,发送到复制Pipeline中的第一个DataNode上,并将该Packet从dataQueue队列中移到ackQueue队列中。ResponseProcessor线程接收从Datanode发送过来的ack,如果是一个成功的ack,表示复制Pipeline中的所有Datanode都已经接收到这个Packet,ResponseProcessor线程将packet从队列ackQueue中删除。
在发送过程中,如果发生错误,所有未完成的Packet都会从ackQueue队列中移除掉,然后重新创建一个新的Pipeline,排除掉出错的那些DataNode节点,接着DataStreamer线程继续从dataQueue队列中发送Packet。

源码下载:链接:http://pan.baidu.com/s/1nvGCj9J 密码:h6l1


http://www.niftyadmin.cn/n/785540.html

相关文章

java爬虫爬取美女图片

前言:抓住国庆假期的小尾巴,分享一波福利。 if (!existUrl(cache, saveUrl)) { //插入数据库Pic pic new Pic(title, tag, tiAdd, new Date(), saveUrl, img);picList.add(pic);// 插入缓存cache.put(new net.sf.ehcache.Element(saveUrl, saveUrl));…

java修改文件名——极乐宿舍

前言:最近看到一部很好看的台湾电影,叫极乐宿舍 已经好几年没看过台湾能拍得这么有深度的青春电影,还记得09年的那部匆匆那年,时间也过得很快,明天你会想起今天写的日记吗?回想起大学的宿舍生活&#xf…

Echarts关于雷达图的一些个性化设置

function test() {let myChart echarts.init(document.getElementById(levelImage));myChart.setOption({title: { text:null }, // 隐藏图表标题legend: { enabled: false }, // 隐藏图例tooltip : {trigger: axis},calculable : true,polar : [{nameGap : 5, // 图中工艺等字…

java23种模式之工厂模式——侠盗联盟

前言:侠盗联盟what is plan B,this is 随机应B 影片中,有句说这个是全世界最先进的安保系统,如果贼能在这系统上偷东西的话,那这个东西就值得给贼,果然是 土豪的代言人,如果贼关闭了系统再去偷…

js操作本地数据库openDatabase

前言:不想装一个数据库mysql,oracle,sqlserver软件,所以用openDatabase数据库。 创建表: db.transaction(function (trans) {trans.executeSql("create table if not exists Movie(title text null,url text …

一些关于数学的小结论(updating)

组合数C(n,m)的奇偶性:(n&m)m是奇数&#xff0c;否则偶数对于变量a,常量b,c,若a-(a%b)<c&#xff0c;则更小的a也满足此式计算n中二进制位1的个数int countBits(int n) {int count 0;while(n ! 0) {n n & (n-1);count;}return count; }方差递推计算∑ni1(xi−x⎯⎯…

java干货——一键导入QQ群里的QQ号(三)

之前写的一篇博客一键导入QQ群里的QQ号2&#xff1a;http://blog.csdn.net/sinat_15153911/article/details/71190816 然后群里有个大神说这个也是手动的太麻烦&#xff0c;那么想全自动化&#xff0c;找阿法狗吧。有需求是对的&#xff0c;但不能让走的东西变成飞吧。为此也做…

C#学习笔记之(Hellow,WORLD;常量和变量;键盘输入和输出;数据类型转换;计算器)...

HELLO,WORLD Console.Write 表示向控制台直接写入字符串&#xff0c;不进行换行&#xff0c;可继续接着前面的字符写入。 Console.WriteLine 表示向控制台写入字符串后换行。 Console.Read 表示从控制台读取字符串&#xff0c;不换行。 Console.ReadLine 表示从控制台读…