前言
本文主要是讲述如何在上千节点下的大规模集群的安装和配置。如果你只是想尝hadoop。你可以在单台机器上进行安装。(查看单例安装)
本文不涉及安全或高可用等方面的主题。
先决条件
- 安装Java。想获java取匹配的hadoop版本详情查看Hadoop Wiki 。
- 从Apache的hadoop镜像上下载稳定的版本。
安装
Hadoop集群典型安装方式包括在所有的集群机器上解压软件或者从你的操作系统中通过安装包来安装它。这是一个硬件到功能的很重要的划分。
通常,集群中的一台机器被指定为NameNode,而另一台机器则被指定为ResourceManager。这些都是主。根据负载的情况,其他服务(如Web App Proxy服务和MapReduce Job History 服务)通常在专有硬件或共享设备上运行。
集群中的其余机器同时充当DataNode和no需求者。这些都是工作者。
Hadoop的非安全模式下配置
Hadoop的Java配置的驱动来源于两种重要的配置文件:
- 只读的默认配置 - core-default.xml, hdfs-default.xml, yarn-default.xml 和 mapred-default.xml。
- 特定站点配置 - etc/hadoop/core-site.xml, etc/hadoop/hdfs-site.xml, etc/hadoop/yarn-site.xml 和etc/hadoop/mapred-site.xml。
此外,您还可以在bin/目录中找到的Hadoop控制分发的脚本,它主要是通过设置etc/hadoop/hadoop-env.sh 和etc/hadoop/yarn-env.sh特定值来控制的。
要配置Hadoop集群,您需要配置Hadoop守护进程执行的环境,以及Hadoop守护进程的配置参数。
HDFS守护进程包括NameNode、SecondaryNameNode和DataNode。YARN守护进程包括ResourceManager、NodeManager和WebAppProxy。如果要使用MapReduce,那么MapReduce Job History Server也将会运行。相对于大规模的使用,它们通常运行在单独的主机上。
配置Hadoop守护进程的环境
后台管理员通过etc/hadoop/hadoop-env.sh和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 –守护进程id文件的存储目录。
- HADOOP_LOG_DIR -守护进程日志文件的存储目录。如果日志文件不存在,则自动创建。
- HADOOP_HEAPSIZE_MAX -用于Java heapsize的最大内存使用量.此还支持由JVM支持的单位设置。如果没有任何单位,则假定该数字的单位为M。默认情况下, Hadoop将让JVM决定使用多少内存。这个值可以被每个守护进程的_OPTS 变量覆写。例:设置HADOOP_HEAPSIZE_MAX=1g 和 HADOOP_NAMENODE_OPTS="-Xmx5g" ,此NameNode将配置具有5GB堆。
在大多数情况下,您应该指定HADOOP_PID_DIR 和 HADOOP_LOG_DIR目录,这些目录只能由将要运行hadoop守护进程的用户有写的功能,否则的话可能会出现symlink攻击的情况。
在系统范围的shell环境配置中配置HADOOP_HOME也是一种传统。例如,一个简单的
/etc/profile.d脚本:
HADOOP_HOME=/path/to/hadoop
export HADOOP_HOME
配置Hadoop守护进程
本节主要说明在常用的配置文件中的重要参数。
- etc/hadoop/core-site.xml
参数 | 值 | 说明 |
fs.defaultFS | NameNode URI | |
io.file.buffer.size | 131072 | 队列文件中的读/写缓冲区的大小。 |
- etc/hadoop/hdfs-site.xml
- NameNode配置:
参数 | 值 | 说明 |
dfs.namenode.name.dir | NameNode持久存储名称空间和事务日志的本地文件系统上路径 | 如果这是一个逗号分隔的目录列表,那么将在所有目录中复制名称的表,以进行冗余。 |
dfs.hosts / dfs.hosts.exclude | 包含/摒弃的数据存储节点清单 | 如果有必要,使用这些文件来控制允许的数据存储节点列表 |
dfs.blocksize | 268435456 | HDFS 块大小为256MB的大文件系统. |
dfs.namenode.handler.count | 100 | 多个NameNode服务器线程处理来自大量数据节点的rpc。 |
- DataNode配置:
参数 | 值 | 说明 |
dfs.datanode.data.dir | DataNode的本地文件系统上存储块的逗号分隔的路径列表。 | 如果这是一个逗号分隔的目录列表,那么数据将存储在所有命名的目录中,通常在不同的设备上。 |
- etc/hadoop/yarn-site.xml
- ResourceManager 和NodeManager配置:
参数 | 值 | 说明 |
yarn.acl.enable | true / false | 允许ACLs?默认 false. |
yarn.admin.acl | Admin ACL | 在集群上设置adminis。 ACLs are of for comma-separated-usersspacecomma-separated-groups.默认是指定值为*表示任何人。特别的是空格表示皆无权限。 |
yarn.log-aggregation-enable | false | Configuration to enable or disable log aggregation 配置是否允许日志聚合。 |
- ResourceManager配置:
参数 | 值 | 说明 |
yarn.resourcemanager.address | ResourceManager host:port 用于客户端任务提交. | 如果设置host:port ,将覆盖yarn.resourcemanager.hostname. host:port主机名。 |
yarn.resourcemanager.scheduler.address | ResourceManager host:port 用于应用管理者向调度程序获取资源。 | 如果设置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 web-ui host:port. | 如果设置host:port ,将覆盖yarn.resourcemanager.hostname主机名的设置 |
yarn.resourcemanager.hostname | ResourceManager host. | 可设置为代替所有yarn.resourcemanager* address 资源的主机单一主机名。其结果默认端口为ResourceManager组件。 |
yarn.resourcemanager.scheduler.class | ResourceManager 调度类. | Capacity调度 (推荐), Fair调度 (也推荐),或Fifo调度.使用完全限定类名,如 org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler. |
yarn.scheduler.minimum-allocation-mb | 在 Resource Manager上为每个请求的容器分配的最小内存. | In MBs |
yarn.scheduler.maximum-allocation-mb | 在Resource Manager上为每个请求的容器分配的最大内存 | In MBs |
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path | 允许/摒弃的nodeManagers列表 | 如果必要,可使用这些文件来控制允许的NodeManagers列表 |
- NodeManager配置:
参数 | 值 | 说明 |
yarn.nodemanager.resource.memory-mb | 用于给定的NodeManager的资源,即可用的物理内存、内存容量。 | 用于运行容器的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 | 后缀附加到远程日志目录。日志将聚合到${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam}仅适用于启用日志聚合的情况 |
yarn.nodemanager.aux-services | mapreduce_shuffle | Shuffle service that needs to be set for Map Reduce applications. 需要被设置Shuffle服务的Map Reduce应用程序 |
yarn.nodemanager.env-whitelist | 环境变量通过 从NodeManagers的容器继承的环境属性 | 对于mapreduce应用程序,除了默认值hadoop op_mapred_home应该被添加外。属性值还有JAVA_HOME HADOOP_COMMON_HOME、HADOOP_HDFS_HOME HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME HADOOP_MAPRED_HOME |
l History Server (需要转移到其他地方)配置:
参数 | 值 | 说明 |
yarn.log-aggregation.retain-seconds | -1 | 保存多长时间之后删除聚合日志。-1禁用。要小心,设置值这个太小,这个节点将成为垃圾箱。 |
yarn.log-aggregation.retain-check-interval-seconds | -1 | 检查聚合日志保留的间隔时间。如果将值设置为0或负值,则将值计算为聚合日志保留时间的十分之一。要小心,设置这个太小,这个节点将成为垃圾箱。 |
- etc/hadoop/mapred-site.xml
- MapReduce 应用程序配置:
参数 | 值 | 说明 |
mapreduce.framework.name | yarn | 设置执行的框架为 Hadoop YARN. |
mapreduce.map.memory.mb | 1536 | Maps的资源限制 |
mapreduce.map.java.opts | -Xmx1024M | Maps的子jvm的堆大小设置 |
mapreduce.reduce.memory.mb | 3072 | Reduces的资源限制 |
mapreduce.reduce.java.opts | -Xmx2560M | reduces的子jvm的堆大小设置 |
mapreduce.task.io.sort.mb | 512 | 更高的内存限制,同时对数据进行排序以提高效率。 |
mapreduce.task.io.sort.factor | 100 | 在排序文件时,同时合并更多的流。 |
mapreduce.reduce.shuffle.parallelcopies | 50 | reduce通过运行更多的并行副本来取得大量的maps的输出结果 |
- MapReduce JobHistory Server配置:
参数 | 值 | 说明 |
mapreduce.jobhistory.address | MapReduce JobHistory 服务 主机:端口 | 默认端口为 10020. |
mapreduce.jobhistory.webapp.address | MapReduce JobHistory Server Web UI 主机:端口 | 默认端口为19888. |
mapreduce.jobhistory.intermediate-done-dir | /mr-history/tmp | MapReduce jobs写历史文件的目录 |
mapreduce.jobhistory.done-dir | /mr-history/done | MR JobHistory Server管理的历史文件目录 |
NodeManagers健康监控
Hadoop提供了一种管理员可以通过配置NodeManager以便定期运行管理员提供的脚本,确定节点是否健康的机制。管理员可以通过他们选择的脚本中的任一检查来确定节点是否处于健康状态。如果脚本检测到节点处于不健康状态,它必须打印一行以ERRO开始的字符串并进行标准输出。NodeManager会周期性地生成脚本并检查它的输出。如果脚本的输出包含字符串ERROR错误,如上所述,该节点的状态是不健康的,并且该节点将由ResourceManager在黑名单上列出来。并且将不会有新的任务分配给此节点无论如何,NodeManager还将继续运行此脚本,这样如果此节点恢复正常,它就会自动从ResourceManager上的黑名单节点中删除。该节点的健康信息将伴随脚本进行输出,(如果是不健康的),并通过ResourceManager web界面提供给管理员。该节点健康的时间也会显示在web界面上。
可以使用以下参数来控制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 | 节点健康脚本超时间隔。 | 用于健康脚本执行的超时。. |
如果只有一些本地磁盘变得糟糕,那么health checker脚本不会出现ERROR错误信息。
NodeManager有能力定期检查本地磁盘的健康状况(特别是检查NodeManager -local-dirs和NodeManager -log-dirs),并且在达到了基于配置属性yarn.nodemanager.disk-health-checker的值设置的坏目录的阈值之后。如果整个节点都是不健康的,这个信息将被发送到资源管理器。由健康检查脚本来标识引导磁盘被检查还是引导磁盘上出现故障。
从文件
etc/hadoop/workers文件中列出所有工作主机名或IP地址,每行一个。Helper脚本(如下所述)将使用etc/hadoop/workers文件同时在许多主机上运行命令。它不基于java的任何Hadoop配置。使用这个功能,必须为运行Hadoop的帐户建立ssh信任(通过无密码ssh或其他一些方法,例如Kerberos)。
Hadoop机架感知
许多Hadoop组件都是机架感知的,并利用网络拓扑来实现性能和安全性。Hadoop守护进程通过调用管理员配置的模块获取集群中工作人员的机架信息。有关更详细的信息,请参阅“机架感知”文档。
在启动HDFS之前,强烈建议配置机架感知。
日志
Hadoop使用Apache Commons日志框架的Apache log4j进行日志记录。
编辑the etc/hadoop/log4j.properties 文件来实现Hadoop守护进程日志配置(日志格式等)的定制化。
Hadoop集群操作
一旦完成所有必要的配置之后,将文件分发到所有机器上的HADOOP_CONF_DIR目录。这在所有机器上的目录是相同的。
正常情况下,建议将HDFS和YARN使用单独的用户运行。在大多数的安装情况中,HDFS 进程使用‘hdfs’账号,YARN 通常使用 ‘yarn’ 账号。
Hadoop启动
启动Hadoop集群,您需要启动HDFS和YARN集群。
第一次打开HDFS时,必须对其进行格式化。将新的分布式文件系统格式化为hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format <cluster_name>
在指定的节点上使用以下命令启动HDFS NameNode作为hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode
在每个指定节点上使用以下命令启动一个HDFS DataNode作为hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode
如果etc/hadoop/workers和ssh可信访问已配置(参见单节点设置),那么所有的HDFS进程都可以使用一个通用脚本启动hdfs:
[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh
用下面的命令启动YARN,在指定的ResourceManager上运行YARN:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager
运行一个脚本,在每个指定的主机上启动一个NodeManager作为yarn:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager
启动一个独立的WebAppProxy服务器。作为运行在WebAppProxy服务器上的yarn。如果在负载均衡中使用多个服务器,则应该在每个服务器上运行:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start proxyserver
如果etc/hadoop/workers和ssh可信访问被配置(参见单节点设置),那么所有的线程进程都可以从一个通用脚本开始yarn。
[yarn]$ $HADOOP_HOME/sbin/start-yarn.sh
使用下面的命令启动MapReduce JobHistory服务,运行指定的mapred服务:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver
Hadoop关闭
用下面的命令停止在指定的NameNode上运行hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode
运行一个脚本来停止hdfs的DataNode。
[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
运行一个脚本,以停止yarn的NodeManager工作:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager
如果etc/hadoop/workers和ssh可信访问被配置(参见单节点设置),那么所有的yarn进程都可以用一个通用脚本停止:
[yarn]$ $HADOOP_HOME/sbin/stop-yarn.sh
停止WebAppProxy服务。运行在WebAppProxy服务上的yarn。如果在负载均衡中使用多个服务,则应该在每个服务器上运行停止WebAppProxy服务:
[yarn]$ $HADOOP_HOME/bin/yarn stop proxyserver
使用以下命令停止在指定的服务上运行mapred的MapReduce JobHistory服务:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver
Web 界面
如果Hadoop集群启动并运行web ui组件进行检查,其如下所述:
守护进程 | Web 界面 | 说明 |
NameNode | 默认HTTP端口为 9870 | |
ResourceManager | 默认HTTP端口为8088 | |
MapReduce JobHistory Server | 默认HTTP端口为19888 |