翻译: https://www.cloudera.com/documentation/enterprise/latest/topics/cdh_ig_hdfs_cluster_deploy.html#topic_11_2
版本: 5.14.2
重要:
有关为NameNode配置高可用性(HA)的说明,请参阅HDFS高可用性。有关使用HDFS访问控制列表(ACL)的说明,请参阅HDFS扩展ACL。
按照以下步骤在群集上部署HDFS。对所有群集执行此操作,无论您是部署MRv1还是YARN:
重要:
- 在不使用Cloudera Manager的系统上遵循这些命令行指示信息。
- 此信息特别适用于CDH 5.14.X。有关其他版本的信息,请参阅Cloudera文档。
继续阅读:
- 复制Hadoop配置和设置选项
- 定制配置文件
- 配置本地存储目录
- 配置DataNode以允许本地存储目录失败
- 格式化NameNode
- 配置远程NameNode存储目录
- 配置Secondary NameNode
- 启用垃圾箱
- 为DataNodes配置存储平衡
- 启用WebHDFS
- 配置LZO
- 启动HDFS
- 部署YARN或MRv1
注意: 运行服务
使用service命令来启动,停止和重新启动CDH组件,而不是直接在/etc/init.d中运行脚本。
复制Hadoop配置和设置选项
要自定义Hadoop配置:
- 将默认配置复制到您的自定义目录中:
$ sudo cp -r /etc/hadoop/conf.empty /etc/hadoop/conf.my_cluster
你可以任意调用这个配置; 在这个例子中,它被称为my_cluster。
重要:
在执行本节中的配置任务时,以及在继续部署MRv1或YARN时,编辑此自定义目录中的配置文件。不要在默认目录/etc/hadoop/conf.empty中创建自定义配置。
CDH使用 alternatives 设置以确定要使用哪个Hadoop配置。使用alternatives 指向您的自定义目录,如下所示。
在RHEL兼容系统上手动设置配置:
$ sudo alternatives --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.my_cluster 50
$ sudo alternatives --set hadoop-conf /etc/hadoop/conf.my_cluster
要在Ubuntu和SLES系统上手动设置配置,请执行以下操作:
$ sudo update-alternatives --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.my_cluster 50
$ sudo update-alternatives --set hadoop-conf /etc/hadoop/conf.my_cluster
这告诉CDH使用/etc/hadoop/conf.my_cluster中的配置。
您可以显示当前alternatives 设置如下。
要在RHEL兼容系统上显示当前设置:
要显示Ubuntu,Debian和SLES系统上的当前设置:
您应该看到以下输出:
sudo alternatives --display hadoop-conf
sudo update-alternatives --display hadoop-conf
hadoop-conf - status is auto.
link currently points to /etc/hadoop/conf.my_cluster
/etc/hadoop/conf.my_cluster - priority 50
/etc/hadoop/conf.empty - priority 10
Current `best' version is /etc/hadoop/conf.my_cluster.
由于 /etc/hadoop/conf.my_cluster 配置的最高优先级(50),因此CDH将使用该优先级。有关替代方法的更多信息,请参阅alternatives(8)。
定制配置文件
下表显示了必须为群集配置的最重要的属性。
注意:
有关其他重要配置属性和配置文件的信息,请参阅Apache Cluster Setup页面。
属性 | 配置文件 | 描述 |
---|---|---|
fs.defaultFS | core-site.xml | 注意:fs.default.name已弃用。以hdfs://<namenode host>:<namenode port>/的形式指定NameNode和默认文件系统关系。默认值是file///。默认文件系统用于解析相对路径; 例如,如果fs.default.name or fs.defaultFS被设定为 hdfs://mynamenode/,相对URI /mydir/myfile对应 hdfs://mynamenode/mydir/myfile。注意:为了使群集正常工作,<namenode>字符串必须是主机名(例如mynamenode)或启用HA的逻辑URI,而不是IP地址。 |
dfs.permissions.superusergroup | hdfs-site.xml | 指定包含将被HDFS视为超级用户的用户的UNIX组。您可以使用’hadoop’,或根据您的网站的安全策略选择自己的组。 |
示例配置
核心-site.xml中:
<property>
<name>fs.defaultFS</name>
<value>hdfs://namenode-host.company.com:8020</value>
</property>
HDFS-site.xml中:
<property>
<name>dfs.permissions.superusergroup</name>
<value>hadoop</value>
</property>
配置本地存储目录
您需要指定,创建正确的权限并将其分配给希望HDFS守护程序存储数据的本地目录。您可以通过配置以下两个属性来指定目录, 在hdfs-site.xml 文件。
属性 | 配置文件位置 | 描述 |
---|---|---|
dfs.name.dir or dfs.namenode.name.dir | NameNode上 hdfs-site.xml | 此属性指定NameNode存储其元数据和编辑日志的目录的URI。Cloudera建议您至少指定两个目录。其中一个应位于NFS安装点上,除非您将使用HDFS HA配置。 |
dfs.data.dir or dfs.datanode.data.dir | 每个datanode上的hdfs-site.xml | 此属性指定DataNode存储块所在目录的URI。Cloudera建议您在JBOD配置中的DataNode上配置磁盘,挂载在 /data/1/ 到 /data/N, 并配置dfs.data.dir 或 dif.datanode.data.dir 的值从 file:///data/1/dfs/dn 到 file:///data/N/dfs/dn/ 。 |
注意:
dfs.data.dir and dfs.name.dir 已弃用; 你应该使用 dfs.datanode.data.dir and dfs.namenode.name.dirauto ,但他们仍其作用 。
示例配置:
NameNode上的hdfs-site.xml:
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///data/1/dfs/nn,file:///nfsmount/dfs/nn</value>
</property>
每个DataNode上的hdfs-site.xml:
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///data/1/dfs/dn,file:///data/2/dfs/dn,file:///data/3/dfs/dn,file:///data/4/dfs/dn</value>
</property>
在如上所示指定这些目录之后,您必须创建目录并为集群中每个节点上的目录分配正确的文件权限。
在以下说明中,本地路径示例用于表示Hadoop参数。更改路径示例以匹配您的配置。
本地目录:
- dfs.name.dir or dfs.namenode.name.dir参数由 /data/1/dfs/nn and /nfsmount/dfs/nn 路径示例。
- dfs.data.dir or dfs.datanode.data.dir 参数由 /data/1/dfs/dn, /data/2/dfs/dn, /data/3/dfs/dn, and /data/4/dfs/dn 例。
配置HDFS使用的本地存储目录:
- 在NameNode主机上:创建 dfs.name.dir or dfs.namenode.name.dir 本地目录:
$ sudo mkdir -p /data/1/dfs/nn /nfsmount/dfs/nn
重要:
如果您正在使用高可用性(HA),则不应将这些目录配置为NFS挂载; 在本地存储上配置它们。
- 在所有DataNode主机上:创建 dfs.data.dir or dfs.datanode.data.dir 本地目录:
$ sudo mkdir -p /data/1/dfs/dn /data/2/dfs/dn /data/3/dfs/dn /data/4/dfs/dn
- 配置目录的所有者hdfs 用户:
sudo chown -R hdfs:hdfs /data/1/dfs/nn /nfsmount/dfs/nn /data/1/dfs/dn /data/2/dfs/dn /data/3/dfs/dn /data/4/dfs/dn
注意:
有关安装CDH时创建的用户列表,请参阅Hadoop用户(用户:组)和Kerberos主体。
目录 | 所有者 | 权限(Footnote1) |
---|---|---|
dfs.name.dir or dfs.namenode.name.dir ,dfs.data.dir or dfs.datanode.data.dir | hdfs:hdfs | drwx —— |
以下是本地目录的正确所有者和权限摘要:
目录 | 所有者 | 权限(Footnote1) |
---|---|---|
dfs.name.dir or dfs.namenode.name.dir ,dfs.data.dir or dfs.datanode.data.dir | hdfs:hdfs | drwx —— |
脚注: 1 Hadoop守护进程自动为您设置正确的权限<dfs.data.dir or dfs.datanode.data.dir 。但对于 dfs.name.dir or dfs.namenode.name.dir ,权限目前被错误地设置为drwxr-xr-x(755)。使用chmod 命令来重置这些权限drwx ——(700); 例如:
$ sudo chmod 700 /data/1/dfs/nn /nfsmount/dfs/nn
or
$ sudo chmod go-rx /data/1/dfs/nn /nfsmount/dfs/nn
注意:
如果你指定了不存在的目录 dfs.data.dir or dfs.datanode.data.dir,CDH 5将关闭。(在以前的版本中,CDH默默地忽略不存在的目录。)
配置DataNode以允许本地存储目录失败
默认情况下,一个单一dfs.data.dir or dfs.datanode.data.dir 的失败会导致HDFS DataNode进程关闭,将导致NameNode为DataNode上存在的每个块调度额外的副本。这导致驻留在没有失败的磁盘上的块的不必要的复制。
为了防止这种情况发生,您可以配置DataNode来容忍失败; 使用 hdfs-site.xml配置文件中的 dfs.datanode.failed.volumes.tolerated 参数。例如,如果此参数的值为3,则DataNode只会在四个或更多数据目录失败后关闭。此值在DataNode启动时读取; 在这个例子中,只要不超过三个目录失败,DataNode就会重新启动。
注意:
这很重要, dfs.datanode.failed.volumes.tolerated不能配置为容忍太多的目录失败,因为如果DataNode的功能数据目录很少,DataNode的性能会很差。
格式化NameNode
首次启动NameNode之前,您需要格式化文件系统。
重要:
- 确保将NameNode格式化为用户hdfs 。
- 如果要重新设置NameNode的格式,请记住这会使DataNode存储位置无效,因此应在NameNode格式化后删除这些位置下的数据。
$ sudo -u hdfs hdfs namenode -format
注意:
如果启用了Kerberos,请不要使用sudo -u <user> hadoop <command> 命令; 他们会因安全错误而失败。相反,使用以下命令: $ kinit <user> (如果您使用密码)或 $ kinit -kt <keytab> <principal> (如果你使用的是keytab),然后,对于该用户执行$ <command> 。
你会得到一个确认提示; 例如:
Re-format filesystem in /data/namedir ? (Y or N)
注意:以大写字母回应 ; 如果使用小写字母,则该过程将中止。
配置远程NameNode存储目录
您应该将NameNode配置为写入多个存储目录,包括一个远程NFS挂载。要在NFS服务器不可用时避免NameNode进程挂起,请将NFS挂载配置为soft mount(以便I / O请求超时失败而不是挂起),并设置其他选项,如下所示:
tcp,soft,intr,timeo=10,retrans=10
这些选项配置TCP上的soft mount ; 交易将在1分钟间隔(timeo=10)重试十次(retrans=10),之后才被视为失败。
例:
mount -t nfs -o tcp,soft,intr,timeo=10,retrans=10, <server>:<export> <mount_point>
其中<server> 是远程主机,<export> 是导出的文件系统, <mount_point>是本地挂载点。
注意:
Cloudera建议使用类似的共享HA安装设置,如下例所示。
HA示例:
mount -t nfs -o tcp,soft,intr,timeo=50,retrans=12, <server>:<export> <mount_point>
请注意,在HA 中 timeo 应该设置为50(5秒),而不是10(1秒),并且 retrans 应该设置为12,总的超时时间为60秒。
有关更多信息,请参见手册页 mount and nfs。
配置远程目录恢复
您可以启用 dfs.namenode.name.dir.restore 选项,以便NameNode在下一个检查点恢复先前失败的数据。这对于恢复由于网络中断或间歇性NFS故障而失败的远程存储目录装载非常有用。
配置Secondary NameNode
重要:
Secondary NameNode不提供故障转移或高可用性(HA)。如果您打算为NameNode配置HA,请跳过此部分:请勿安装或配置Secondary NameNode(备用NameNode执行检查点设置)。完成HA软件配置后,请按照部署HDFS高可用性下的安装说明进行操作。
在非HA部署中,配置一个Secondary NameNode,它将定期将EditLog与FSImage合并,创建一个新的FSImage,其中包含EditLog中的更改。这减少了NameNode上EditLog所占用的磁盘空间量,并且还减少了主NameNode的重启时间。
标准Hadoop集群(不是Hadoop联盟或HA配置)只能有一个主名称节点和一个辅助名称节点。在生产系统上,Secondary NameNode应该在与主NameNode不同的机器上运行,以提高可伸缩性(因为Secondary NameNode不会与NameNode竞争内存和其他资源来创建系统快照)和持久性(因为副本元数据位于独立的机器上,如果NameNode硬件发生故障,则可用)。
在单独的机器上配置Secondary NameNode
要在NameNode的另一台机器上配置Secondary NameNode,请按以下步骤操作。
- 将运行Secondary NameNode的机器的名称添加到masters 。
- 将以下属性添加到hdfs-site.xml文件:
<property>
<name>dfs.namenode.http-address</name>
<value><namenode.host.address>:50070</value>
<description>
The address and the base port on which the dfs NameNode Web UI will listen.
</description>
</property>
注意:
- dfs.http.address 已弃用; 使用dfs.namenode.http-address.。
- 在大多数情况下,你应该设置 dfs.namenode.http-address 转换为具有端口50070的可路由IP地址。但是,在某些情况下(例如Amazon EC2),当NameNode应绑定到多个本地地址时,可能需要设置dfs.namenode.http-address 0.0.0.0:50070 仅在NameNode机器上,并将其设置为辅助NameNode计算机上的实际可路由地址。在这种情况下需要不同的地址,因为HDFS使用dfs.namenode.http地址 出于两个不同的目的:它定义了NameNode绑定的地址和Secondary NameNode连接到检查点的地址。运用 0.0.0.0 在NameNode上允许NameNode绑定到它的所有本地地址,而在Secondary NameNode上使用外部可路由地址则为Secondary NameNode提供了一个要连接的真实地址。
有关更多信息,请参阅多主机SecondaryNameNode配置。
有关Secondary NameNode的更多信息
Secondary NameNode 参数 不翻
Secondary NameNode的行为由hdfs-site.xml中的以下参数控制。
dfs.namenode.checkpoint.check.period
dfs.namenode.checkpoint.txns
dfs.namenode.checkpoint.dir
dfs.namenode.checkpoint.edits.dir
dfs.namenode.num.checkpoints.retained
有关详细信息,请参阅https://archive.cloudera.com/cdh5/cdh/5/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml。
启用垃圾箱
Hadoop垃圾功能有助于防止意外删除文件和目录。如果垃圾箱已启用,并且使用Hadoop shell 删除文件或目录,则该文件将被移至Trash 目录,而不是被删除。删除的文件最初移动到Trash的子目录 Current ,并保留其原始路径。如果垃圾检查点已启用,则Current 目录将使用时间戳定期重命名。在用户可配置的时间延迟后被永久删除。只需将垃圾箱中的文件和目录移动到垃圾箱外的某个位置即可恢复。
重要:
垃圾箱功能默认为禁用。Cloudera建议您在所有生产群集上启用它。
垃圾功能默认只适用于使用Hadoop shell 删除的文件和目录。使用其他接口(例如WebHDFS或Java API)以编程方式删除的文件或目录不会移动到垃圾箱,即使已启用垃圾箱,除非程序已实施对垃圾箱功能的调用。(例如,Hue自CDH 4.4开始实施垃圾。)
用户可以在使用shell删除文件时使用选项-skipTrash 绕过垃圾箱。当需要删除对用户配额来说太大的文件时,这会很有用。
在配置文件 core-site.xml中可配置的相关属性如下:
CDH参数 | 值 | 描述 |
---|---|---|
fs.trash.interval | minutes or 0 | 文件删除后检查点检查的时间间隔。该选项可以在服务器和客户端上配置。* 如果在服务器配置上启用垃圾箱,则将使用服务器上配置的值,并忽略客户端配置。* 如果垃圾箱在服务器配置中被禁用,则检查客户端配置。* 如果此属性的值为零(默认值),则垃圾箱功能将被禁用。 |
fs.trash.checkpoint.interval | minutes or 0 | 垃圾检查点间隔的分钟数。每次检查点在NameNode上运行时,它都会创建一个“Current”目录,并删除比fs.trash.interval 分钟大的目录。该值应该小于或等于fs.trash.interval 。该选项在服务器上配置。如果配置为零(默认值),则该值设置为fs.trash.interval的值。 |
例如,启用垃圾桶,使用Hadoop shell删除的文件在24小时内不被删除,在core-site.xml文件中设置 fs.trash.interval值为1440 。
注意:
文件保留在垃圾箱中的时间段是在文件移动到垃圾箱时开始的,而不是文件的上次修改时间。
为DataNodes配置存储平衡
您可以为HDFS配置写入平衡,以平衡DataNode磁盘卷中可用存储的方式来分配每个DataNode的写入。
默认情况下,DataNode基于round-robin方式写入block副本。您可以配置一个卷选择策略,该策略会导致DataNode在决定放置新副本的位置时考虑每个卷上有多少可用空间。
你可以配置
- DataNode的各卷的可用磁盘空间差别多大时认为是不平衡的,
- 为某个卷分配新block会比分配给其他卷带来更高的可用磁盘空间。
要配置存储平衡,请在hdfs-site.xml中设置以下属性。
注意:请记住,如果在启用存储平衡时,如果给定DataNode的存储卷之间的使用率显着不平衡,则该数据节点上的吞吐量最初将受到影响,因为写入不成比例地指向未充分利用的卷。
属性 | 值 | 描述 |
---|---|---|
dfs.datanode. fsdataset. volume.choosing. policy | org.apache.hadoop. hdfs.server.datanode. fsdataset. AvailableSpaceVolumeChoosingPolicy | 启用DataNode卷之间的存储平衡。 |
dfs.datanode. available-space- volume-choosing- policy.balanced-space-threshold | 10737418240(默认) | 磁盘空间被视为不平衡时,磁盘空间的容量相差数量。默认值为10737418240(10 GB)。如果每个卷上的可用空间都在这个范围内,则这些卷将被视为平衡,并且块分配将在round-robin基础上完成。 |
dfs.datanode. available-space- volume-choosing- policy.balanced- space-preference- fraction | 0.75(默认) | 新块分配发送给某卷比其他券能获得更多的可用空间。允许范围为0.0-1.0,但将其设置在0.5 – 1.0(即50-100%)的范围内,因为应该没有理由偏好具有较少可用磁盘空间的卷接收更多块分配。 |
启用WebHDFS
注意:
若要改为配置HttpFs,请参阅HttpFS安装。
如果你想使用WebHDFS,你必须先启用它。
启用WebHDFS:
在hdfs-site.xml下面设置属性:
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
在WebHDFS中启用数字用户名:
默认情况下,WebHDFS支持以下用户名模式:
^[A-Za-z_][A-Za-z0-9._-]*[$]?$
您可以通过设置dfs.webhdfs.user.provider.user.pattern来覆盖默认的用户名模式 。例如,要允许数字用户名,该属性可以设置如下:
<property>
<name>dfs.webhdfs.user.provider.user.pattern</name>
<value>^[A-Za-z0-9_][A-Za-z0-9._-]*[$]?$</value>
</property>
重要提示:用户名模式应符合所用操作系统的要求。因此,Cloudera建议您使用默认模式并避免修改dfs.webhdfs.user.provider.user.pattern 尽可能。
注意:
- 要在安全集群中使用WebHDFS,您必须设置其他属性来配置安全WebHDFS。有关说明,请参阅Cloudera Security指南。
- 在高可用性(HA)配置中使用WebHDFS时,必须在WebHDFS URI中提供dfs.nameservices值 ,而不是特定NameNode的地址; 例如:hdfs dfs -ls webhdfs://nameservice1/, 而不是 hdfs dfs -ls webhdfs://server1.myent.myco.com:20101/
配置LZO
如果您安装了LZO,请按照以下方式进行配置。
配置LZO:
在core-site.xml下面设置属性。注意:
如果复制并粘贴value 字符串,请确保删除由于页面宽度约束而在下面包含的换行符和回车符。
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
有关LZO的更多信息,请参阅使用LZO压缩。
启动HDFS
现在要部署HDFS,请按以下步骤操作。
部署配置
要将您的配置部署到整个群集:
- 推送您的自定义目录(例如/etc/hadoop/conf.my_cluster)添加到群集中的每个节点; 例如:
$ scp -r /etc/hadoop/conf.my_cluster myuser@myCDHnode-<n>.mycompany.com:/etc/hadoop/conf.my_cluster
手动设置 alternatives 在每个节点上指向该目录,如下所示。
在RHEL兼容系统上手动设置配置:
$ sudo alternatives --verbose --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.my_cluster 50
$ sudo alternatives --set hadoop-conf /etc/hadoop/conf.my_cluster
要在Ubuntu和SLES系统上手动设置配置,请执行以下操作:
$ sudo update-alternatives --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.my_cluster 50
$ sudo update-alternatives --set hadoop-conf /etc/hadoop/conf.my_cluster
有关替代方法的更多信息,请参阅alternatives(8)。
启动HDFS
在集群中的每个节点上启动HDFS,如下所示:
for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x start ; done
注意:
这将启动节点上安装的所有CDH服务。这通常是你想要的,但如果你愿意,你可以单独开始服务。
创建/ tmp目录
重要:
如果你不创建正确地/tmp ,稍后您可能会遇到CDH组件的问题。具体来说,如果你不创建/tmp,另一个进程可能会自动创建限制性权限,这会阻止其他应用程序使用它。
在HDFS启动并运行后创建/tmp 目录,并将其权限设置为1777(drwxrwxrwt), 如下:
$ sudo -u hdfs hadoop fs -mkdir /tmp
$ sudo -u hdfs hadoop fs -chmod -R 1777 /tmp
部署YARN或MRv1
要部署MRv1或YARN,并启动HDFS服务(如果尚未完成),请参阅