BigData 学习记录(三)

master/slave主从结构:
HDFS是一个 master/slave的架构。HDFS只有一个NameNode,即master。master负责管理文件系统命名空间和client对文件的访问。此外,HDFS有很多DataNode,通常一个机器节点一个DataNode,管理这个节点上的存储。HDFS对外提供一个文件系统名字空间允许用户把数据存为文件的格式。
文件拆分成若干个block,这些block存放在DataNode节点上。NameNode操作名字空间比如:打开,关闭,重命名文件目录。DataNode负责为文件系统的客户提供读/写操作服务。DataNode同时还为NameNode提供block创建,删除,备份机制

read write策略:
一 写入数据
  当没有配置机架信息时,所有的机器hadoop都默认在同一个默认的机架下,名为“/default-rack”,这种情况下,任何一台 datanode机器,不管物理上是否属于同一个机架,都会被认为是在同一个机架下,此时,就很容易出现之前提到的增添机架间网络负载的情况。在没有机架信息的情况下,namenode默认将所有的slaves机器全部默认为在/default-rack下
  而当Hadoop集群中配置了机架感知信息以后,hadoop在选择三个datanode时,就会进行相应的判断:
  1.如果上传本机不是一个datanode,而是一个客户端,那么就从所有slave机器中随机选择一台datanode作为第一个块的写入机器(datanode1)。
 注意:而此时如果上传机器本身就是一个datanode(例如mapreduce作业中task通过DFSClient向hdfs写入数据的时候),那么就将该datanode本身作为第一个块写入机器(datanode1)。
  2.随后在datanode1所属的机架以外的另外的机架上,随机的选择一台,作为第二个block的写入datanode机器(datanode2)。
  3.在写第三个block前,先判断是否前两个datanode是否是在同一个机架上,如果是在同一个机架,那么就尝试在另外一个机架上选择第三个datanode作为写入机器(datanode3)。而如果datanode1和datanode2没有在同一个机架上,则在datanode2所在的机架上选择一台datanode作为datanode3。
  4.得到3个datanode的列表以后,从namenode返回该列表到DFSClient之前,会在namenode端首先根据该写入客户端跟 datanode列表中每个datanode之间的“距离”由近到远进行一个排序。如果此时DFS写入端不是datanode,则选择datanode列表中的第一个排在第一位。客户端根据这个顺序有近到远的进行数据块的写入。
  5.当根据“距离”排好序的datanode节点列表返回给DFSClient以后,DFSClient便会创建BlockOutputStream,并将这次block写入pipeline中的第一个节点(最近的节点)。
  6.写完第一个block以后,依次按照datanode列表中的次远的node进行写入,直到最后一个block写入成功,DFSClient返回成功,该block写入操作结束。

二 读取数据
  我们看一下Hadoop集群配置中如何读取数据。当对某个文件的某个block进行读取的时候,hadoop采取的策略也是一样:
  1.首先得到这个block所在的datanode的列表,有几个副本数该列表就有几个datanode。
  2.根据列表中datanode距离读取端的距离进行从小到大的排序:
  a)首先查找本地是否存在该block的副本,如果存在,则将本地datanode作为第一个读取该block的datanode
  b)然后查找本地的同一个rack下是否有保存了该block副本的datanode
  c)最后如果都没有找到,或者读取数据的node本身不是datanode节点,则返回datanode列表的一个随机顺序。

时间: 2024-10-28 10:57:41

BigData 学习记录(三)的相关文章

Windows API 编程学习记录<三>

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

Spring Boot学习记录(三)--整合Mybatis

Spring Boot学习记录(三)–整合Mybatis 标签(空格分隔): spring-boot 控制器,视图解析器前面两篇都已弄好,这一篇学习持久层框架整合. 1.数据源配置 数据源使用druid,maven引入相关依赖,包括spring-jdbc依赖,mysql依赖 1.转换问题 配置的过程要学会为什么这样配置,而不是只学会了配置.这里我们可以和以前的配置方式对比: 以前版本 <!--配置数据库连接池Druid--> <bean id="dataSource"

Mybatis学习记录(三)--Mybatis配置文件详解

