前言
之前为了方便,hadoop就直接用的单节点模式搭建的。但是,生产环境是不可以这样的,所以还需要研究。但是吧,英文文档始终读起来太慢了,而且反复研究也不方便。就借此机会把安装文档翻译过来,一来熟悉一下安装。二来,翻译的过程可以让我对其中的专有概念更加熟悉。下面是翻译的正文了。原文地址是: https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-common/ClusterSetup.html
目标
这个文档描述如何安装及配置Hadoop集群,集群的规模可以少到几个节点,大到上千个节点。玩Hadoop,或许首先想要尝试安装一个节点的机器(参见:https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-common/SingleCluster.html)
先决条件
- 安装java。参考 http://wiki.apache.org/hadoop/HadoopJavaVersions ,以了解需要什么版本
- 从Apache镜像下载stable版的Hadoop
安装
安装hadoop集群需要将软件包解压到集群涉及的所有机器上,或者通过系统中的包管理系统进行安装。按功能分割硬件是很重要的。
一般来说,集群中的一个机器被指定为NameNode(名称节点),另一个机器作为ResourceManager(资源管理器)。这两个节点是唯一的。他们是master(主节点)。其它的服务(比如 Web App Proxy Server 和 MapReduce Job History server)经常根据需要跑在专用的硬件上或者共享的公共基础设施上。
集群中剩下的节点扮演着DataNode(数据节点)和NodeManager(节点管理器)的角色。这些是slave(子节点)
在Non-Secure(无安全)模式中配置Hadoop
Hadoop的java配置由两类重要的配置文件构成:
- Read-only default configuration(只读默认配置文件) - core-default.xml, hdfs-default.xml, yarn-default.xml and mapred-default.xml .
- Site-specific configuration(站点细节配置文件)- etc/hadoop/core-site.xml, etc/hadoop/hdfs-site.xml, etc/hadoop/yarn-site.xml and etc/hadoop/mapred-site.xml.
另外,你还可以改变脚本etc/hadoop/hadoop-env.sh和etc/hadoop/yarn-env.sh 中的站点细节来控制hadoop,他们在软件包的bin目录下。
配置Hadoop集群,你需要配置environment(环境变量)。 因为Hadoop集群也把环境变量当作配置参数。
HDFS服务有NameNode(名称节点),SecondaryNameNode(次名称节点)和DataNode(数据节点
)。 YARN服务有ResourceManager,NodeManager和WebAppProxy。 如果要用MapReduce,那么MapReduce Job History Server也需要运行。在大规模的安装中,这些通常运行在隔离的主机中。
配置Hadoop服务的环境(evironment)
管理员应该用etc/hadoop/hadoop-env.sh 以及可选的etc/hadoop/mapred-env.sh 和 etc/hadoop/yarn-env.sh 脚本来定制hadoop服务进程环境。
最少,你需要配置JAVA_HOME, 这样它们在每个节点才能被正确的定义。
管理员可以使用下面的选项对服务进行独立的配置:
Daemon(服务) | Environment Variable(环境变量) |
---|---|
NameNode | HADOOP_NAMENODE_OPTS |
DataNode | HADOOP_DATANODE_OPTS |
Secondary NameNode | HADOOP_SECONDARYNAMENODE_OPTS |
ResourceManager | YARN_RESOURCEMANAGER_OPTS |
NodeManager | YARN_NODEMANAGER_OPTS |
WebAppProxy | YARN_PROXYSERVER_OPTS |
Map Reduce Job History Server | HADOOP_JOB_HISTORYSERVER_OPTS |
举个例子,配置NameNode使用parallelGC,下面的内容应该被添加到hadoop-env.sh文件中:
export HADOOP_NAMENODE_OPTS="-XX:+UseParallelGC"
查阅etc/hadoop/hadoop-env.sh文件可以看到别的例子。
别的有用的配置参数你可以自定义包含:
- HADOOP_PID_DIR - 服务进程ID文件存储的位置
- HADOOP_LOG_DIR - 服务日志文件存储的目录。日志文件如果不存在会被自动创建。
- HADOOP_HEAPSIZE / YARN_HEAPSIZE - 最大使用的堆大小,单位是MB。举例来说,如果被设置为1000,堆将会被设置为1000MB。这是用来配置服务的对大小。默认的值,就是1000.如果你给每个服务分别配置,你可以使用这个参数。
在大部分情况下,你应该配置HADOOP_PID_DIR和HADOOP_LOG_DIR,他们应该仅可以被运行服务的用户写入。否则,会有链接攻击(symlink attack)的可能性。
一般也会在全系统范围环境配置内配置HADOOP_PREFIX 。举个例子,下面是/etc/profile.d中的一小段脚本:
HADOOP_PREFIX=/path/to/hadoop
export HADOOP_PREFIX
Daemaon | Environment Variable |
---|---|
ResourceManager | YARN_RESOURCEMANAGER_HEAPSIZE |
NodeManager | YARN_NODEMANAGER_HEAPSIZE |
WebAppProxy | YARN_PROXYSERVER_HEAPSIZE |
Map Reduce Job History Server | HADOOP_JOB_HISTORYSERVER_HEAPSIZE |
配置Hadoop服务
这部分将会详细说明各配置文件中的重要参数
- etc/hadoop/core-site.xml
Parameter | Value | Notes |
---|---|---|
fs.defaultFS | NameNode URI(名称节点的uri) | hdfs://host:port/ |
io.file.buffer.size | 131072 | 序列文件(SequenceFiles)中用到的读/写缓冲区的大小 |
- etc/hadoop/hdfs-site.xml
- 配置名称节点的参数
Parameter | Value | Notes |
---|---|---|
dfs.namenode.name.dir | 固定存储NameNode的命名空间及处理日志的本地文件系统路径 | 如果这是一个逗号分隔的地址列表,那么NameTable将会在所有的文件夹中作为冗余 |
dfs.hosts / dfs.hosts.exclude | 允许的/排除的数据节点列表 | 如果必要,使用这些文件控制允许的数据节点 |
dfs.blocksize | 268435456 | HDFS为大文件系统设定的 256MB的块大小(blocksize) |
dfs.namenode.handler.count | 100 | 更多的NameNode服务线程来处理来自大量的DataNode的RPC请求 |
- 配置数据节点
Parameter | Value | Notes |
---|---|---|
dfs.datanode.data.dir | 逗号分隔的本地文件系统的路径列表。每个路径都是用来存储DataNode的块的 | 如果这是一个逗号分隔的文件夹列表,那么数据将会存储在所有的目录中特别是在不同的设备上 |
- etc/hadoop/yarn-site.xml
- 配置ResourceManager和NodeManager
Parameter | Value | Notes |
---|---|---|
yarn.acl.enable | yarn.acl.enable | 是否启用ACL(访问控制列表),默认是false |
yarn.admin.acl | 管理员的访问控制列表 | 管理员在集群上的访问控制列表。访问控制列表是逗号分隔用户空间分隔的组(comma-separated-usersspacecomma-separated-groups)。默认的值是* ,意味着任何人。如果仅仅是一个空格的话,意味着没有人可以访问 |
yarn.log-aggregation-enable | false | 配置开启或者关闭日志聚合 |
- 配置ResourceManager
Parameter | Value | Notes |
---|---|---|
yarn.resourcemanager.address | ResourceManager的host:port,客户端在这个位置提交作业 | host:port 如果设置了则覆盖yarn.resourcemanager.hostname中的hostname设置 |
yarn.resourcemanager.scheduler.address | ResourceManager的host:port,ApplicationMasters和作业通信以获得资源的位置 | host:port 如果设置了则覆盖yarn.resourcemanager.hostname中的hostname设置 |
yarn.resourcemanager.resource-tracker.address | ResourceManager的host:port 供给NodeManagers调用的位置 | host:port 如果设置了则覆盖yarn.resourcemanager.hostname中的hostname设置 |
yarn.resourcemanager.admin.address | ResourceManager的host:port 作为administrative命令的目标的位置 | host:port 如果设置了则覆盖yarn.resourcemanager.hostname中的hostname设置 |
yarn.resourcemanager.webapp.address | ResourceManager web-ui 的host:port | host:port 如果设置了则覆盖yarn.resourcemanager.hostname中的hostname设置 |
yarn.resourcemanager.hostname | ResourceManager的host | 设置单一的hostname可以替代设置所有的yarn.resourcemanager*address中的资源。结果使用ResourceManager组件中的默认端口 |
yarn.resourcemanager.scheduler.class | ResourceManager的作业的class | 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 | 允许或者排除的NodeManagers列表 | 如果需要,使用这些文件控制列表控制NodeManager是否可以访问 |
- 配置NodeManager
Parameter | Value | Notes |
---|---|---|
yarn.nodemanager.resource.memory-mb | 资源,也就是给NodeManager的物理内存,单位是MB | 默认是NodeManager上的所有可用资源都可以用来运行容器 |
yarn.nodemanager.vmem-pmem-ratio | 任务的虚拟内存使用可能超过物理内存的最大比率 | 通过这个比率,每个任务的虚拟内存使用可能会超过其物理内存限制。NodeManager上的任务所使用的虚拟内存总量可能会超过它的物理内存使用量。 |
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 | 附加到远程日志目录的后缀。日志将聚合为 {user}/${thisParam}。。只在启用日志聚合时才适用 |
yarn.nodemanager.aux-services | mapreduce_shuffle | 需要为MapReduce应用设置的洗牌服务 |
- 配置History Server(需要被挪到别的地方)
Parameter | Value | Notes |
---|---|---|
yarn.log-aggregation.retain-seconds | -1 | 删除聚合日志之前保存多久。-1是禁用。小心,如果设置的过小的话将会向name节点滥发消息 |
yarn.log-aggregation.retain-check-interval-seconds | -1 | 检查聚合日志保留之间的时间。如果设置为0或负值,则计算该值为聚合日志保留时间的十分之一。请小心,将其设置得太小,您将向name节点滥发消息 |
- etc/hadoop/mapred-site.xml
- 配置MapReduce应用
Parameter | Value | Notes |
---|---|---|
mapreduce.framework.name | yarn | 将执行框架设置为Hadoop YARN。 |
mapreduce.map.memory.mb | 1536 | map资源最大限制 |
mapreduce.map.java.opts | -Xmx1024M | map的子jvm最大堆内存限制 |
mapreduce.reduce.memory.mb | 3072 | 分解的最大内存限制 |
mapreduce.reduce.java.opts | -Xmx2560M | 分解的子jvm最大对限制 |
mapreduce.task.io.sort.mb | 512 | 加速排序时的最大内存限制 |
mapreduce.task.io.sort.factor | 100 | 排序时同时合并的流的最大数量 |
mapreduce.reduce.shuffle.parallelcopies | 50 | reduce运行的并行副本数量越多,就可以从大量映射中获取输出。 |
- 配置MapReduce JobHistory Server
Parameter | Value | Notes |
---|---|---|
mapreduce.jobhistory.address | MapReduce JobHistory Server的host:port | 默认端口10020 |
mapreduce.jobhistory.webapp.address | MapReduce JobHistory Server Web UI的host:port | 默认端口19888 |
mapreduce.jobhistory.intermediate-done-dir | /mr-history/tmp | 由MapReduce作业编写的历史文件的目录。 |
mapreduce.jobhistory.done-dir | /mr-history/done | 由MR JobHistory服务器管理的历史文件的目录。 |
监听NodeManager的健康情况
Hadoop提供了一种机制,管理员可以通过这种机制配置NodeManager,定期运行管理员提供的脚本,以确定节点是否健康。
管理员可以通过在脚本中执行他们选择的任何检查来确定节点是否处于健康状态。如果脚本检测到节点处于不健康状态,它必须将一行以字符串错误开头的内容打印到标准输出中。NodeManager定期生成脚本并检查其输出。如果脚本的输出包含的字符串ERROR,则节点的状态报告为不健康,并且该节点被ResourceManager列入黑名单。不再向该节点分配任何其他任务。但是,NodeManager将继续运行该脚本,以便如果节点再次恢复健康,它将自动从ResourceManager上的黑名单节点中删除。如果节点的健康状况和脚本的输出不健康,管理员可以在ResourceManager web界面中使用它。节点处于健康状态的时间也显示在web界面上。
- 下面的参数可以用来控制节点的健康监听,在脚本etc/hadoop/yarn-site.xml中进行配置
Parameter | Value | Notes |
---|---|---|
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 | 节点健康检查间隔超时时间 | 运行健康检查脚本的超时时间 |
如果只有部分本地磁盘变坏,则健康检查程序脚本不应该给出错误。NodeManager能够定期检查本地磁盘的健康状态(具体地检查nodeManager-local-dirs和nodeManager-log-dirs),并根据配置属性yarn设置的值在到达坏目录数量的阈值(由属性yarn.nodemanager.disk-health-checker.min-healthy-disks进行配置)之后,整个节点被标记为不健康,这个消息也会被送到ResourceManager。启动磁盘受到攻击,或者启动磁盘中存在故障将由健康检查程序脚本标识。
子节点文件(Slaves File)
在文件etc/hadoop/slaves中列出所有的hostname或者ip地址,一行一个。帮助脚本(下面会介绍)将会使用etc/hadoop/slaves文件在众多主机上运行命令。它不用于任何基于java的Hadoop配置。为了使用此功能,必须为用于运行Hadoop的帐户建立ssh信任(通过无密码ssh或其他方法,如Kerberos)。
hadoop架构感知(Rack Awareness)
很多Hadoop组件都是具备架构感知的,并用网络知识来提高性能及安全性。hadoop服务通过相应管理员配置的模块获取集群中子节点的架构信息。更多信息参见:https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-common/RackAwareness.html
高度推荐使用HDFS的时候配置架构感知优先。
日志
hadoop使用Apache log4j 通过Apache Commons Logging framework for logging。编辑etc/hadoop/log4j.properties 文件来自定义hadoop服务日志配置(日志格式以及其它更多)
操作hadoop集群
一旦所有的配置都完成了,发布文件到所有机器的HADOOP_CONF_DIR目录上。这在所有机器上应该是同一个目录。
一般来说,推荐HDFS和YARN使用不同的用户。在多数安装过程中,HDFS进程使用hdfs用户,YARN则使用yarn用户
启动hadoop
启动hadoop集群,你需要同时启动HDFS和YARN集群。
首先你搭建HDFS,它必须给格式化。格式化一个新的文件系统叫做hdfs。
[hdfs]$ $HADOOP_PREFIX/bin/hdfs namenode -format <cluster_name>
使用以下命令在指定的节点用用户hdfs启动HDFS的NameNode:
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode
如果etc/hadoop/slaves 和ssh访问信任都配置了(参见 https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-common/SingleCluster.html ),那么所有的hdfs进程可以使用下面脚本启动,注意用hdfs用户:
[hdfs]$ $HADOOP_PREFIX/sbin/start-dfs.sh
使用yarn用户,在指定的节点使用如下命令启动ResourceManager:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start resourcemanager
用yarn用户在每个主机执行脚本,启动NodeManager:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR start nodemanager
启动一个单独的WebAppProxy。用yarn用户运行WebAppProxy服务。如果多个服务被用来做负载均衡,应该分别为他们执行:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start proxyserver
如果etc/hadoop/slaves 和ssh访问信任都被配置了(具体参见:https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-common/SingleCluster.html) ,所有的YARN进程可以被一个通用脚本启动。使用yarn用户运行:
[yarn]$ $HADOOP_PREFIX/sbin/start-yarn.sh
在所有指定的服务器上运行下面命令,启动MapReduce JobHistory Server,用mapred用户执行:
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR start historyserver
关闭Hadoop
在指定的NameNode上使用hdfs用户运行一下命令关闭NameNode节点
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop namenode
使用hdfs用户运行下面的脚本来关闭DataNode:
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs stop datanode
如果etc/hadoop/slaves和ssh访问信任都被配置了(参见:https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-common/SingleCluster.html),所有的HDFS进程可以被以下脚本停止。使用hdfs用户运行:
[hdfs]$ $HADOOP_PREFIX/sbin/stop-dfs.sh
使用以下脚本停止ResourceManager,使用yarn用户在每个ResourceManager节点上运行:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop resourcemanager
使用yarn用户在slave节点上运行下面的脚本,停止NodeManager
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR stop nodemanager
如果etc/hadoop/slaves和ssh访问信任都被配置了(参见:https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-common/SingleCluster.html) 可以使用下面的脚本关闭所有的YARN进程。使用yarn用户执行:
[yarn]$ $HADOOP_PREFIX/sbin/stop-yarn.sh
停止WebAppProxyServer。使用yarn用户运行WebAppProxy服务。如果多个服务被用来做负载均衡,需要在他们每个上面运行如下脚本:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop proxyserver
使用以下脚本停止MapReduce JobHistory Server,在各服务器用mapred用户运行:
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR stop historyserver
web界面
hadoop集群启动之后,按照如下描述检查web界面组件:
Daemon | Web Interface | Notes |
---|---|---|
NameNode | http://nn_host:port/ | 默认http端口为50070 |
ResourceManager | http://rm_host:port | 默认http端口为8088 |
MapReduce JobHistory Server | http://jhs_host:port | 默认http端口为19888 |