本文描述了如何从少数节点到包含上千节点的大规模集群上安装和配置 Hadoop 集群。如果只是为了尝试,你可以先从单台机器上安装开始(参阅单节点安装)。
本文并不包含诸如安全和高可用等高级话题。
安装 Hadoop 集群一般需要在所有机器上解压发行包,并通过你操作系统配置的包管理系统进行安装。将硬件设备根据功能进行划分非常重要。
通常,集群内有一台机器被指派为 NameNode,另一台为 ResourceManager。这两台机器承担 Master 角色。 其他的服务,如 Web App Proxy Server和 MapReduce Job History server,根据集群负荷,要么运行在独占的硬件上,要么和其他服务共享基础设施。
集群内的其他机器扮演 Worker 的角色,同时运行 DataNode 和 NodeManager。
两种类型的配置文件决定了 Hadoop 的 Java 启动参数:
另外在发行包的 bin/ 目录下有一些 Hadoop 的脚本,你可以在 etc/hadoop/hadoop-env.sh 和 etc/hadoop/yarn-env.sh 中设定集群特定的参数。
为了配置 Hadoop 集群,你需要设定守护进程的运行环境和启动参数。
HDFS 的守护进程包括 NameNode、SecondaryNameNode 和 DataNode,Yarn 的守护进程包括 ResourceManager、NodeManager 和 WebAppProxy。如果启用了 MapReduce,也需要运行 MapReduce Job History Server。对于大规模部署,这些守护进程一般运行在不同的主机上。
管理员应使用 etc/hadoop/hadoop-env.sh 或者次要的 the etc/hadoop/mapred-env.sh 和 etc/hadoop/yarn-env.sh 脚本来实现特定集群的对 Hadoop 守护进程的运行环境的定制化。
至少,你需要为每个远端节点提供正确的 JAVA_HOME 。
管理员可以使用如下的环境变量来个性化配置各个守护进程。
守护进程
环境变量
NameNode
HDFS_NAMENODE_OPTS
DataNode
HDFS_DATANODE_OPTS
Secondary NameNode
HDFS_SECONDARYNAMENODE_OPTS
ResourceManager
YARN_RESOURCEMANAGER_OPTS
NodeManager
YARN_NODEMANAGER_OPTS
WebAppProxy
YARN_PROXYSERVER_OPTS
Map Reduce Job History Server
MAPRED_HISTORYSERVER_OPTS
举例来说,为了让 Namenode 使用 parallelGC 和 4GB 大小的 Java 堆,可以添加后续的命令到 hadoop-env.sh:
export HDFS_NAMENODE_OPTS="-XX:+UseParallelGC -Xmx4g"
请在 etc/hadoop/hadoop-env.sh 中寻找更多示例。
其他可以定制化的有用参数包括:
大多数情况,你应该指明 HADOOP_PID_DIR 和 HADOOP_LOG_DIR,这样 Hadoop 守护进程就知道该往哪个目录写文件。否则,这里会有潜在的链接攻击的危险。
在系统级别的环境里配置 HADOOP_HOME 变量是常见的作法。举例来说,在 /etc/profile.d 脚本中添加一小段命令:
HADOOP_HOME=/path/to/hadoop
export HADOOP_HOME
本节阐释以下配置文件里的重要参数。
参数
取值
注释
fs.defaultFS
NameNode URI
hdfs://host:port/
io.file.buffer.size
131072
SequenceFiles 的读写缓冲区大小。
参数
取值
注释
dfs.namenode.name.dir
NameNode持久化命名空间和事务日志的本地目录路径。
如果用逗号分割了多个目录路径,为了冗余存储, name table 会被多副本地写到这些目录中。
dfs.hosts / dfs.hosts.exclude
允许/排除的 DataNode 列表。
如有必要,使用从节点配置文件来列出所有允许的 DataNode。
dfs.blocksize
268435456
对于大规模文件系统,HDFS 的块大小为 256MB。
dfs.namenode.handler.count
100
NameNode 服务器响应来自大量 DataNode 的 RPC 请求的线程数量。
参数
取值
注释
dfs.datanode.data.dir
DataNode 存储块数据的本地目录路径。
如果用逗号分割了多个目录路径(通常属于不同的外接设备),数据会被多副本地写到这些目录中。
参数
取值
Notes
yarn.acl.enable
true / false
是否开启 ACL。默认是 false。
yarn.admin.acl
Admin ACL
集群中具有管理员权限的用户或用户组。 如果由多个,用逗号分隔。默认值是 *,代表任何账户都可以;空白表示不设管理员。
yarn.log-aggregation-enable
false
是否启动日志聚合。
参数
取值
注释
yarn.resourcemanager.address
ResourceManager host:port 客户端提交作业的接口。
host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。
yarn.resourcemanager.scheduler.address
ResourceManager host:port ApplicationMaster 向 Scheduler 申请资源的接口。
host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。
yarn.resourcemanager.resource-tracker.address
ResourceManager host:port NodeManagers 汇报的接口
host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。
yarn.resourcemanager.admin.address
ResourceManager host:port 管理员专用的接口。
host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。
yarn.resourcemanager.webapp.address
ResourceManager host:port 图形化的网站接口。
host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。
yarn.resourcemanager.hostname
ResourceManager 主机名。
host 适用于所有 yarn.resourcemanager*address 字样的配置项的单个主机名。ResourceManager 各个组件使用默认的端口号。
yarn.resourcemanager.scheduler.class
ResourceManager Scheduler 类名。
CapacityScheduler(推荐)、FairScheduler(次要推荐)或 FifoScheduler。使用完整的类名,如 org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler。
yarn.scheduler.minimum-allocation-mb
针对容器的请求,ResourceManager 每次分配的最小内存量。
单位是 MB。
yarn.scheduler.maximum-allocation-mb
针对容器的请求,ResourceManager 每次分配的最大内存量。
单位是 MB。
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path
允许/排除的 NodeManager 列表。
如有必要,使用从节点配置文件来列出所有允许的 NodeManager。
参数
取值
注释
yarn.nodemanager.resource.memory-mb
对于所在节点,以 MB 为单位的由 Yarn 管理的物理内存大小。
决定了 NodeManager 运行所有的容器可占用的物理内存总量。
yarn.nodemanager.vmem-pmem-ratio
相比于物理内存大小,虚拟内存可以使用的比例。
在分配的物理内存之外,每个任务分配的虚拟内存大小。以及相比于 yarn.nodemanager.resource.memory-mb,所在节点所有任务消耗的虚拟内存总量。
yarn.nodemanager.local-dirs
逗号分隔的本地目录,用于写临时数据。
使用多个路径可以帮助分散磁盘 i/o。
yarn.nodemanager.log-dirs
逗号分隔的本地目录,用于写日志数据。
使用多个路径可以帮助分散磁盘 i/o。
yarn.nodemanager.log.retain-seconds
10800
日志聚合被关闭时有效,决定了 NodeManager 存续日志文件的时长(秒)。
yarn.nodemanager.remote-app-log-dir
/logs
日志聚合被开启时有效,决定了程序结束后,日志文件将要移动到的 HDFS 目录路径。该目录需要配置合适的权限控制。
yarn.nodemanager.remote-app-log-dir-suffix
logs
日志聚合被开启时有效,决定了添加到远端日志目录路径的后缀名。日志文件会被聚合到 ${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam}。
yarn.nodemanager.aux-services
mapreduce_shuffle
MapReduce 程序需要的 Shuffle 服务。
yarn.nodemanager.env-whitelist
容器从 NodeManager 继承的环境变量
对于 MapReduce 程序,该值代表了除默认包含的 HADOOP_MAPRED_HOME 以外要继承的环境变量。合法的环境变量包括 JAVA_HOME、HADOOP_COMMON_HOME、HADOOP_HDFS_HOME、HADOOP_CONF_DIR、CLASSPATH_PREPEND_DISTCACHE、HADOOP_YARN_HOME和HADOOP_MAPRED_HOME等。
参数
取值
注释
yarn.log-aggregation.retain-seconds
-1
对于聚合的日志,保留多少秒。-1 代表禁用。小心,取值越小,对 NameNode 干扰越大。
yarn.log-aggregation.retain-check-interval-seconds
-1
对于日志的存续时长,多久检查一次。 如果设置为 0 或者负数值,取值将为 yarn.log-aggregation.retain-seconds 的十分之一。小心,取值越小,对 NameNode 干扰越大。
参数
取值
注释
mapreduce.framework.name
yarn
使用 Yarn 作为 Hadoop 的执行框架。
mapreduce.map.memory.mb
1536
MAP 任务的内存限量。
mapreduce.map.java.opts
-Xmx1024M
MAP 任务的 JVM 启动参数。
mapreduce.reduce.memory.mb
3072
REDUCE 任务的内存限量。
mapreduce.reduce.java.opts
-Xmx2560M
REDUCE 任务的 JVM 启动参数。
mapreduce.task.io.sort.mb
512
排序数据的内存限量,影响执行效率。
mapreduce.task.io.sort.factor
100
排序文件时一次可以同时归并的文件数量。
mapreduce.reduce.shuffle.parallelcopies
50
REDUCE 任务从远端拉取数据时一次可以同时连接的 MAP 任务数量。
参数
取值
注释
mapreduce.jobhistory.address
MapReduce JobHistory Server host:port
默认端口是 10020。
mapreduce.jobhistory.webapp.address
MapReduce JobHistory Server 网站接口 host:port
默认端口是 19888。
mapreduce.jobhistory.intermediate-done-dir
/mr-history/tmp
MapReduce 作业输出历史文件的目录。
mapreduce.jobhistory.done-dir
/mr-history/done
MR JobHistory Server 管理历史文件的目录。
Hadoop 提供了一种机制,使得管理员可以配置 NodeManager 周期性地执行一个由管理员提供的脚本,来判断所在节点是否健康。
管理员可以通过执行该脚本中的检查命令来决定节点是否健康。如果脚本认为节点不健康,它会向标准输出打印一行以 ERROR 开头的文本。NodeManager 周期性地执行该脚本并解析其标准输出的内容。如果脚本输出的文本包含上述所说的 ERROR 关键词,当前节点的状态将被汇报为不健康并被 Resource Manager 拉入黑名单,后续的任务将不会被分配到该节点。但 NodeManager 将继续执行该脚本,这样该节点酱油再次恢复健康的机会,从 ResourceManager 的黑名单中自动移除。管理员可以通过 Resource Manager 的网站接口查看各个节点的健康状态以及检查脚本的输出。节点最近一次以来的健康持续时间同样可以会显示在网页中。
在etc/hadoop/yarn-site.xml 中的以下参数用来控制节点的健康监控:
参数
取值
注释
yarn.nodemanager.health-checker.script.path
节点健康检查脚本路径
用来检查节点健康状态的脚本。
yarn.nodemanager.health-checker.script.opts
节点健康检查脚本的运行参数
脚本检查节点健康所引用的选项。
yarn.nodemanager.health-checker.interval-ms
节点健康检查脚本的触发周期
执行健康检查脚本的时间间隔。
yarn.nodemanager.health-checker.script.timeout-ms
节点健康检查脚本的执行超时
健康检查脚本单次执行的时间上限。
如果本地磁盘有损,健康检查脚本不应该输出 ERROR 关键字。NodeManager 会定期地检查本地磁盘(具体来说是 nodemanager-local-dirs 和 nodemanager-log-dirs 两个目录)是否健康。在受损目录数量达到阈值(由配置项 yarn.nodemanager.disk-health-checker.min-healthy-disks 设定)后, 整个节点会被标记为不健康并把该信息发送给 ResourceManager。引导盘要么阵列冗余化,要么由健康检查脚本来监控。
在 etc/hadoop/workers 文件中逐行列出从节点的主机名或IP地址。辅助脚本将基于 etc/hadoop/workers 文件实现同时在多台机器运行命令。 该文件并不被任何 Java 程序的配置文件所引用。为了使用该功能,必须为启动 Hadoop 的账号配置 ssh 的可信访问,如使用免密码登陆或者 Kerberos 等。
许多 Hadoop 组件可以利用机架信息表达的网络拓扑结构来改善性能和安全性。通过触发管理员配置的模块,Hadoop 守护进程获取集群中从节点的机架信息。请参阅机架感知以获得更多信息。
强烈建议在启动 HDFS 之前先配置机架感知。
Hadoop 通过 Apache Commons Logging 框架使用 Apache log4j 记录日志信息。 请编辑 etc/hadoop/log4j.properties 文件以定制化 Hadoop 守护进程的日志配置,如格式等。
一旦所有配置就绪,分发 HADOOP_CONF_DIR 目录到所有的机器,并确保其路径在各台机器上是一样的。
建议使用不同的用户名来运行 HDFS 和 YARN。在大多数的部署中,HDFS 进程以“hdfs”为用户名,YARN 通常使用“yarn”。
要启动 Hadoop 集群,你需要同时启动 HDFS 和 YARN。
第一次启动 HDFS 时,必须先进行格式化。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format
在指派的主节点上启动 NameNode。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode
在各台从节点上启动 DataNode。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode
如果配置了 etc/hadoop/workers 和 ssh 可信访问(参阅单节点安装),所有的 HDFS 进程都可以用一个辅助脚本来启动。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh
在指派的主节点上启动 ResourceManager。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager
在各台从节点上启动 NodeManager。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager
使用 yarn 账户,启动独立的 WebAppProxy 服务器。如果配置了负载均衡,那么每个实例都要执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start proxyserver
如果配置了 etc/hadoop/workers 和 ssh 可信访问(参阅单节点安装),所有的 Yarn 进程都可以用一个辅助脚本来启动。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/sbin/start-yarn.sh
在指派的节点上启动 MapReduce JobHistory Server。使用 mapred 账户,执行如下命令:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver
在指派的主节点上启动 NameNode。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode
在各台从节点上停止 DataNode。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop datanode
如果配置了 etc/hadoop/workers 和 ssh 可信访问(参阅单节点安装),所有的 HDFS 进程都可以用一个辅助脚本来停止。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh
在指派的主节点上停止 ResourceManager。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop resourcemanager
在各台从节点上停止 NodeManager。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager
如果配置了 etc/hadoop/workers 和 ssh 可信访问(参阅单节点安装),所有的 Yarn 进程都可以用一个辅助脚本来启动。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/sbin/stop-yarn.sh
使用 yarn 账户,停止 WebAppProxy 服务器。如果配置了负载均衡,那么每个实例都要执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn stop proxyserver
在指派的节点上停止 MapReduce JobHistory Server。使用 mapred 账户,执行如下命令:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver
一旦 Hadoop 集群启动完毕,可以访问以下网址来查看各个组件的状态:
守护进程
网站接口
注释
NameNode
默认端口是 9870。
ResourceManager
默认端口是 8088。
MapReduce JobHistory Server
默认端口是 19888。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章