关于mybatis的配置文件,主要有两个,一个是SqlMapperConfig.xml文件一个是mapper.xml文件,分别对这两个进行深入全面学习. 一.SqlMapperConfig.xml文件 1.标签概况 在SqlMapperConfig.xml中主要有以下标签,其中环境集合environments和spring整合后废除不用.objectFactory和plugins不经常使用. properties(属性) settings(全局配置参数) typeAliases(类型别名) ty

BigData 学习记录(五)

MR(MapReduce)运行过程 client程序-->提交job至JobTracker-->分配job ID-->JobTracker检查输入文件存在,输出文件不存在-->进行输入分片-->Jobtracker分配资源-->初始化job(初始化就是创建一个正在运行的job对象(封装任务和记录信息),以便JobTracker跟踪job的状态和进程.)-->为每一个任务创建map任务-->任务分配(运行taskTracker与JobTracker进行沟通)-

产品需求文档的学习记录(三)

我们通过思维导图将想法进行了结构化梳理,接下来我们就需要进行方案的可行性推演,验证产品功能是否可行,预估项目要花多少人力物力,因此我们就要通过原型设计进行相关需求的论证.一开始就撰写PRD文档,我们很难对产品进行各方面的评估,也无法得知方案的可行性,并且无法直观细致的考虑产品. 原型设计是帮助我们更细致的思考,并做各项需求的评估,同时也是将自己脑海里的想法进行输出,通过原型设计后,我们就可以进行产品宣讲了.相对于之前抽象的文字描述,原型则更加清晰产品的需求,设计和技术人员或者老板也能够更加直观的

【bigdata学习记录1】【转】 一篇对大数据深度思考的文章,让你认识并读懂大数据

在写这篇文章之前,我发现身边很多IT人对于这些热门的新技术.新趋势往往趋之若鹜却又很难说的透彻,如果你问他大数据和你有什么关系?估计很少能说出一二三来.究其原因,一是因为大家对新技术有着相同的原始渴求,至少知其然在聊天时不会显得很"土鳖";二是在工作和生活环境中真正能参与实践大数据的案例实在太少了,所以大家没有必要花时间去知其所以然. 我希望有些不一样,所以对该如何去认识大数据进行了一番思索,包括查阅了资料,翻阅了最新的专业书籍,但我并不想把那些零散的资料碎片或不同理解论述简单规整并堆

c++学习记录(三)

c++面向对象记录(二) 1.继承 继承是面向对象程序设计的一个重要概念.继承指依据另一个类来定义一个类,就好像子女继承父母的基因.运用继承的方法,我们就不需要重新编写数据成员.已有的类称为基类,新建的类称为派生类或者子类. (1)子类定义 定义一个子类,使用格式: \\class 子类名: 访问修饰符 基类名 (2)访问控制和继承 子类可以访问基类中的非私有成员,不可访问私有成员.子类继承了除下列情况外基类的所有方法: ·基类的构造方法.析构方法和拷贝构造函数 ·基类的重载运算符 ·基类的友元

UNP学习记录---三次握手和四次挥手

三次握手: 1.服务器被动接受客户的连接请求,调用socket,bind,listen来完成,并且阻塞在accpet. 2.客户调用connect发起主动打开,客户发送一个SYN 3.服务器收到SYN,回复一个ACK和SYN. 4.客户回复一个ACK确认. 四次挥手: 1.客户调用close主动关闭,发送一个FIN. 2.服务器回复一个ACK 3.服务器调用close回复一个FIN 4.客户回复一个ACK 主动发起断连的那端会在最后保持一个TIME_WIAT状态. TIME_WAIT存在的理由:

ES6深入学习记录(三)编程风格

今天学习阮一峰ES6编程风格,其中探讨了如何将ES6的新语法,运用到编码实践之中,与传统的JavaScript语法结合在一起,写出合理的.易于阅读和维护的代码. 1.块级作用域 (1)let 取代 var ES6 提出了两个新的声明变量的命令: let 和 const.其中,let 完全可以取代 var,因为两者语义相同,而且 let 没有副作用. 上面代码如果用 var 替代 let,实际上就声明了两个全局变量,这显然不是本意.变量应该只在其声明的代码块内有效,var 命令做不到这一点. va