-
配置场景 当Yarn本地目录和DataNode目录配置在同一个磁盘时,具有较大容量的磁盘可以运行更多的任务,因此将有更多的中间数据存储在Yarn本地目录。 目前DataNode支持通过配置“dfs.datanode.du.reserved”来配置预留磁盘空间大小(默认值为“0”)。配置较小的数值不能满足更大的磁盘要求,但对于更小的磁盘配置更大的数值将浪费大量的空间。 为了避免这种情况,
MRS 支持配置预留磁盘空间占总磁盘空间大小的百分比,可以基于总的磁盘空间来预留磁盘百分比。
-
操作场景 如果多个Hadoop集群由于NameNode超负荷运行并失去响应而发生故障,这种阻塞现象是由于Hadoop的初始设计造成的。在Hadoop中,NameNode作为单独的机器,在其namespace内协调HDFS的各种操作,这些操作包括获取数据块位置、列出目录及创建文件。NameNode接受HDFS的操作,将其视作RPC调用并置入FIFO调用队列,供读取线程处理。虽然FIFO在先到先服务的情况下足够公平,但如果用户执行的I/O操作较多,相比I/O操作较少的用户,将获得更多的服务。在这种情况下,FIFO有失公平并且会导致延迟增加。 图1 基于FIFO调用队列的NameNode请求处理 如果将FIFO队列替换为一种被称作FairCallQueue的新型队列,这种情况就能够得到改善。按照这种方法,FAIR队列会根据调用者的调用规模将传入的RPC调用分配至多个队列中。调度模块会跟踪最新的调用,并为调用量较小的用户分配更高的优先级。 图2 基于FAIRCallQueue的NameNode请求处理
-
配置场景 当Yarn本地目录和DataNode目录配置在同一个磁盘时,具有较大容量的磁盘可以运行更多的任务,因此将有更多的中间数据存储在Yarn本地目录。 目前DataNode支持通过配置“dfs.datanode.du.reserved”来配置预留磁盘空间大小(默认值为“0”)。配置较小的数值不能满足更大的磁盘要求,但对于更小的磁盘配置更大的数值将浪费大量的空间。 为了避免这种情况,MRS支持配置预留磁盘空间占总磁盘空间大小的百分比,可以基于总的磁盘空间来预留磁盘百分比。
-
回答 当用户在distcp命令中使用webhdfs://时,会发生上述异常,是由于集群所使用的HTTP策略为HTTPS,即配置在“hdfs-site.xml”(文件路径为“客户端安装目录/HDFS/hadoop/etc/hadoop”)的“dfs.http.policy”值为“HTTPS_ONLY”。所以要避免出现此异常,应使用swebhdfs://替代webhdfs://。 例如: ./hadoop distcpswebhdfs://IP:PORT/testfile hdfs://IP:PORT/testfile1
-
HDFS文件系统目录简介 HDFS是Hadoop的分布式文件系统(Hadoop Distributed File System),实现大规模数据可靠的分布式读写。HDFS针对的使用场景是数据读写具有“一次写,多次读”的特征,而数据“写”操作是顺序写,也就是在文件创建时的写入或者在现有文件之后的添加操作。HDFS保证一个文件在一个时刻只被一个调用者执行写操作,而可以被多个调用者执行读操作。 HDFS文件系统中目录结构如下表所示。 表1 HDFS文件系统目录结构(适用于MRS 3.x之前版本) 路径 类型 简略功能 是否可以删除 删除的后果 /tmp/spark/sparkhive-scratch 固定目录 存放Spark JD
BCS erver中metastore session临时文件 否 任务运行失败 /tmp/sparkhive-scratch 固定目录 存放Spark cli方式运行metastore session临时文件 否 任务运行失败 /tmp/carbon/ 固定目录 数据导入过程中,如果存在异常CarbonData数据,则将异常数据放在此目录下 是 错误数据丢失 /tmp/Loader-${作业名}_${MR作业id} 临时目录 存放Loader Hbase bulkload作业的region信息,作业完成后自动删除 否 Loader Hbase Bulkload作业失败 /tmp/logs 固定目录 MR任务日志在HDFS上的聚合路径 是 MR任务日志丢失 /tmp/archived 固定目录 MR任务日志在HDFS上的归档路径 是 MR任务日志丢失 /tmp/hadoop-yarn/staging 固定目录 保存AM运行作业运行日志、作业概要信息和作业配置属性 否 任务运行异常 /tmp/hadoop-yarn/staging/history/done_intermediate 固定目录 所有任务运行完成后,临时存放/tmp/hadoop-yarn/staging目录下文件 否 MR任务日志丢失 /tmp/hadoop-yarn/staging/history/done 固定目录 周期性扫描线程定期将done_intermediate的日志文件转移到done目录 否 MR任务日志丢失 /tmp/mr-history 固定目录 存储预加载历史记录文件的路径 否 MR历史任务日志数据丢失 /tmp/hive 固定目录 存放Hive的临时文件 否 导致Hive任务失败 /tmp/hive-scratch 固定目录 Hive运行时生成的临时数据,如会话信息等 否 当前执行的任务会失败 /user/{user}/.sparkStaging 固定目录 存储SparkJDB
CS erver应用临时文件 否 executor启动失败 /user/spark/jars 固定目录 存放Spark executor运行依赖包 否 executor启动失败 /user/loader 固定目录 存放loader的作业脏数据以及HBase作业数据的临时存储目录 否 HBase作业失败或者脏数据丢失 /user/loader/etl_dirty_data_dir /user/loader/etl_hbase_putlist_tmp /user/loader/etl_hbase_tmp /user/mapred 固定目录 存放Hadoop相关的文件 否 导致Yarn启动失败 /user/hive 固定目录 Hive相关数据存储的默认路径,包含依赖的spark lib包和用户默认表数据存储位置等 否 用户数据丢失 /user/omm-bulkload 临时目录 HBase批量导入工具临时目录 否 HBase批量导入任务失败 /user/hbase 临时目录 HBase批量导入工具临时目录 否 HBase批量导入任务失败 /sparkJobHistory 固定目录 Spark eventlog数据存储目录 否 HistoryServer服务不可用,任务运行失败 /flume 固定目录 Flume采集到HDFS文件系统中的数据存储目录 否 Flume工作异常 /mr-history/tmp 固定目录 MapReduce作业产生的日志存放位置 是 日志信息丢失 /mr-history/done 固定目录 MR JobHistory Server管理的日志的存放位置 是 日志信息丢失 /tenant 添加租户时创建 配置租户在HDFS中的存储目录,系统默认将自动在“/tenant”目录中以租户名称创建文件夹。例如租户“ta1”,默认HDFS存储目录为“tenant/ta1”。第一次创建租户时,系统自动在HDFS根目录创建“/tenant”目录。支持自定义存储路径。 否 租户不可用 /apps{1~5}/ 固定目录 WebHCat使用到Hive的包的路径 否 执行WebHCat任务会失败 /hbase 固定目录 HBase数据存储目录 否 HBase用户数据丢失 /hbaseFileStream 固定目录 HFS文件存储目录 否 HFS文件丢失,且无法恢复 /ats/active 固定目录 HDFS路径,用于存储活动的应用程序的timeline数据 否 删除后会导致tez任务运行失败 /ats/done 固定目录 HDFS路径,用于存储完成的应用程序的timeline数据 否 删除后会自动创建 /flink 固定目录 存放checkpoint任务数据 否 删除会导致运行任务失败 表2 HDFS文件系统目录结构(适用于MRS 3.x及之后版本) 路径 类型 简略功能 是否可以删除 删除的后果 /tmp/spark2x/sparkhive-scratch 固定目录 存放Spark2x JDBCServer中metastore session临时文件 否 任务运行失败 /tmp/sparkhive-scratch 固定目录 存放Spark2x cli方式运行metastore session临时文件 否 任务运行失败 /tmp/logs/ 固定目录 存放container日志文件 是 container日志不可查看 /tmp/carbon/ 固定目录 数据导入过程中,如果存在异常CarbonData数据,则将异常数据放在此目录下 是 错误数据丢失 /tmp/Loader-${作业名}_${MR作业id} 临时目录 存放Loader Hbase bulkload作业的region信息,作业完成后自动删除 否 Loader Hbase Bulkload作业失败 /tmp/hadoop-omm/yarn/system/rmstore 固定目录 ResourceManager运行状态信息 是 ResourceManager重启后状态信息丢失 /tmp/archived 固定目录 MR任务日志在HDFS上的归档路径 是 MR任务日志丢失 /tmp/hadoop-yarn/staging 固定目录 保存AM运行作业运行日志、作业概要信息和作业配置属性 否 任务运行异常 /tmp/hadoop-yarn/staging/history/done_intermediate 固定目录 所有任务运行完成后,临时存放/tmp/hadoop-yarn/staging目录下文件 否 MR任务日志丢失 /tmp/hadoop-yarn/staging/history/done 固定目录 周期性扫描线程定期将done_intermediate的日志文件转移到done目录 否 MR任务日志丢失 /tmp/mr-history 固定目录 存储预加载历史记录文件的路径 否 MR历史任务日志数据丢失 /tmp/hive-scratch 固定目录 Hive运行时生成的临时数据,如会话信息等 否 当前执行的任务会失败 /user/{user}/.sparkStaging 固定目录 存储SparkJDBCServer应用临时文件 否 executor启动失败 /user/spark2x/jars 固定目录 存放Spark2x executor运行依赖包 否 executor启动失败 /user/loader 固定目录 存放loader的作业脏数据以及HBase作业数据的临时存储目录 否 HBase作业失败或者脏数据丢失 /user/loader/etl_dirty_data_dir /user/loader/etl_hbase_putlist_tmp /user/loader/etl_hbase_tmp /user/oozie 固定目录 存放oozie运行时需要的依赖库,需用户手动上传 否 oozie调度失败 /user/mapred/hadoop-mapreduce-3.1.1.tar.gz 固定文件 MR分布式缓存功能使用的各jar包 否 MR分布式缓存功能无法使用 /user/hive 固定目录 Hive相关数据存储的默认路径,包含依赖的spark lib包和用户默认表数据存储位置等 否 用户数据丢失 /user/omm-bulkload 临时目录 HBase批量导入工具临时目录 否 HBase批量导入任务失败 /user/hbase 临时目录 HBase批量导入工具临时目录 否 HBase批量导入任务失败 /spark2xJobHistory2x 固定目录 Spark2x eventlog数据存储目录 否 HistoryServer服务不可用,任务运行失败 /flume 固定目录 Flume采集到HDFS文件系统中的数据存储目录 否 Flume工作异常 /mr-history/tmp 固定目录 MapReduce作业产生的日志存放位置 是 日志信息丢失 /mr-history/done 固定目录 MR JobHistory Server管理的日志的存放位置 是 日志信息丢失 /tenant 添加租户时创建 配置租户在HDFS中的存储目录,系统默认将自动在“/tenant”目录中以租户名称创建文件夹。例如租户“ta1”,默认HDFS存储目录为“tenant/ta1”。第一次创建租户时,系统自动在HDFS根目录创建“/tenant”目录。支持自定义存储路径。 否 租户不可用 /apps{1~5}/ 固定目录 WebHCat使用到Hive的包的路径 否 执行WebHCat任务会失败 /hbase 固定目录 HBase数据存储目录 否 HBase用户数据丢失 /hbaseFileStream 固定目录 HFS文件存储目录 否 HFS文件丢失,且无法恢复 父主题: 使用HDFS
-
日志级别 HDFS中提供了如表2所示的日志级别,日志级别优先级从高到低分别是FATAL、ERROR、WARN、INFO、DEBUG,程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。 表2 日志级别 级别 描述 FATAL FATAL表示系统运行的致命错误信息。 ERROR ERROR表示系统运行的错误信息。 WARN WARN表示当前事件处理存在异常信息。 INFO INFO表示系统及各事件正常运行状态信息。 DEBUG DEBUG表示系统及系统调试信息。 如果您需要修改日志级别,请执行如下操作: 请参考修改集群服务配置参数,进入HDFS的“全部配置”页面。 左边菜单栏中选择所需修改的角色所对应的日志菜单。 选择所需修改的日志级别。 保存配置,在弹出窗口中单击“确定”使配置生效。 配置完成后立即生效,不需要重启服务。
-
Client HDFS Client主要包括五种方式:JAVA API、C API、Shell、HTTP REST API、WEB UI。 Java API 提供HDFS文件系统的应用接口,本开发指南主要介绍如何使用Java API HDFS文件系统的应用开发。 C API 提供HDFS文件系统的应用接口,使用C语言开发的用户可参考C接口的描述进行应用开发。 Shell 提供shell命令完成HDFS文件系统的基本操作。 HTTP REST API 提供除Shell、Java API和C API以外的其他接口,可通过此接口监控HDFS状态等信息。 WEB UI 提供Web可视化组件管理界面。
-
回答 当用户在distcp命令中使用webhdfs://时,会发生上述异常,是由于集群所使用的HTTP策略为HTTPS,即配置在“hdfs-site.xml”(文件路径为“客户端安装目录/HDFS/hadoop/etc/hadoop”)的“dfs.http.policy”值为“HTTPS_ONLY”。所以要避免出现此异常,应使用swebhdfs://替代webhdfs://。 例如: ./hadoop distcpswebhdfs://IP:PORT/testfile hdfs://IP:PORT/testfile1
-
块副本位置选择说明 NodeLabel支持对各个副本的摆放采用不同的策略,如表达式“label-1,label-2,label-3”,表示3个副本分别放到含有label-1、label-2、label-3的DataNode中,不同的副本策略用逗号分隔。 如果label-1,希望放2个副本,可以这样设置表达式:“label-1[replica=2],label-2,label-3”。这种情况下,如果默认副本数是3,则会选择2个带有label-1和一个label-2的节点;如果默认副本数是4,会选择2个带有label-1、一个label-2以及一个label-3的节点。可以注意到,副本数是从左到右依次满足各个副本策略的,但也有副本数超过表达式表述的情况,当默认副本数为5时,多出来的一个副本会放到最后一个节点中,也就是label-3的节点里。 当启用ACLs功能并且用户无权访问表达式中使用的标签时,将不会为副本选择属于该标签的DataNode。
-
多余块副本删除选择说明 如果块副本数超过参数“dfs.replication”值(即用户指定的文件副本数,可以参考修改集群服务配置参数进入HDFS服务全部配置页面,搜索对应参数查看),HDFS会删除多余块副本来保证集群资源利用率。 删除规则如下: 优先删除不满足任何表达式的副本。 示例:文件默认副本数为3 /test标签表达式为“LA[replica=1],LB[replica=1],LC[replica=1]”; /test文件副本分布的四个节点(D1~D4)以及对应标签(LA~LD): D1:LA
D2:LB
D3:LC
D4:LD 则选择删除D4节点上的副本块。 如果所有副本都满足表达式,删除多于表达式指定的数量的副本。 示例:文件默认副本数为3 /test标签表达式为“LA[replica=1],LB[replica=1],LC[replica=1]”; /test文件副本分布的四个节点以及对应标签: D1:LA
D2:LA
D3:LB
D4:LC 则选择删除D1或者D2上的副本块。 如果文件所有者或文件所有者的组不能访问某个标签,则优先删除映射到该标签的DataNode中的副本。
-
基于标签的数据块摆放策略样例 例如某MRS集群有六个DataNode:dn-1,dn-2,dn-3,dn-4,dn-5以及dn-6,对应的IP为10.1.120.[1-6]。有六个目录需要配置标签表达式,Block默认备份数为3。 下面给出3种DataNode标签信息在“host2labels”文件中的表示方式,其作用是一样的。 主机名正则表达式 /dn-[1456]/ = label-1,label-2
/dn-[26]/ = label-1,label-3
/dn-[3456]/ = label-1,label-4
/dn-5/ = label-5 IP地址范围表示方式 10.1.120.[1-6] = label-1
10.1.120.1 = label-2
10.1.120.2 = label-3
10.1.120.[3-6] = label-4
10.1.120.[4-6] = label-2
10.1.120.5 = label-5
10.1.120.6 = label-3 普通的主机名表达式 /dn-1/ = label-1, label-2
/dn-2/ = label-1, label-3
/dn-3/ = label-1, label-4
/dn-4/ = label-1, label-2, label-4
/dn-5/ = label-1, label-2, label-4, label-5
/dn-6/ = label-1, label-2, label-3, label-4 目录的标签表达式设置结果如下: /dir1 = label-1
/dir2 = label-1 && label-3
/dir3 = label-2 || label-4[replica=2]
/dir4 = (label-2 || label-3) && label-4
/dir5 = !label-1
/sdir2.txt = label-1 && label-3[replica=3,fallback=NONE]
/dir6 = label-4[replica=2],label-2 标签表达式设置方式请参考通过命令行配置。 文件的数据块存放结果如下: “/dir1”目录下文件的数据块可存放在dn-1,dn-2,dn-3,dn-4,dn-5和dn-6六个节点中的任意一个。 “/dir2”目录下文件的数据块可存放在dn-2和dn-6节点上。Block默认备份数为3,表达式只匹配了两个DataNode节点,第三个副本会在集群上剩余的节点中选择一个DataNode节点存放。 “/dir3”目录下文件的数据块可存放在dn-1,dn-3,dn-4,dn-5和dn-6中的任意三个节点上。 “/dir4”目录下文件的数据块可存放在dn-4,dn-5和dn-6。 “/dir5”目录下文件的数据块没有匹配到任何一个DataNode,会从整个集群中任意选择三个节点存放(和默认选块策略行为一致)。 “/sdir2.txt”文件的数据块,两个副本存放在dn-2和dn-6节点上,虽然还缺失一个备份节点,但由于使用了fallback=NONE参数,所以只存放两个备份。 “/dir6”目录下文件的数据块在具备label-4的节点中选择2个节点(dn-3 -- dn-6),然后在label-2中选择一个节点,如果用户指定“/dir6”下文件副本数大于3,则多出来的副本均在label-2。
-
操作场景 用户需要通过数据特征灵活配置HDFS文件数据块的存储节点。通过设置HDFS目录/文件对应一个标签表达式,同时设置每个DataNode对应一个或多个标签,从而给文件的数据块存储指定了特定范围的DataNode。 当使用基于标签的数据块摆放策略,为指定的文件选择DataNode节点进行存放时,会根据文件的标签表达式选择出DataNode节点范围,然后在这些DataNode节点范围内,选择出合适的存放节点。 场景1 DataNodes分区场景。 场景说明: 用户需要让不同的应用数据运行在不同的节点,分开管理,就可以通过标签表达式,来实现不同业务的分离,指定业务存放到对应的节点上。 通过配置NodeLabel特性使得: /HBase下的数据存储在DN1、DN2、DN3、DN4节点上。 /Spark下的数据存储在DN5、DN6、DN7、DN8节点上。 图1 DataNode分区场景 通过hdfs nodelabel -setLabelExpression -expression 'LabelA[fallback=NONE]' -path /Hbase命令,给Hbase目录设置表达式。从图1中可知,“/Hbase”文件的数据块副本会被放置在有LabelA标签的节点上,即DN1、DN2、DN3、DN4。 同理,通过hdfs nodelabel -setLabelExpression -expression 'LabelB[fallback=NONE]' -path /Spark命令,给Spark目录设置表达式。在“/Spark”目录下文件对应的数据块副本只能放置到LabelB标签上的节点,如DN5、DN6、DN7、DN8。 设置数据节点的标签参考DataNode节点标签配置。 如果同一个集群上存在多个机架,每个标签下可以有多个机架的DataNodes,以确保数据块摆放的可靠性。 场景2 多机架下指定副本位置场景 场景说明: 在异构集群中,需要分配一些特定的具有高可靠性的节点用以存放重要的商业数据,可以通过标签表达式指定副本位置,指定文件数据块的其中一个副本存放到高可靠性的节点上。 “/data”目录下的数据块,默认三副本情况下,其中至少有一个副本会被存放到RACK1或RACK2机架的节点上(RACK1和RACK2机架的节点为高可靠性节点),另外两个副本会被分别存放到RACK3和RACK4机架的节点上。 图2 场景样例 通过hdfs nodelabel -setLabelExpression -expression 'LabelA||LabelB[fallback=NONE],LabelC,LabelD' -path /data命令给“/data”目录设置表达式。 当向“/data”目录下写数据时,至少有一个数据块副本存放在LabelA或者LabelB标签的节点中,剩余的两个数据块副本会被存放在有LabelC和LabelD标签的节点上。
-
操作场景 如果多个Hadoop集群由于NameNode超负荷运行并失去响应而发生故障,这种阻塞现象是由于Hadoop的初始设计造成的。在Hadoop中,NameNode作为单独的机器,在其namespace内协调HDFS的各种操作,这些操作包括获取数据块位置、列出目录及创建文件。NameNode接受HDFS的操作,将其视作RPC调用并置入FIFO调用队列,供读取线程处理。虽然FIFO在先到先服务的情况下足够公平,但如果用户执行的I/O操作较多,相比I/O操作较少的用户,将获得更多的服务。在这种情况下,FIFO有失公平并且会导致延迟增加。 图1 基于FIFO调用队列的NameNode请求处理 如果将FIFO队列替换为一种被称作FairCallQueue的新型队列,这种情况就能够得到改善。按照这种方法,FAIR队列会根据调用者的调用规模将传入的RPC调用分配至多个队列中。调度模块会跟踪最新的调用,并为调用量较小的用户分配更高的优先级。 图2 基于FAIRCallQueue的NameNode请求处理
-
日志级别 HDFS中提供了如表2所示的日志级别,日志级别优先级从高到低分别是FATAL、ERROR、WARN、INFO、DEBUG,程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。 表2 日志级别 级别 描述 FATAL FATAL表示系统运行的致命错误信息。 ERROR ERROR表示系统运行的错误信息。 WARN WARN表示当前事件处理存在异常信息。 INFO INFO表示系统及各事件正常运行状态信息。 DEBUG DEBUG表示系统及系统调试信息。 如果您需要修改日志级别,请执行如下操作: 请参考修改集群服务配置参数,进入HDFS的“全部配置”页面。 左边菜单栏中选择所需修改的角色所对应的日志菜单。 选择所需修改的日志级别。 保存配置,在弹出窗口中单击“确定”使配置生效。 配置完成后立即生效,不需要重启服务。
-
基于标签的数据块摆放策略样例 例如某MRS集群有六个DataNode:dn-1,dn-2,dn-3,dn-4,dn-5以及dn-6,对应的IP为10.1.120.[1-6]。有六个目录需要配置标签表达式,Block默认备份数为3。 下面给出3种DataNode标签信息在“host2labels”文件中的表示方式,其作用是一样的。 主机名正则表达式 /dn-[1456]/ = label-1,label-2
/dn-[26]/ = label-1,label-3
/dn-[3456]/ = label-1,label-4
/dn-5/ = label-5 IP地址范围表示方式 10.1.120.[1-6] = label-1
10.1.120.1 = label-2
10.1.120.2 = label-3
10.1.120.[3-6] = label-4
10.1.120.[4-6] = label-2
10.1.120.5 = label-5
10.1.120.6 = label-3 普通的主机名表达式 /dn-1/ = label-1, label-2
/dn-2/ = label-1, label-3
/dn-3/ = label-1, label-4
/dn-4/ = label-1, label-2, label-4
/dn-5/ = label-1, label-2, label-4, label-5
/dn-6/ = label-1, label-2, label-3, label-4 目录的标签表达式设置结果如下: /dir1 = label-1
/dir2 = label-1 && label-3
/dir3 = label-2 || label-4[replica=2]
/dir4 = (label-2 || label-3) && label-4
/dir5 = !label-1
/sdir2.txt = label-1 && label-3[replica=3,fallback=NONE]
/dir6 = label-4[replica=2],label-2 标签表达式设置方式请参考hdfs nodelabel -setLabelExpression命令。 文件的数据块存放结果如下: “/dir1”目录下文件的数据块可存放在dn-1,dn-2,dn-3,dn-4,dn-5和dn-6六个节点中的任意一个。 “/dir2”目录下文件的数据块可存放在dn-2和dn-6节点上。Block默认备份数为3,表达式只匹配了两个DataNode节点,第三个副本会在集群上剩余的节点中选择一个DataNode节点存放。 “/dir3”目录下文件的数据块可存放在dn-1,dn-3,dn-4,dn-5和dn-6中的任意三个节点上。 “/dir4”目录下文件的数据块可存放在dn-4,dn-5和dn-6。 “/dir5”目录下文件的数据块没有匹配到任何一个DataNode,会从整个集群中任意选择三个节点存放(和默认选块策略行为一致)。 “/sdir2.txt”文件的数据块,两个副本存放在dn-2和dn-6节点上,虽然还缺失一个备份节点,但由于使用了fallback=NONE参数,所以只存放两个备份。 “/dir6”目录下文件的数据块在具备label-4的节点中选择2个节点(dn-3 -- dn-6),然后在label-2中选择一个节点,如果用户指定“/dir6”下文件副本数大于3,则多出来的副本均在label-2。