命名空间的含义是什么?

命名空间的含义是什么?,第1张

什么是命名空间,为什么要使用命名空间?

命名空间的概念C#中采用的是单一的全局变量命名空间。在这单一的空间中,如果有两个变量或函数的名字完全相同,就会出现冲突。当然,你也可以使用不同的名字,但有时我们并不知道另一个变量也使用完全相同的名字;有时为了程序的方便,必需使用同一名字。比如你定义了一个变量String user_name, 有可能在你调用的某个库文件或另外的程序代码中也定义了相同名字的变量,这就会出现冲突。命名空间就是为解决C#中的变量、函数的命名冲突而服务的。解决的办法就是将你的strTemp变量定义在一个不同名字的命名空间中。就好像张家有电视机,李家也有同样型号的电视机,但我们能区分清楚,就是因为他们分属不同的家庭。当然,我们也可以使用程序开头的using编译指示来使用命名空间中的名字。使用using编译指示的好处在于在程序中不必显式地使用命名空间限制符来访问变量。

什么是命名空间

命名空间是为了把一些类和类的实例更好地管理而定义的把这些类和实体 *** 起来的一个团体,它是_Namespace system class的一个实例,或者是_Namespace类的一个派生类,_Namespace类只有一个属性:Name。通过这个属性用户可以把某个命名空间和其他的命名空间分开来,注意命名空间的Name不能包括头缀和后缀的下划线。

命名空间可以相互联系和组织成一个具有任意层次的由类和类的实例组成的网状结构,这种结构有点象文件系统的树状结构,在同一个层次的情况下,命名空间必须具有互异的名称。

为了表示它们的层次结构你可以用右下线表示这种关系,如下:

Namespace1\Namespace2\Namespace3.....\LastNamespace

虽然说这些命名空间可以表示成这样的层次结构,但是,这些命名空间之间没有类的继承关系,也就是说,子的命名空间中的类不会自动继承父的命名空间中的类。

通常情况下,一个命名空间包含了在某激环境下一系列的类和类的实例。例如那些在Win32下定义和运行的类即使是和其他的命名空间里的类具有相同的名字也不会出现冲突,然而在建立一个新的类的时候,最好还是不要和已经建立的类的名字相同,这为将来WMI发布减少了一些问题。

C#里的命名空间是什么意思?

复制粘贴的,但是值得认真看看,建议楼主认真看看语法书,慢慢来。

命名空间提供了一种组织相关类和其他类型的方式。与文件或组件不同,命名空间是一种逻辑组合,而不是物理组合。在C#文件中定义类时,可以把它包括在命名空间定义中。以后,在定义另一个类,在另一个文件中执行相关 *** 作时,就可以在同一个命名空间中包含它,创建一个逻辑组合,告诉使用类的其他开发人员这两个类是如何相关的以及如何使用它们:

namespace CustomerPhoneBookApp

{

using System

public struct Subscriber

{

Code for struct here...

}

}

把一个类型放在命名空间中,可以有效地给这个类型指定一个较长的名称,该名称包括类型的命名空间,后面是句点(.)和类的名称。在上面的例子中,Subscriber结构的全名是CustomerPhoneBookApp.Subscriber。这样,有相同短名的不同的类就可以在同一个程序中使用了。

也可以在命名空间中嵌套其他命名空间,为类型创建层次结构:

namespace Wrox

{

namespace ProCSharp

{

namespace Basics

{

class NamespaceExample

{

Code for the class here...

}

}

}

}

每个命名空间名都由它所在命名空间的名称组成,这些名称用句点分隔开,首先是最外层的命名空间,最后是它自己的短名。所以ProfessionalCSharp命名空间的全名是Wrox.ProCSharp,NamespaceExample类的全名是Wrox.ProCSharp.Basics.NamespaceExample。

使用这个语法也可以组织自己的命名空间定义中的命名空间,所以上面的代码也可以写为:

namespace Wrox.ProCSharp.Basics

{

class NamespaceExample

{

Code for the class here...

}

}

