- Hadoop集群安装
本章节介绍如何安装和配置Hadoop集群,范围从几个节点到具有数千个节点的极大集群。要使用Hadoop,首先你需要将它安装到一台计算机(参见单节点安装章节)。
本章节不包括安全性和高可靠性等高级主题。
- JAVA环境安装。可以从Hadoop Wiki中找到合适的版本说明。
- 从Apache镜像网站下载一个稳定版本的Hadoop安装包。
安装Hadoop集群通常需要在集群中所有的计算机上解压Hadoop安装包,或者通过适合您的操作系统的打包系统程序来安装。计算机硬件的功能划分很重要。
通常集群的一台计算机被指定为NameNode节点,其中的另一台作为ResourceManager。这些是master节点。其它服务(比如Web App Proxy Server和MapReduce Job History Server)要么运行在专用硬件上,要么运行在共享设备上,这取决于装载方式。
集群中的其它计算机既作为DataNode节点,又作为NodeManger节点。它们是从节点。
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。
此外,你可以通过etc/hadoop/hadoop-env.sh和etc/hadoop/yarn-env.sh设置特定站点的参数值,来操作分布式环境中bin/目录下的Hadoop脚本。
要配置Hadoop集群,你需要配置Hadoop守护进程运行的环境,以及Hadoop守护进程运行的参数。
HDFS守护进程包括NameNode、SecondaryNameNode和DataNode。YARN守护进程包括ResourceManager、NodeManager和WebAppProxy。如果使用MapReduce,那么MapReduce Job History Server也会运行。对于大型的集群安装,这些服务通常运行在独立的主机节点上。
管理员可以使用 etc/hadoop/hadoop-env.sh脚本,并根据需要配置 etc/hadoop/mapred-env.sh或etc/hadoop/yarn-env.sh脚本,来实现Hadoop守护进程运行的特定站点环境的客户化配置。
至少,你必须确保每个远程节点上JAVA_HOME是正确的。
管理员可以使用下表的配置项配置每一个独立的守护进程:
守护进程 | 环境变量 |
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。 它用来配置守护进程的堆大小。默认大小为1000MB。你可以使用它为每个守护进程配置各自的堆大小。
大多数情况下,你应当指定HADOOP_PID_DIR和HADOOP_LOG_DIR目录,这两个目录只能被运行hadoop守护进程的用户写入。否则就会存在潜在的符号连接攻击。
通常,我们会在系统范围的shell环境中配置HADOOP_PREFIX变量。比如,在/etc/profile.d增加一段简单的脚本:
HADOOP_PREFIX=/path/to/hadoop
export HADOOP_PREFIX
各守护进程的堆大小配置变量如下:
守护进程 | 环境变量 |
ResourceManager | YARN_RESOURCEMANAGER_HEAPSIZE |
NodeManager | YARN_NODEMANAGER_HEAPSIZE |
WebAppProxy | YARN_PROXYSERVER_HEAPSIZE |
Map Reduce Job History Server | HADOOP_JOB_HISTORYSERVER_HEAPSIZE |
本小节介绍如何在给定的配置文件中指定重要参数的值:
- etc/hadoop/core-site.xml
参数 | 值 | 备注 |
fs.defaultFS | NameNode URI | hdfs://host:port/ |
io.file.buffer.size | 131072 | SequenceFiles中使用的读/写缓存大小。 |
- etc/hadoop/hdfs-site.xml
- NameNode配置:
参数 | 值 | 备注 |
dfs.namenode.name.dir | NameNode存储命名空间和事务日志持久化数据的本地文件系统路径。 | 如果此值为一个逗号分隔的目录列表,那么名称表将会冗余的复制到所有目录下。 |
dfs.hosts/dfs.hosts.exclude | 被允许/排除的DataNodes列表。 | 如果需要,使用这些文件控制允许的数据节点列表。 |
dfs.blocksize | 268435456 | 对于大型文件系统,设置HDFS块大小为256M。 |
dfs.namenode.handler.count | 100 | 更多的NameNode服务器线程处理来自大量DataNode节点的RPC。 |
- DataNode配置:
参数 | 值 | 备注 |
dfs.datanode.data.dir | 以逗号分隔的DataNode存储数据块的本地文件路径列表。 | 如果此值为逗号分隔的目录列表,则数据将被存储在所有被指定的目录中,这些目录通常分布在不同的设备上。 |
- etc/hadoop/yarn-site.xml
- ResourceManager和NodeManager配置:
参数 | 值 | 备注 |
yarn.acl.enable | true/false | 使ACL有效,默认为false。 |
yarn.admin.acl | 管理ACL | 设置ACL在集群上的管理员。管理ACL是以逗号分隔的用户列表+逗号分隔的用户组列表(空格分隔)。默认值为*,表示所有用户。如果为空格,则意为着没有用户可以访问。 |
yarn.log-aggregation-enable | false | 启用或禁用日志聚合。 |
- ResourceManager配置:
参数 | 值 | 备注 |
yarn.resourcemanager.address | 客户端提交任务的ResourceManager访问地址和端口: host:port。 | 如果host:port被设置,将覆盖yarn.resourcemanager.hostname的主机名设置。 |
yarn.resourcemanager.scheduler.address | ApplicationMaster与Scheduler通讯获取资源的ResourceManager访问地址和端口: host:port。 | 如果host:port被设置,将覆盖yarn.resourcemanager.hostname的主机名设置。 |
yarn.resourcemanager.resource-tracker.address | NodeManager的ResourceManager访问地址和端口:host:port。 | 如果host:port被设置,将覆盖yarn.resourcemanager.hostname的主机名设置。 |
yarn.resourcemanager.admin.address | 执行管理命令的ResourceManager访问地址和端口: host:port。 | 如果host:port被设置,将覆盖yarn.resourcemanager.hostname的主机名设置。 |
yarn.resourcemanager.webapp.address | web-ui 的ResourceManager访问地址和端口:host:port。 | 如果host:port被设置,将覆盖yarn.resourcemanager.hostname的主机名设置。 |
yarn.resourcemanager.hostname | ResourceManager主机。 | 可以用单个主机名来代替设置所有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 | 每个容器请求Resource Manager时可分配的内存最小值。 | 以MB为单位 |
yarn.scheduler.maximum-allocation-mb | 每个容器请求Resource Manager时可分配的内存最大值。 | 以MB为单位 |
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path | 被允许或排除的NodeManager列表。 | 如果需要可以使用这些配置控制允许的NodeManager列表。 |
- NodeManager配置:
参数 | 值 | 备注 |
yarn.nodemanager.resource.memory-mb | 资源,即给定NodeManager 的可用物理内存(MB) | 定义NodeManager 上用于运行容器的全部可用资源。 |
yarn.nodemanager.vmem-pmem-ratio | 任务使用的虚拟内存可以超过物理内存的比例 | 每一个人物可以使用的虚拟内存与其物理内存的比例受此参数限制。NodeManager上任务使用的虚拟内存的合计与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 | 需要为Map Reduce应用程序设置的Shuffle service。 |
- History Server配置(需要转移到其它地方):
参数 | 值 | 备注 |
yarn.log-aggregation.retain-seconds | -1 | 在删除聚合日志前,它们可以保留的时间。-1不删除聚合日志。需要注意的是,如果设置的太小,将名称节点发送垃圾邮件。 |
yarn.log-aggregation.retain-check-interval-seconds | -1 | 检查聚合日志保留的时间间隔。如果设置为0或负值,时间间隔将为聚合日志保留时间的1/10。需要注意的是,如果设置的太小,将名称节点发送垃圾邮件。 |
- etc/hadoop/mapred-site.xml
- MapReduce应用程序配置:
参数 | 值 | 备注 |
mapreduce.framework.name | yarn | Hadoop YARN的执行框架。 |
mapreduce.map.memory.mb | 1536 | Map的最大资源数(MB)。 |
mapreduce.map.java.opts | -Xmx1024M | Map的子JVM 最大的heap-size值。 |
mapreduce.reduce.memory.mb | 3072 | Reduce的最大资源数(MB)。 |
mapreduce.reduce.java.opts | -Xmx2560M | Reduce的子JVM 最大的heap-size值。 |
mapreduce.task.io.sort.mb | 512 | 数据排序性能有关的最大内存数(MB)。 |
mapreduce.task.io.sort.factor | 100 | 文件排序时,合并流的数量。 |
mapreduce.reduce.shuffle.parallelcopies | 50 | Reduce从大量Map获取输出时,可运行的最大并行拷贝数量。 |
- MapReduce JobHistory Server配置:
参数 | 值 | 备注 |
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 Server管理的历史文件路径。 |
Hadoop提供一种机制,通过这种机制管理员可以配置NodeManager定期运行管理员提供的脚本,来检查各节点的是否正常。
管理员可以通过他们在脚本中设置的检查方法明确节点是否健康。如果脚本发现节点处于不健康的状态,它应当打印一行带有“ERROR”的错误信息到标准输出设备。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 | 节点健康脚本运行超时的时长 | 节点健康脚本运行超时的时长 |
如果只有部分本地磁盘损坏,健康检查脚本并不会给出预期的“ERROR”错误。NodeManager能够定期检查本地磁盘的健康状况(具体检查nodemanager-local-dirs和nodemanager-log-dirs),当损坏目录达到yarn.nodemanager.disk-health-checker.min-healthy-disks属性设置的阈值后,整个节点会被标注为非健康状态,并且这个信息也会被发送到ResourceManager。健康检查脚本也会检查并识别引导磁盘的损坏情况。
在etc/hadoop/slaves文件中会列出所有的slave节点的主机名或IP地址,每个占一行。Helper脚本(如下所述)将根据etc/hadoop/slaves文件的配置,同时在多个主机上运行命令。这种方式并不被基于Java配置的Hadoop采用。如果想要采用这种机制,Hadoop运行时,必须建立ssh账户信任(要么通过免密的ssh或者其他方式,如Kerberos)。
大多数Hadoop组件有机架意识,并利用网络拓扑结构提高性能和安全性。Hadoop守护进程通过调用一个管理员配置模块来获取集群从节点的机架信息。有关更多具体信息,请参阅Rack Awareness文档。
强烈建议在启动HDFS前配置机架感知。
Hadoop使用Apache log4j通过Apache Commons Logging记录日志。编辑etc/hadoop/log4j.properties文件实现Hadoop守护进程的日志自定义配置(如日志格式等)。
一旦所有必须的配置完成,并将配置文件分发到所有节点机器的HADOOP_CONF_DIR目录。这个目录应当时所有节点机器上的同一目录。
通常情况下,HDFS和YARN建议作为独立的用户运行。在大多数安装中,HDFS进程以‘hdfs’用户运行,YARN通常使用‘yarn’账户运行。
启动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
使用hdfs用户在每一个指定的节点上执行以下命令,启动HDFS DataNode。
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs start datanode
如果配置了etc/hadoop/slaves和ssh信任访问(参见单节点安装),hdfs用户可以通过一个应用脚本启动所有的HDFS进程。
[hdfs]$ $HADOOP_PREFIX/sbin/start-dfs.sh
使用yarn用户在设定的ResourceManager上通过以下命令启动YARN。
[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
以yarn用户在WebAppProxy服务器上运行以下命令,启动一个独立的WebAppProxy服务。如果使用多个服务器进行负载均衡,则应在每个服务器上运行。
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start proxyserver
如果配置了etc/hadoop/slaves和ssh信任访问(参见单节点安装),yarn用户可以通过一个应用脚本启动所有的YARN进程。
[yarn]$ $HADOOP_PREFIX/sbin/start-yarn.sh
在设定的服务器上,使用mapred用户通过以下命令启动MapReduce JobHistory Server。
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR start historyserver
使用hdfs用户在指定的NameNode节点上运行以下命令,停止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信任访问(参见单节点安装),hdfs用户可以通过一个应用脚本停止所有的HDFS进程。
[hdfs]$ $HADOOP_PREFIX/sbin/stop-dfs.sh
使用yarn在指定的ResourceManager上运行以下脚本,停止ResourceManager。
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop resourcemanager
使用yarn用户运行以下脚本停止从NodeManager。
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR stop nodemanager
如果配置了etc/hadoop/slaves和ssh信任访问(参见单节点安装),yarn用户可以通过一个应用脚本停止所有的YARN进程。
[yarn]$ $HADOOP_PREFIX/sbin/stop-yarn.sh
使用yarn用户在WebAppProxy服务器上运行以下脚本,停止WebAppProxy服务器。如果使用多个服务器进行负载均衡,则应在每个服务器上运行。
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop proxyserver
使用mapred用户在指定的服务器上运行以下命令,停止MapReduce JobHistory Server。
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR stop historyserver
一旦Hadoop集群启动,可通过以下组件中的web界面进行检查:
守护进程 | Web网址 | 备注 |
NameNode | http://nn_host:port/ | 默认HTTP端口为50070。 |
ResourceManager | http://rm_host:port/ | 默认HTTP端口为8088。 |
MapReduce JobHistory Server | http://jhs_host:port/ | 默认HTTP端口为19888。 |