集群部署HDFS

翻译: 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文档

继续阅读:

  1. 复制Hadoop配置和设置选项
  2. 定制配置文件
  3. 配置本地存储目录
  4. 配置DataNode以允许本地存储目录失败
  5. 格式化NameNode
  6. 配置远程NameNode存储目录
  7. 配置Secondary NameNode
  8. 启用垃圾箱
  9. 为DataNodes配置存储平衡
  10. 启用WebHDFS
  11. 配置LZO
  12. 启动HDFS
  13. 部署YARN或MRv1

注意: 运行服务

使用service命令来启动,停止和重新启动CDH组件,而不是直接在/etc/init.d中运行脚本。

复制Hadoop配置和设置选项

要自定义Hadoop配置:

  1. 将默认配置复制到您的自定义目录中:
$ sudo cp -r /etc/hadoop/conf.empty /etc/hadoop/conf.my_cluster

你可以任意调用这个配置; 在这个例子中,它被称为my_cluster。
重要:
在执行本节中的配置任务时,以及在继续部署MRv1或YARN时,编辑此自定义目录中的配置文件。不要在默认目录/etc/hadoop/conf.empty中创建自定义配置。

  1. 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.defaultFScore-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.superusergrouphdfs-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.dirNameNode上 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使用的本地存储目录:

  1. 在NameNode主机上:创建 dfs.name.dir or dfs.namenode.name.dir 本地目录:
$ sudo mkdir -p /data/1/dfs/nn /nfsmount/dfs/nn

重要:
如果您正在使用高可用性(HA)则不应将这些目录配置为NFS挂载; 在本地存储上配置它们。

  1. 在所有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
  1. 配置目录的所有者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.dirhdfs:hdfsdrwx ——

以下是本地目录的正确所有者和权限摘要:

目录所有者权限(Footnote1)
dfs.name.dir or dfs.namenode.name.dir ,dfs.data.dir or dfs.datanode.data.dirhdfs:hdfsdrwx ——

脚注: 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,请按以下步骤操作。

  1. 将运行Secondary NameNode的机器的名称添加到masters 。
  2. 将以下属性添加到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.intervalminutes or 0文件删除后检查点检查的时间间隔。该选项可以在服务器和客户端上配置。* 如果在服务器配置上启用垃圾箱,则将使用服务器上配置的值,并忽略客户端配置。* 如果垃圾箱在服务器配置中被禁用,则检查客户端配置。* 如果此属性的值为零(默认值),则垃圾箱功能将被禁用。
fs.trash.checkpoint.intervalminutes 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. policyorg.apache.hadoop. hdfs.server.datanode. fsdataset. AvailableSpaceVolumeChoosingPolicy启用DataNode卷之间的存储平衡。
dfs.datanode. available-space- volume-choosing- policy.balanced-space-threshold10737418240(默认)磁盘空间被视为不平衡时,磁盘空间的容量相差数量。默认值为10737418240(10 GB)。如果每个卷上的可用空间都在这个范围内,则这些卷将被视为平衡,并且块分配将在round-robin基础上完成。
dfs.datanode. available-space- volume-choosing- policy.balanced- space-preference- fraction0.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 尽可能。

注意:

配置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,请按以下步骤操作。

  1. 部署配置
  2. 启动HDFS
  3. 创建/ tmp目录

部署配置

要将您的配置部署到整个群集:

  1. 推送您的自定义目录(例如/etc/hadoop/conf.my_cluster)添加到群集中的每个节点; 例如:
$ scp -r /etc/hadoop/conf.my_cluster myuser@myCDHnode-<n>.mycompany.com:/etc/hadoop/conf.my_cluster
  1. 手动设置 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服务(如果尚未完成),请参阅

    原文作者:金刚_30bf
    原文地址: https://www.jianshu.com/p/d483f5b261fc
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