注意不允许在另一个嵌套的命名空间中声明多部分的命名空间。

命名空间与程序集无关。同一个程序集中可以有不同的命名空间,也可以在不同的程序集中定义同一个命名空间中的类型。

using语句

显然,命名空间相当长,键入起来很繁琐,用这种方式指定某个特定的类也是不必要的。如本章开头所述,C#允许简写类的全名。为此,要在文件的顶部列出类的命名空间,前面加上using关键字。在文件的其他地方,就可以使用其类型名称来引用命名空间中的类型了:

using System

using Wrox.ProCSharp

如前所述,所有的C#源代码都以语句using System开头,这仅是因为Microsoft提供的许多有用的类都包含在System命名空间中。

如果using指令引用的两个命名空间包含同名的类,就必须使用完整的名称(或者至少较长的名称),确保编译器知道访问哪个类型,例如,类NamespaceExample同时存在于Wrox.ProCSharp.Basics和Wrox.ProCSharp.OOP命名空间中,如果要在命名空间Wrox.ProCSharp中创建一个类Test,并在该类中实例化一个NamespaceExa......

嵌套命名空间它的含义是什么,怎么去理解??

一个嵌套命名的空间即是一个嵌套作用域——其作用域嵌套在包含它命名空间内部。嵌套命名空间中的名字遵循常规规则:外围命名空间中声明的名字被嵌套命名空间声明中同一名字的声明所屏蔽。嵌套命名空间内部定义的名字局部于该命名空间。外围命名空间之外的代码只能通过限定名引用嵌套命名空间中的名字,嵌套命名空间可以改进库中代码的组织。

例如:

namespace cpIuspIus_primer{

first nested namespace:

defines the QuerY portion kf the library

namespace QueryLib{

cIass Query{ /* . . . */ }

Query operator&(const Query&, const Query&)

. . .

}

second nested namespace:

defines the SaIes_item portion of the library

namespace Bookstore {

cIass Item_base { /* . . . */ }

cIass BuIK_item : pbIic Item_base { /* . . . */ }

/ / . . .

}

}

命名空间cpIuspIus_primer 现在包含两个嵌套命名的空间:名为QueryLib的命名空间和名为Bookstore的命名空间,当库提供者需要防止库中每个部分的名字与库中其它部分的字冲突的时候,嵌套命名的空间是很有用的。

嵌套命名的空间中成员的名字由外围命名空间的名字和嵌套命名的空间的名字构成。例如:嵌套命名的空间QuerYLib中声明的类的名字是:cpIuspIus_primer : :QueryLib : :Query

这个应该可以帮的到你吧我想............................嘻嘻

C#里的 命名空间是什么意思?

ASP.NET是基于 郸#这门语言的一项技术。

如果你想学ASP.NET C#是必须要学的。

你先搞懂基本语法吧,命名空间 和 类是什么意思 不是你现在需要关心的。

就算给你讲你也听不懂。

如果你真心想学建议你去读书城先买本C#语言入门

c#关于命名空间的含义是什么?作用

命名空间(Namespace)的含义很简单, 就是字面意思: 一个对象名称的有效空间。解决的核心问题是“名字重复”,包括但不仅限于类名称、函数名称、属性名称、变量名称、接口名称等。

打个比方。

ClassA 是个小学的教材命名空间,里面有个方法:Void OnePlusOne() 即“1+1”。 小学肯定是得出结果 1+1 =2 ;

ClassB是个大学教材,里面同样的函数 Void OnePlusOne() 1+1在高等数据、立体几何里就有很多可能性了,所以他结果不一定是2,很有可能是个3.

但是方法是一样的 都叫 "1+1"。 当别人调用的时候,编译器如何区分呢? 就靠NameSpace了。

如果别人需要调用 OnePlusOne方法, 需要先输入命名空间:

ClassA.OnePlusOne() ; 或者ClassB.OnePlusOne()

这样编译器就知道你要用哪个了,避免了重名的问题。

