赞
踩
大数据:(Big Data
):数据量级很大的应用处理。TB级 ,日数据增长GB级
K -- M---- G ---- T ----PB ---- EB ---ZB 1024
通过对海量数据进行分析,挖掘,进而发现数据内在的规律,从而为企业或者国家创造价值
4V
是大数据典型的特点具体指的是:
Google
是最早面临大数据问题的公司。大数据起源可以说是google最早开源的3篇论文,开创了大数据时代
Hadoop
主要是用来解决大数据所面临的数据存储
和数据计算
的问题。
2003-2004年,Google公布了部分GFS和MapReduce思想的细节,受此启发的Doug Cutting等人用2年的业余时间实现了DFS和MapReduce机制,使Nutch性能飙升。然后Yahoo招安Doug Gutting及其项目。
2005年,Hadoop作为Lucene的子项目Nutch的一部分正式引入Apache基金会。
2006年2月被分离出来,成为一套完整独立的软件,起名为Hadoop
Hadoop名字不是一个缩写,而是一个生造出来的词。是Hadoop之父Doug Cutting儿子毛绒玩具象命名的。
Hadoop之父
Doug Cutting
,可能所有人都间接用过他的作品,他是Lucene
、Nutch
、Hadoop
等项目的发起人
。是他,把高深莫测的搜索技术形成产品,贡献给我们;还是他,打造了目前在云计算和大数据领域里如日中天的Hadoop。
Haoop核心设计
HDFS (Hadoop Distribute File System) -------> GFS
MapReduce -------> MapReduce
HBase -------> Big Table
apache
组织正式开源,并将hadoop作为apache顶级的开源项目之一
版本 | 是否收费 | 使用难度 |
---|---|---|
Apache 开源的Hadoop | 免费 | ★★★★☆ |
Clouder(CDH) | $4000 (1个节点) | ★★★☆☆ |
Hortonworks | $12500(10个节点) | ★★★☆☆ |
华为hadoop | 未知(内部使用) | ☆☆☆☆☆ |
注意:在实际开发中Appache的Hadoop企业实际使用并不多。最原始(基础)版本。但是却是学习hadoop的基础。
1.高可靠性
Hadoop按位存储和处理数据的能力值得人们信赖。
2.高扩展性
Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
3.高效性
Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
4.高容错性。
Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。Hadoop带有用Java语言编写的框架,因此运行在Linux生产平台上是非常理想的。Hadoop上的应用程序也可以使用其他语言编写,比如C++。
HDFS(Hadoop Distributed File System)是基于流数据模式访问和处理超大文件的需
求而开发的,是一个分布式文件系统。它是 Google 的 GFS 提出之后出现的另外 种文件
系统。它有一定高度的容错性,而且提供了高吞吐量的数据访问,非常适合应用在大规模数 据集上。
优点:
(1)高容错HDFS是可以由成百上千台服务器机器组成,每个服务器机器存储文件系统数据的一部分。HDFS中的副本机制会自动把数据保存多个副本,DataNode节点周期性地向NameNode发送心跳信号,当网络发生异常,可能导致DataNode与NameNode失去通讯,NameNode和DataNode通过心跳检测机制,发现DataNode宕机,DataNode中副本丢失,HDFS则会从其他DataNode上面的副本自动恢复,所以HDFS具有高的容错性。
(2)流式数据访问
HDFS的数据处理规模比较大,应用程序一次需要访问大量的数据,同时这些应用程序一般都是批量的处理数据,而不是用户交互式处理,所以应用程序能以流的形式访问数据集,请求访问整个数据集要比访问一条记录更加高效。
(3)支持超大文件
HDFS分布式文件系统具有很大的数据集,旨在可靠的大型集群上存储超大型文件(GB、TB、PB级别的数据),它将每个文件切分成多个小的数据块进行存储,除了最后一个数据块之外的所有数据块大小都相同,块的大小可以在指定的配置文件中进行修改,在Hadoop2.x版本中默认大小是128M。
(4)高数据吞吐量
HDFS采用的是“一次写入,多次读取”这种简单的数据一致性模型,在HDFS中,一个文件一旦经过创建、写入、关闭后,一旦写入就不能进行修改了,只能进行追加,这样保证了数据的一致性,也有利于提高吞吐量。
(5)可构建在廉价的机器上
Hadoop的设计对硬件要求低,无需构建在昂贵的高可用性机器上,因为在HDFS设计中充分考虑到了数据的可靠性、安全性和高可用性。
缺点:
(1)高延迟HDFS不适用于低延迟数据访问的场景,例如:毫秒级实时查询。
(2)不适合小文件存取场景
对于Hadoop系统,小文件通常定义为远小于HDFS的数据块大小(128MB)的文件,由于每个文件都会产生各自的元数据,Hadoop通过NameNode来存储这些信息,若小文件过多,容易导致NameNode存储出现瓶颈。
(3)不适合并发写入
HDFS目前不支持并发多用户的写操作,写操作只能在文件末尾追加数据。
数据块(Block)是HDFS上存储数据的基本单位。任何一个文件系统都有数据块的概念,只要是文件系统,都涉及文件数据的存储问题,需要相应的数据结构,那么数据块可以说是文件系统上存储数据的基本单位。 Windows 文件系统有自己的数据块设计,Linux 文件系统也有自己的数据块设计,不同文件系统的数据块设计会根据存储的特点有所差异。
Hadoop 1.0,HDFS数据块的大小是64MB,到了Hadoop 2.0,HDFS数据块的大小升级到了128MB
,比Windows或者Linux文件系统中字节级别的数据块大了多个数量级。当小于一个数据块大小的文件存储进来时不会占据整个数据块的空间,假如一个文件的大小是10MB,那么剩余118MB的空间还可以被其他文件使用
。某一个文件所占用的块数及相关的数据信息可以通过操作命令的方式来查看
为了提升HDFS的可靠性,可以创建多份数据块的副本(Replicas)
,并将它们放置在服务器集群的DataNode节点,以便MapReduce分布式并行计算框架可以在数据块所在的节点上处理这些数据。这里需要注意的是,创建的多份数据块的副本是针对同一份数据的。比如,一个文件的大小是1280MB,它在HDFS磁盘上被切分成了10块,即1280MB/128MB=10块,然后对这10块中的每一块进行复制,一般复制系数是3,也就是将每一块数据复制成3份一模一样的数据,它们互为副本。
我们可以选择这3份副本中的任意一份副本来使用。复制系数可以自定义,每当复制系数增加1,就意味着该文件被多冗余一次,所以复制系数的设置要根据集群的配置性能来考量。一般为了保证数据的安全性,将该系数设置为3即可。数据块的复制,会产生大量的数据块副本,这些数据块副本按照文件的组织存储成块的序列。块的大小和复制系数,可以通过
hdfs-site.xml 配置文件进行具体设置。hdfs-site.xml 中dfs.replication属性更改复制因子,不过需要重启hdfs系统。用hdfs
shell命令可以动态更改,hadoop fs -setrep -R 3 / , 更改整个hdfs备份数,不需要重启。
数据块的分布式存储和数据块副本的存放策略,不但可以保证数据的可靠性,还能提供更好的性能。当一份数据有多个副本时,若其中某一个副本突然损坏,还可以继续使用剩下的副本,HDFS正是通过数据块冗余的方式来保证数据的可靠性。
那么,当一份数据有多个副本时,到底选择哪一个副本呢?这涉及数据块副本存放策略,若存放恰当便能体现出高性能。在分布式集群中,通常包含非常多的服务器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都是由多个机架组织而成。机架内服务器之间的网络速度通常都会高于跨机架机器之间的网络速度,并且机架之间服务器的网络通信通常受到上层交换机间网络带宽的限制。由于Hadoop的HDFS对数据文件的分布式存放是以数据块为单位的,每个数据块会有多个副本(默认为3),并且为了数据的安全和高效,Hadoop中3个副本的存放策略如下。第1个副本放置在客户端所在的DataNode节点里(如果客户端不在集群范围内,则第1个DataNode随机选取,当然原则还是选取距离客户端最近的DataNode)。
第2个副本放置在与第1个节点不同机架中的DataNode中(随机选取)。
第3个副本放置在与第1个副本所在节点同一机架的另一个节点上。
如果还有更多的副本,就随机放在集群的DataNode里。这样的策略优先保证本机架下对该数据块所属文件的访问,如果此机架发生故障,也可以在另外的机架上找到该数据块的副本。这样既高效,又可容错。
上述过程称为Hadoop的机架感知。
Hadoop的机架感知在默认情况下是关闭状态,所以,Hadoop集群HDFS会随机选择机架。
启用Hadoop机架感知功能,其配置方法非常简单,在NameNode所在机器的core-site.xml配置文件中配置。
在Hadoop的HDFS网络集群中,由于集群规模庞大,非常容易出现服务器与服务器之间磁盘利用率不均衡的情况,例如,集群内新增、删除节点,或者某个节点机器内硬盘存储达到饱和值。当数据不均衡时,映射任务可能会分配给没有存储数据的机器,这将导致网络带宽的消耗,也无法很好地进行本地计算。当HDFS负载不均衡时,需要对HDFS进行数据的负载均衡调整,
即对各节点机器上数据的存储分布进行调整,从而让数据均匀地分布在各个DataNode节点上,均衡I/O性能,防止热点的发生。
然而,进行数据的负载均衡调整,必须要满足以下原则:
- 数据均衡不能导致数据块减少和数据块备份丢失;
- 管理员可以中止数据均衡进程;
- 每次移动的数据量及占用的网络资源必须是可控的;
- 数据均衡过程,不能影响NameNode的正常工作。
Hadoop HDFS负载均衡的原理
负载均衡程序作为一个独立的进程与NameNode进程分开执行,数据负载均衡过程的核心是一个数据负载均衡算法,该算法将不断迭代数据负载均衡的逻辑,直至集群内数据均衡为止。该数据负载均衡算法每次迭代的逻辑如图:
Hadoop 集群 HDFS 是主从架构,在主节点上包含的守护进程有 NameNode和ResourceManager,在从节点上包含的守护进程有DataNode和NodeManager。主节点在启动的时候会开启一个进程间的通信服务(Inter-ProcessCommunication,IPC),等待从节点的连接。从节点启动后,会主动连接IPC服务,并且每隔3s连接一次,这个时间是可以调整的,即设置心跳时间。
从节点通过心跳给主节点汇报自己的信息,主节点通过心跳给从节点下达命令
。NameNode通过心跳得知DataNode的状态信息,ResourceManager通过心跳得知NodeManager的状态。如果主节点长时间(一般是10min以内)没有收到从节点的心跳信息,主节点就认为从节点已失效。这就是HDFS的心跳机制。
在通常情况下,大型 Hadoop 集群是以机架的形式来组织的,同一个机架上不同节点间的网络状况比不同机架之问的更为理想。另外,NameNode 设法将数据块副本保存在不同 的机架上,尽量做到将3个副本分布到不同的节点上,以提高容错性
那么,通过什么方式告知Hadoop 哪些 Slave 机器属于哪个 Rack?
默认情况下,Hadoop 的机架感知是没有被启用的。所以,在通常情况下,Hadoop 集群 的 HDFS
在选机器的时候,是随机选择的,也就是说,很有可能在写数据时,Hladoop 将第 块数据 Block1 写到 Rack1
上,然后在随机的选择下将 Block2写人到 Rack2下,此时两个 Rack之间产生了数据传输的流量。之后,在随机的情况下,又将
Block3 重新又写回 Rack1,此时,两个Rack 之间又产生了一次数据流量。在Job处理的数据量非常大,或者往 hadoop
推送的数据量非常大的时候,这种情况会造成 Rack 之间的网络流量成倍的上升,成为性能的瓶颈,进而影响作业的性能乃至整个集群的服务。
要将 Hadoop 机架感知的功能启用,配置非常简单,在 NameNode 所在机器的core-site.xml 配置文件中配置一个选项:
<property>
<name>topology.script.file.name</name>
<value>/home/bigdata/apps/hadoop/etc/hadoop/RackAware.py </value>
</property>
这个配置选项的value指定为一个可执行程序,通常为一个脚本,该脚本接受一个参数,输出一个值。
接受的参数通常为某台datanode机器的ip地址,而输出的值通常为该ip地址对应的datanode所在的rack,例如”/rack1”。
Namenode启动时,会判断该配置选项是否为空,如果非空,则表示已经启用机架感知的配置,此时namenode会根据配置寻找该脚本,
并在接收到每一个datanode的heartbeat时,将该datanode的ip地址作为参数传给该脚本运行,并将得到的输出作为该datanode所属的机架ID,保存到内存的一个map中.
机架感知如何工作:
第一个节点
集群内部(优先考虑和客户端相同节点作为第一个节点)
集群外部(选择资源丰富且不繁忙的节点为第一个节点)
第二个节点
选择和第一个节点不同机架的其他节点
第三个节点
与第二个节点相同机架的其他节点
第N个节点
与前面节点不重复的其他节点
NameNode 在启动时会自动进人安全模式(SafeMode),也可以手动进人。
安全模式是Hadoop 集群的一种保护模式
。当系统处于安全模式时,会检查数据块的完整性。假设我们设置的副本数(即参数dfs. replication)是5,那么在 DataNode 上就应该有 5个副本存在若只有3个副本,那么比率就是3/5=0.6。在配置文件 hdfs-default. xml 中定义了一个最小的副本率 0.999。
<property>
‹name>dfs.safemode.threshold.pct</name>
‹value>0.999f</value>
</property>
1.当前的副本率0.6明显小于0.999,因此系统会自动复制副本到其他 DataNode, 当DataNode 上报的 Block个数达到了元数据记录的 Block 个数的0.999倍时才可以离开安全模式,否则一直是这种只读模式。如果设为1则 HDFS 永远处于安全模式。如果系统中有8个副本,超过我们设定的5个副本,那么系统也会删除多余的3个副本。由此看来,安全模式是 Fadoop 的一种保护机制,用于保证集群中数据块的安全性的。
当系统处于安全模式时,不接受任何对名称空间的修改,同时也不会对数据库进行复制或删除。虽然不能进行修改文件操作,但是可以浏览目录结构、查看文件内容等操作。
在安全模式下运行Hadoop程序时,有时会报以下错误:
org.apache.hadoop.dfs.SafeModeException;
Cannotdelete/user/hadoop/input, Name node is in safe mode.
正常情况下,安全模式会运行一段时间后自动退出,只是需要等一会儿。有没有不用等,直接退出安全模式的方法呢?下面一起来看一下如何用命令来操作安全模式。
hadoop dfsadmin -safemode leave //强制NameNode退出安全模式
hadoop dfsadmin -safemode enter //进入安全模式
hadoop dfsadmin -safemode get //查看安全模式状态
hadoop dfsadmin -safemode wait //等待,一直到安全模式结束
HDFS采用主从(Master/Slave)架构 在最新的Hadoop版本中,一个HDFS集群由多个NameNode和多个DataNode组成。
NameNode 作为主控服务器节点
,负责管理 HDFS 的命名空间,记录文件数据块在每个DataNode节点上的位置和副本信息,协调客户端(Client)对文件的访问操作,以及记录命名空间内的改动或命名空间本身属性的改动等信息。DataNode是数据存储节点
,负责自身所在物理节点上的存储管理。另外,早期HDFS版本中只有一个NameNode节点,所以存在单点问题,如果NameNode节点突然宕机,那么HDFS就会瘫痪,数据可能丢失,解决此问题的方法是启动一个SecondaryNameNode 或者再配置一个NameNode节点,通过热备份的方式来替换宕掉的NameNode节点。 客户端访问操作数据,是通过向NameNode发起请求并获取文件数据所在DataNode节点的地址信息的。对数据流的读/写操作在 DataNode 节点完成,NameNode 节点不会参与文件数据流的读写,而是由DataNode节点负责完成。
HDFS的核心组件包括
NameNode
、DataNode
和SecondaryNameNode
。NameNode 负责维护文件系统树,它不存储真实数据,而是存储元数据
,NameNode 保存在内存中
。DataNode在磁盘上保存数据的基本单位是数据块(Block),默认大小为128MB。DataNode负责处理文件系统客户端的读写请求。在NameNode的统一调度下进行数据块的创建、删除和复制。
集群中单一NameNode的结构大大简化了系统的架构。NameNode是所有HDFS元数据的仲裁者和管理者,这样,用户数据永远不会流过NameNode。对于文件操作,NameNode负责文件元数据的操作,DataNode负责处理文件内容的读写请求,数据流不经过NameNode,客户端只会询问NameNode将要访问的文件数据跟哪个DataNode有联系。文件数据块副本存放在哪些DataNode上由NameNode来控制
,根据全局情况做出数据块副本放置决定。读取文件时, NameNode尽量让用户先读取距离其最近的副本
,降低网络带宽的消耗并减少读取时间。 NameNode负责管理数据块的副本,它按照一定周期,接受来自每个DataNode的心跳信号和块状态报告。通过心跳信号判断DataNode节点工作是否正常
,而块状态报告包含了某DataNode节点上存储的所有数据块的列表信息。Namenode负责存储元数据信息,中的数据在hadoop/data/dfs/name
文件夹下,里面有fsimage和edits
文件。fsimage对元数据定期进行镜像操作
,形成镜像文件。edits存放一定时间内用户对HDFS进行的操作
。checkpoint是检查点,随着对HDFS的不断操作,edits文件内容会越来越多,当达到某一阈值时(一般该阈值默认大小为64MB或者时间间隔为3600s)就会触发检查点(checkpoint)
,此时SecondaryNameNode就开始工作了。namesecondary目录下的edits和fsimage文件就是检查点被触发之后检查任务产生的结果。检查点被触发之后,由SecondaryNameNode主要作用是辅助NameNode完成后续的任务,主要用于同步元数据信息,辅助NameNode对fsimage和edits进行合并,即冷备份
。若没有这个周期性的复制过程,重启耗费时间时间长,无法保证HDFS系统的完整性
- 首先SecondaryNameNode 会把edits和fsimage从NameNode节点复制到自己的服务器所在的内存中,合并生成一个名为fsimage.ckpt的新镜像文件。SecondaryNameNode再将fsimage.ckpt文件复制到NameNode上,之后删除NameNode上原有的fsimage文件,并将fsimage.ckpt文件重命名为fsimage。当SecondayNameNode将edits和fsimage复制之后,NameNode会立刻生成一个新的edits.new文件,用于记录新来的元数据。合并完成之后,原有的edits文件才会被删除,并将edits.new文件重命名为edits,开启下一轮流程。综上所述,NameNode在内存中保存着整个文件系统的命名空间和文件数据块映射(Blockmap)的映像。这个关键的元数据结构设计得很紧凑,因而一个有4GB内存的NameNode足够支撑大量的文件和目录。当NameNode启动时,它从硬盘中读取editlog和fsimage,将所有editlog中的事务作用在内存中的fsimage上,并将这个新版本的fsimage从内存中保存到本地磁盘上,然后删除旧的editlog,因为这个旧的editlog的事务已经作用在fsimage上了。这个过程称为一个检查点。
HDFS为了数据的安全性和完整性,通常为每个数据块保存3份副本。在HDFS运行过程中,这些副本可能因为各种原因而损坏了,此时,损坏的副本就无法对外提供正常的读服务了。那么,
HDFS如何处理损坏的数据块呢?HDFS
保存数据的时候,会将一个文件数据切分成多个数据块,将每个数据块复制出多个副本,每一个副本数据块都会生成一个校验码,用来检测或校验数据传输或者保存后所产生的错误。当客户端从DataNode上读取数据块的时候,会再次计算校验和(CheckSum),如果计算后的校验和与该数据块在创建时生成的校验码的校验和不一样,则说明该数据块已经损坏。此时,客户端就不会继续读取该数据块了,而是向NameNode申请读取该数据块的其他副本。同时,客户端会把已经损坏的数据块的信息汇报给NameNode,NameNode
会立刻标记该数据块状态为已损坏。然后,NameNode通过心跳机制给某个 DataNode
节点发起复制数据块的命令,得到命令的DataNode从该数据块的正常副本中再复制一份副本,NameNode将复制出来的该数据块副本分配到某个合适的
DataNode 节点上,从而保证集群中文件数据的各个数据块的副本始终是3个。这就是数据块损坏时的处理过程。另外,DataNode还有一个自检功能,就是在数据块创建3周后,自动触发校验和运算,以保证集群中数据块的安全。
HA 机制出现的作用主要是为了:
1.解决单点故障;
2.提升集群容量和集群性能。
HDFS 的高可用性(HA, High Availability)是为了解决集群不可用的问题引入的,集群不可用主要是宕机、 NameNode 软硬件升级等导致的。
HA 机制通过提供选择运行在同一集群中的一个热备用的“主/备”两个冗余 NameNode ,使得在机器宕机或维护的过程中可以快速转移到另一个 NameNode。
典型的 HA 集群会配置两个独立机器为 NameNode ,分别为主 NameNode 和副本 NameNode 。正常情况下,主NameNode 为 alive 状态而副本 NameNode 为休眠状态
,活动 NameNode负责处理集群中所有的客户端操作,待机时仅仅作为一个 slave ,保持足够的状态,如果有必要会提供一个快速的故障转移。关于保持同步。为了保持备用节点与活动节点状态的同步,两个节点同时访问一个共享存储设备(例如从 NAS、NFS 挂载)到一个目录。
为了防止单点失效(Single PointFailure),在 NameNode 只有命名空间的情况下。其最主要的原因是对 HDFS 系统的文件隔离,Federation 可以解决大部分单 NameNode HDFS 的问题。
总之,HDFS Federation就是使得HDFS支持多个命名空间,并且允许在HDFS中同时存在多个NameNode。
HDFS Federation使用多个独立的 NameNode/NameSpace 使得 HDFS 的命名服务能水平扩展,HDFS Federation中的 NameNode 之间为独立且不需要相互协调
,Federation中的NameNode提供了名字空间和块管理功能。Federation中的DataNode被所有的NameNode用作公共存储块的地方。每个DataNode 都会向所在集群中所有的NameNode注册,并且周期性发送心跳和块信息报告,同时处理来自NameNode的指令。HDFS只有一个名字空间NameSpace时,它使用全部的块,而 Federation HDFS中有多个独立的NameSpace ,并且每个名字空间使用一个块池Block Pool
(注:就是属于单个名字空间的一组 Block ),每个DataNode 为所有的块池存储块,DataNode是个物理概念,而块池是另一个重新将块划分的逻辑概念。HDFS 中只有一组块。而Federation HDFS中有多组独立的块,块池就是属于同一个名字空间的一组块
。HDFS 由一个NameNode 和一组 DataNode 组成,而 Federation HDFS 由多个 NameNode 和一组 DataNode 组成,每个 DataNode 会为多个块池存储块。同一个 DataNode 中可以存着属于多个块池的多个块。
块池允许一个名字空间在不通知其他名字空间的情况下为一个新的 Block 创建 Block ID ,同时一个 NameNode 失效不会影响其下的 DataNode 为其他的 NameNode 服务。 在 HDFS 中,所有的更新、回滚都是以 NameNode 和 Block Pool 为单元发生的,即同 HDFS Federation 中不同的 NameNode/Block Pool 之间没有什么关系
。 在 DataNode 中,对应于每个 NameNode 都有一个相应的线程。每个 DataNode 会去每个 NameNode 注册,并周期性地给所有的 NameNode 发送心跳和使用报告,DataNode 还会给 NameNode 发送其所在的块池报告 block report,由于有多个 NameNode 同时存在,因此任何一个 NameNode 都可以随时动态加入、删除和更新。
Federation 中存在多个命名空间,如何划分和管理这些命名空间非常关键。
在 Federation中采用“文件名hash”的方法,因为该方法的 locality 非常差。例如,查看某个目 录下面的文件,如果采用文件名hash的方法存放文件,则这些文件可能被放到不同 NameSpace 中,HDFS 需要访问所NameSpace,代价过大。为了方便管理多个命名空间, HDFS Federation 采用了经典的 Client Side Mount Table。
如图 4-8所示,下面四个深色三角形代表一个独立的命名空间,上方浅色的三角形代表从客户角度去访问的子命名空间。各个深色的命名空间 Mount 到浅色的表中,客户可以访 问不同的挂载点来访问不同的命名空间,这就如同在Linux 系统中访问不同挂载点一样 这就是 HDFS Federation 中命名空间管理的基本原理:将各个名空间挂载到全局mount-table 中,就可以做将数据到全局共享;同样的命名空间挂载到个人的 mount-table 中,这就成为应用程序可见的命名空间视图
。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。