c++命名空间具体表现究竟是什么?怎么定义(不是声明)一个命名空间?std是系统定义的命名空间吗?

#include using namespace stdnamespace NameSpaceAnamespace为关键字,NameSpaceA为定义的命名空间{ int a = 0在NameSpaceA中定义一个a} namespace NameSpaceB定义另一个命名空间{ int a = 1在NameSpaceB中定义一个a,这两个a的访问 namespace NameSpaceC嵌套 { struct Teacher { char name[10]int age}}} int main(){ using namespace NameSpaceA使用方法一:在最前面写上就像using namespace stdprintf("a= %d\n", a)这个a就是NameSpaceA里面的a了 printf("a= %d\n", NameSpaceB::a)使用方法2,空间名::变量 方法一使用Teacher using namespace NameSpaceB::NameSpaceCTeacher t1 = {"aaaaa", 25}方法二使用Teacher NameSpaceB::NameSpaceC::Teacher t2 = {"bbbbbb", 22}return0}另外,std是c++标准命名空间,c++标准程序库中的所有标识符都被定义在std中,比如标准库中的类ostream 、istream等。但是在头文件iostream中并没有声明这一空间,需要程序员手动写上using namespace std; 如果不写,则在使用std::cout<<"hello..."<

命名空间是为了防止使用C++做大型程序的时候发生串包。

欢迎回复讨论

在c++中‘命名空间’是什么意思?‘std::’是什么意思?谢

举个例子吧,我们的名字,有很多时候会重名,比如张三.

世界上可能有几十几百个张三.

我们的世界里当然可以用身份z号码来分啦,但在没有身份z的时代怎么分呢?

有办法的,比如,可以在名字前面加上地方名,如

广东的张三

上海的张三

同样的道理,我们在编程时,不同的程序员可能都会喜欢用同样的名字来表示相同的东西,如,大家可能都会用dog来表示狗类.好了,现在有好几位程序员都写了dog类,可能各自的功能不同或相同.就好比好几家人都养了条狗一样.好了,在程序调用时,编译器傻了,它不知道该拉哪家的狗出来响应呀!

怎么办?哦,让我们在狗前面加上namespace(名字空间)以示区分,好了,于是程序中就有了

张三 的 狗

李四 的 狗

罗嗦了一大堆,该说回来了

std::

std表示是C++的标准命名空间,就是编译系统自带有的,按C++标准定义好了的。

:: 书写格式

比如,在使用输出std::cout时,如果它达不到我们想要的效果,我们也可以自己定义一个名字空间,

取名myspace,再在这个空间里写一个cout函数来实现.调用时,就成了myspace::cout.

在一种类型的前面加上命名空间是什么意思?

防止和系统的类型或方法冲突

C#中名称空间的具体定义是什么?

C#中的类是利用命名空间组织起来的。命名空间提供了一种从逻辑上组织类的方式,防止命名冲突。

命名空间声明

用namespace 关键字用于声明一个命名空间。此命名空间范围允许您组织代码并为您提供了创建全局唯一类型的方法。

namespace name

{

类型定义

}

其中:在命名空间中,可以声明类、接口、结构、枚举、委托 命名空间。

如果未显式声明命名空间,则会创建默认命名空间。该默认的命名空间(有时称为全局命名空间)。全局命名空间中的任何标识符都可用于命名的命名空间中。

命名空间声明可以作为顶级声明出现在编译单元中,当命名空间声明作为顶级声明出现在编译单元中时,该命名空间成为全局命名空间的一个成员。

命名空间声明出现在另一个命名空间声明内时,该内部命名空间就成为包含着它的外部命名空间的一个成员。

无论是何种情况,一个命名空间的名称在它所属的命名空间内必须是唯一的。命名空间隐式地为 public,而且在命名空间的声明中不能包含任何访问修饰符。

嵌套的命名空间

命名空间声明中声明命名空间,各命名空间用”.”分隔。

例如:

namespace N1.N2

{

class A {}

class B {}

}

在语义上等效于

namespace N1

{

namespace N2

{

class A {}

class B {}

}

}

引用类

引用一个类可以用完全限定名来限定引用类(类名前加上命名空间名),以防止命名冲突。

using 指令来导入其他命名空间和类型的名称,直接地而不是通过限定名来引用它们。

Using指令

using 别名指令为一个命名空间或类型启用一个别名。

using 命名空间指令用于导入一个命名空间的类型成员。

(1) using 命名空间指令将一个命名空间中所包含的类型导入到编译单元或命名空间体中,从而可以直接使用这些被导入的类型的标识符而不必加上它们的限定名。

如:

namespace N1.N2

{

class A {}

}

namespace N3

{

using N1.N2

class B

{

public static void Main()

{

A a=new A()

}

}

}

上面的示例中,在 N3 命名空间中N1.N2 的类型成员是直接可用的,不需要完全限定名.

(2)using 命名空间指令导入包含在给定命名空间中的类型,但要注意,它不导入嵌套的命名空间。

示例:

namespace N1.N2

{

class A {}

}

namespace N3

{

using N1

class B

{

public static void Main()

{......

命名空间包就是由多部分构成的,每个部分为父包增加一个子包。

1.命名空间包是由多个 部分 构成的,每个部分为父包增加一个子包。 各个部分可能处于文件系统的不同位置。 部分也可能处于 zip 文件中、网络上,或者 Python 在导入期间可以搜索的其他地方。 命名空间包并不一定会直接对应到文件系统中的对象;它们有可能是无实体表示的虚拟模块。

2.命名空间包的 __path__ 属性不使用普通的列表。 而是使用定制的可迭代类型,如果其父包的路径 (或者最高层级包的 sys.path) 发生改变,这种对象会在该包内的下一次导入尝试时自动执行新的对包部分的搜索。

3.命名空间包没有 parent/__init__.py 文件。 实际上,在导入搜索期间可能找到多个 parent 目录,每个都由不同的部分所提供。 因此 parent/one 的物理位置不一定与 parent/two 相邻。 在这种情况下,Python 将为顶级的 parent 包创建一个命名空间包,无论是它本身还是它的某个子包被导入。

4.命名空间包的 __path__ 属性不使用普通的列表。 而是使用定制的可迭代类型,如果其父包的路径 (或者最高层级包的 sys.path) 发生改变,这种对象会在该包内的下一次导入尝试时自动执行新的对包部分的搜索。

5.导入就是另外一个地方的代码引用到当前代码域中来,供我们使用,很多单独且公共的我们需要把它封装起来形成包,让代码看上去更加整洁。

import 语句结合了两个 *** 作;它先搜索指定名称的模块,然后将搜索结果绑定到当前作用域中的名称。 import 语句的搜索 *** 作定义为对 __import__() 函数的调用并带有适当的参数。 __import__() 的返回值会被用于执行 import 语句的名称绑定 *** 作。 请参阅 import 语句了解名称绑定 *** 作的更多细节。

6.对 __import__() 的直接调用将仅执行模块搜索以及在找到时的模块创建 *** 作。 不过也可能产生某些副作用,例如导入父包和更新各种缓存 (包括 sys.modules),只有 import 语句会执行名称绑定 *** 作。

7.当 import 语句被执行时,标准的内置 __import__() 函数会被调用。 其他发起调用导入系统的机制 (例如 importlib.import_module()) 可能会选择绕过 __import__() 并使用它们自己的解决方案来实现导入机制。

8.当一个模块首次被导入时,Python 会搜索该模块,如果找到就创建一个 module 对象 1 并初始化它。 如果指定名称的模块未找到,则会引发 ModuleNotFoundError。 当发起调用导入机制时,Python 会实现多种策略来搜索指定名称的模块。 这些策略可以通过使用使用下文所描述的多种钩子来加以修改和扩展。

HDFS Architecture

Hadoop Distributed File System (HDFS) 是设计可以运行于普通商业硬件上的分布式文件系统。它跟现有的分布式文件系统有很多相通的地方,但是区别也是显著的。HDFS具有高度容错性能,被设计运行于低成本硬件上。HDFS可以向应用提供高吞吐带宽,适合于大数据应用。HDFS 放宽了一些 POSIX 的要求,以开启对文件系统数据的流式访问。HDFS 最初是作为Apache Nutch web 搜索引擎项目的基础设施开发的。HDFS 现在是 Apache Hadoop 核心项目的一部分。

HDFS是主从架构。一个HDFS集群包含一个NameNode,一个管理文件系统命名空间和控制客户端访问文件的master server。以及,若干的 DataNodes,通常集群的每个node一个,管理运行DataNode的节点上的存储。HDFS 发布一个文件系统命名空间,并允许用户数据已文件的形式存储在上面。内部,一个文件被分成一个或多个块,存储在一组DataNodes上。NameNode 执行文件系统命名空间 *** 作,比如:打开、关闭、重命名文件或目录。它还确定块到DataNodes的映射。DataNodes 负责向文件系统客户端提供读写服务。DataNodes 根据 NameNode 的指令执行块的创建、删除以及复制。

NameNode 和 DataNode 是设计运行于普通商业机器的软件。这些机器通常运行 GNU/Linux *** 作系统。HDFS 是Java 语言编写的;任何支持Java的机器都可以运行NameNode or DataNode 软件。使用高移植性Java语言,意味着HDFS可以部署在很大范围的机器上。一个典型的部署就是一台特定的机器只运行NameNode 软件,而集群内的其他机器运行DataNode 软件的一个实例。这种架构不排除一台机器上运行多个DataNodes ,但是在实际部署中很少见。

单 NameNode 节点的存在大大简化了架构。NameNode 是所有HDFS 元数据的仲裁和仓库。系统设计上,用户数据永远不经过NameNode。

HDFS 支持传统的文件分级组织。用户或应用可以创建目录,并在目录内存储文件。 文件系统命名空间的层次结构跟其他文件系统类似;可以创建、删除、移动、重命名文件。HDFS 支持 user quotas 和 access permissions 。 HDFS 不支持软、硬链接。但是,HDFS 架构不排除实现这些功能。

虽然HDFS遵守 文件系统命名约定 ,一些路径和名称 (比如/.reserved 和.snapshot ) 保留了。比如功能 transparent encryption 和 snapshot 就使用的保留路径。

NameNode 维护文件系统命名空间。任何文件系统命名空间或属性的变化,都会被NameNode记录。 应用可以指定HDFS应维护的文件副本数量。文件副本的数量被称为该文件的复制因子 replication factor 。该信息存储于NameNode。

HDFS 被设计用于在一个大规模集群上跨机器可靠地存储巨大的文件。它以一序列的块的方式存储文件。每个文件都可以配置块尺寸和复制因子。

一个文件除了最后一个块外,其他的块一样大。在 append 和 hsync 添加了可变长度块的支持后,用户可以启动一个新的块,而不用填充最后一个块到配置的块大小。

应用可以指定一个文件的副本数量。复制因子可以在创建的时候指定,也可以以后更改。HDFS的文件只写一次(除了 appends 和 truncates) ,并在任何时候只允许一个 writer 。

NameNode 指定块复制的所有决策。它周期性的从集群的每个DataNodes 接受 Heartbeat 和 Blockreport。Heartbeat 的接受代表 DataNode 工作正常。Blockreport 包含了DataNode上所有块的清单。

副本的位置对HDFS的可靠性和性能至关重要。副本位置的优化是HDFS和其他大多数分布式文件系统的区别。这是一个需要大量调优和经验的特性。Rack-aware 复制策略的目的就是提高数据可靠性,可用性和网络带宽利用率。当前副本位置策略的实现是这个方向的第一步。实施该策略的短期目标是在生产环境验证它,了解其更多的行为,为测试和研究更复杂的策略打下基础。

大型HDFS实例运行在跨多个Rack的集群服务器上。不同rack的两个node通信需要通过交换机。大多数情况下,同一rack内的带宽大于rack之间的带宽。

NameNode 通过在 Hadoop Rack Awareness 内的进程描述 判断DataNode 属于哪个rack id。一个简单但是并非最佳的策略是将副本分布于不同的racks。这可以防止整个机架发生故障时丢失数据,并允许在读取数据时使用多个机架的带宽。该策略在群集中均匀地分布副本,使得组件故障时很容易平衡负载。 但是,该策略会增加写入成本,因为写入 *** 作需要将块传输到多个机架。

一般,复制因子设置为3, HDFS 的分布策略是:如果writer在datanode上则将一个副本放到本地机器, 如果writer不在datanode上则将一个副本放到writer所在机柜的随机datanode 上;另一个副本位于不同机架的node上;最后一个副本位于同一远程机架的不同node上。 该策略减少了机架间的写流量,提升了写性能。机架故障的概率远小于节点故障的概率;此策略不会影响数据可靠性和可用性承诺。但是,在读取数据时,它确实减少了聚合带宽,因为块存储于两个机柜而不是三个机柜内。使用此策略,副本不会均匀的分布于机架上。1/3 副本 位于同一节点, 2/3 副本位于同一机架, 另1/3副本位于其他机架。该策略提升了写性能而不影响数据可靠性和读性能。

如果复制因子大于3,那么第4个及以后的副本则随机放置,只要满足每个机架的副本在(replicas - 1) / racks + 2)之下。

因为 NameNode 不允许 DataNodes 拥有同一个块的多个副本,所以副本的最大数就是DataNodes的数量。

在把对 存储类型和存储策略 的支持添加到 HDFS 后,除了上面介绍的rack awareness外, NameNode 会考虑其他副本排布的策略。NameNode 先基于rack awareness 选择节点,然后检查候选节点有文件关联的策略需要的存储空间。 如果候选节点没有该存储类型, NameNode 会查找其他节点。如果在第一条路径中找不到足够的节点来放置副本,NameNode会在第二条路径中查找具有回滚存储类型的节点。 、

当前,这里描述的默认副本排布策略正在使用中。

为了最小化全局带宽消耗和读取延迟, HDFS 会尝试从最靠近reader的副本响应读取请求。如果在reader节点的同一机架上上存在副本,则该副本有限响应读请求。如果HDFS集群跨多个数据中心,则本地数据中心优先。

启动时,NameNode 会进入一个称为 Safemode 的特殊状态。当NameNode处于Safemode状态时,不会复制数据块。NameNode从DataNodes接收Heartbeat和Blockreport消息。Blockreport包含DataNode托管的数据块列表。每个块都指定了最小副本数。当数据块的最小副本数已与NameNode签入时,该块被认为是安全复制的。在NameNode签入安全复制数据块的已配置百分比(加上额外的30秒)后,NameNode退出Safemode状态。然后,它判断列表内的数据块清单是否少于副本指定的数量。NameNode 然后复制这些块给其他 DataNodes。

HDFS 命名空间由 NameNode 存储。NameNode 使用事务日志 EditLog 来持久化的保存系统元数据的每次变更。比如,在HDFS创建一个新文件,NameNode会在 EditLog 插入一条记录来指示该变更。类似的,变更文件的复制因子也会在 EditLog 插入一条新记录。NameNode 以文件的形式,将 EditLog 保存在本地OS文件系统上。整个文件系统命名空间,包括块到文件的映射、文件系统属性,都存储于名字为 FsImage 的文件内。 FsImage 也以文件的形式,存储在NameNode的本地文件系统上。

NameNode 将包含整个文件系统和块映射的image保存在内存中。当NameNode启动时,或检查点被预先定义的阈值触发时,它会从磁盘读取 FsImage 和 EditLog ,把 EditLog 内的事物应用到内存中的FsImage,再将新版本刷新回磁盘的新 FsImage 。然后会截断旧的 EditLog ,因为它的事物已经应用到了持久化的 FsImage 上。 这个过程称为检查点 checkpoint 。检查点的目的是通过对文件系统元数据进行快照并保存到FsImage,来确保HDFS拥有文件系统元数据的一致性视图。尽管读取 FsImage 是高效的,但是对 FsImage 直接增量修改是不高效的。不是对每次编辑修改 FsImage ,而是将每次编辑保存到 Editlog 。在检查点期间,将 Editlog 的变更应用到 FsImage 。一个检查点可以在固定周期(dfs.namenode.checkpoint.period)(以秒为单位)触发,也可以文件系统事物数量达到某个值(dfs.namenode.checkpoint.txns)的时候触发。

DataNode 在本地文件系统上以文件的形式存储 HDFS data 。DataNode 不知道 HDFS 文件。它将HDFS data 的每个块以独立的文件存储于本地文件系统上。DataNode 不在同一目录创建所有的文件。而是,使用heuristic来确定每个目录的最佳文件数量,并适当的创建子目录。在一个目录创建所有的本地文件是不好的,因为本地文件系统可能不支持单目录的海量文件数量。当DataNode启动的时候,它扫描本地文件系统,生成与本地文件系统一一对应的HDFS数据块列表,然后报告给NameNode。这个报告称为 Blockreport。

所有的HDFS通信协议都在TCP/IP协议栈上。客户端与NameNode指定的端口建立连接。与NameNode以ClientProtocol 通信。DataNodes与NameNode以DataNode Protocol进行通信。远程过程调用(RPC)封装了Client Protocol 和 DataNode Protocol。设计上,NameNode从不启动任何RPCs。相反,它只应答DataNodes or clients发出的RPC请求。

HDFS的主要目标是可靠的存储数据,即使是在故障的情况下。常见故障类型有三种: NameNode failures , DataNode failures network partitions

每个DataNode都周期性的向NameNode发送心跳信息。 一个 network partition 可能导致DataNodes子集丢失与NameNode的连接。NameNode会基于心跳信息的缺失来侦测这种情况。NameNode将没有心跳信息的DataNodes标记为 dead ,并不再转发任何IO请求给它们。任何注册到dead DataNode的数据对HDFS将不再可用。DataNode death会导致某些块的复制因子低于它们指定的值。NameNode不断跟踪需要复制的块,并在必要时启动复制。很多因素会导致重新复制:DataNode不可用,副本损坏,DataNode上硬盘故障,复制因子增加。

标记 DataNodes dead 的超时时间保守地设置了较长时间 (默认超过10分钟) 以避免DataNodes状态抖动引起的复制风暴。对于性能敏感的应用,用户可以设置较短的周期来标记DataNodes为过期,读写时避免过期节点。

HDFS 架构支持数据再平衡schemes。如果一个DataNode的空余磁盘空间低于阈值,sheme就会将数据从一个DataNode 移动到另外一个。在某些文件需求突然增长的情况下,sheme可能会在集群内动态的创建额外的副本,并再平衡其他数据。这些类型的数据再平衡schemes还没有实现。

有可能从DataNode获取的数据块,到达的时候损坏了。这种损坏可能是由于存储设备故障、网络故障、软件bug。HDFS客户端软件会HDFS的内容进行校验。当客户端创建HDFS文件的时候,它计算文件每个块的校验值,并以独立的隐藏文件存储在同一HDFS命名空间内。当客户端检索文件时候,它会校验从每个DataNode获取的数据,是否与关联校验文件内的校验值匹配。 如果不匹配,客户端可以从另外拥有副本块的DataNode检索。

FsImage 和 EditLog 是HDFS的核心数据结构。这些文件的损坏将导致HDFS实例异常。 因此,NameNode可以配置为支持多 FsImage 和 EditLog 副本模式。任何对 FsImage or EditLog 的更新都会导致每个 FsImages 和 EditLogs 的同步更新。 FsImage 和 EditLog 的同步更新会导致降低命名空间每秒的事物效率。但是,这种降级是可以接受的,因为HDFS应用是数据密集型,而不是元数据密集型。当NameNode重启的时候,它会选择最新的一致的 FsImage 和 EditLog 。

另外一种提供故障恢复能力的办法是多NameNodes 开启HA,以 shared storage on NFS or distributed edit log (called Journal)的方式。推荐后者。

Snapshots - 快照,支持在特定时刻存储数据的副本。快照功能的一个用法,可以回滚一个故障的HDFS实例到已知工作良好的时候。

HDFS被设计与支持超大的文件。与HDFS适配的软件都是处理大数据的。这些应用都只写一次,但是它们会读取一或多次,并且需要满足流式读速度。HDFS支持文件的 一次写入-多次读取 语义。 HDFS典型的块大小是128 MB.。因此,HDFS文件被分割为128 MB的块,可能的话每个块都位于不同的DataNode上。

当客户端以复制因子3写入HDFS文件时,NameNode以 复制目标选择算法 replication target choosing algorithm 检索DataNodes 列表。该列表包含了承载该数据块副本的DataNodes清单。然后客户端写入到第一个DataNode。第一DataNode逐步接受数据的一部分,将每一部分内容写入到本地仓库,并将该部分数据传输给清单上的第二DataNode。第二DataNode,按顺序接受数据块的每个部分,写入到仓库,然后将该部分数据刷新到第三DataNode。最终,第三DataNode将数据写入到其本地仓库。

因此,DataNode从管道的前一个DataNode获取数据,同时转发到管道的后一个DataNode。因此,数据是以管道的方式从一个DataNode传输到下一个的。

应用访问HDFS有很多方式。原生的,HDFS 提供了 FileSystem Java API 来给应用调用。还提供了 C language wrapper for this Java API 和 REST API 。另外,还支持HTTP浏览器查看HDFS实例的文件。 通过使用 NFS gateway ,HDFS还可以挂载到客户端作为本地文件系统的一部分。

HDFS的用户数据是以文件和目录的形式组织的。它提供了一个命令行接口 FS shell 来提供用户交互。命令的语法类似于其他shell (比如:bash, csh)。如下是一些范例:

FS shell 的目标是向依赖于脚本语言的应用提供与存储数据的交互。

DFSAdmin 命令用于管理HDFS集群。这些命令仅给HDFS管理员使用。如下范例:

如果启用了回收站配置,那么文件被 FS Shell 移除时并不会立即从HDFS删除。HDFS会将其移动到回收站目录(每个用户都有回收站,位于 /user/<username>/.Trash )。只要文件还在回收站内,就可以快速恢复。

最近删除的文件大多数被移动到 current 回收站目录 ( /user/<username>/.Trash/Current ),在配置周期内,HDFS给 current目录内的文件创建检查点 checkpoints (位于 /user/<username>/.Trash/<date>) ,并删除旧的检查点。参考 expunge command of FS shell 获取更多关于回收站检查点的信息。

在回收站过期后,NameNode从HDFS命名空间删除文件。删除文件会将文件关联的块释放。注意,在用户删除文件和HDFS增加free空间之间,会有一个明显的延迟。

如下范例展示了FS Shell如何删除文件。我们在delete目录下创建两个文件(test1 &test2)

我们删除文件 test1。如下命令显示文件被移动到回收站。

现在我们尝试以skipTrash参数删除文件,该参数将不将文件发送到回收站。文件将会从HDFS完全删除。

我们检查回收站,只有文件test1。

如上,文件test1进了回收站,文件test2被永久删除了。

当缩减文件的复制因子时,NameNode选择可以被删除的多余副本。下一个Heartbeat会通报此信息给DataNode。DataNode然后会删除响应的块,相应的剩余空间会显示在集群内。同样,在setReplication API调用完成和剩余空间在集群显示之间会有一个时间延迟。

Hadoop JavaDoc API .

HDFS source code: http://hadoop.apache.org/version_control.html


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/11696156.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存