Apache Hadoop 2.7.1 集群安装
目的
此文档描述怎样安装和配置Hadoop集群,包括少数的节点到成千上万个节点的庞大集群。要使用Hadoop,您首先要学会安装单机模式(单机模式安装请查看单机模式设置文档)。
此文档内容不包括安全性或高可用性等高级教程。
先决条件
·安装并配置好jdk1.7环境变量。
·从Apache官网下载一个稳定的Hadoop版本。
安装
安装Hadoop集群通常需要通过操作系统上的解压缩工具解压Hadoop软件安装包到所有集群的计算机上。需要注意的是分配好您计算机硬件的存储空间和性能。
在集群中,通常有一台计算机被配置安装为NameNode(主节点),另外一台计算机作为专门的ResourceManager。这就是Master。其他服务(例如web应用程序代理服务器和MapReduce作业日志记录服务器)通常要么在专用的硬件设施上运行,要么在共享负载设施上运行。
其他计算机主要作为DataNode(从节点)和NodeManager。这就是slave。
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目录下自定义修改etc/hadoop/hadoop-env.sh和etc/hadoop/yarn-env.sh两个脚本通过它们来控制Hadoop。
配置Hadoop集群环境您将需要配置Hadoop程序执行环境,还要配置Hadoop程序的各个参数。
HDFS程序是由NameNode,SecondaryNameNode和DataNode进程组成。YARN程序则是由ResourceManager,NodeManager和WebAppProxy进程组成。如果MapReduce被使用,那么MapReduce作业历史记录服务将也会跟着运行。对于大型设施上安装的Hadoop来说,这些都是被分隔在不同的计算机上运行的。
Hadoop环境配置
管理员应该通过设置etc/hadoop/hadoop-env.sh、etc/hadoop/mapred-env.sh以及etc/hadoop/yarn-env.sh脚本信息来制定自己的Hadoop运行环境。
最起码,您必须在各个远程节点上正确的指定JAVA_HOME。
管理员可以通过以下表格中显示的参数配置自己需要的Hadoop程序:
进程 | 环境变量 |
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 |
如下所示,在hadoop-env.sh中添加声明配置 NameNode使用parallelGC:
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的输出位置,这将会使它们只能以到运行hadoop程序的用户权限输出到指定的位置。否则将可能会受到符号链接试的攻击。
HADOOP_PREFIX这个参数是Hadoop在系统中默认的配置也是使用传统的配置方式。例如,将以下简单的两行代码配置到/etc/profile文件中:
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 |
配置Hadoop进程
以下是列出在给出的配置文件指定重要的参数:
·etc/hadoop/core-site.xml
参数 | 值 | 描述 |
fs.defaultFS | NameNode URL | hdfs://host:port |
Io.file.buffer.size | 131072 | IO的缓冲区大小单位kb |
·etc/hadoop/hdfs-site.xml
·NameNode配置:
参数 | 值 | 描述 |
dfs.namenode.name.dir | 操作日志和名称控件存储路径 | 多个路径可以使用逗号分隔 |
dfs.hosts/dfs.hosts.exclude | DataNode白名单或黑名单信息 | 如果有必要,使用这些文件来控制允许连接的DataNode |
dfs.blocksize | 268435456 | 这个数字代表大规模的HDFS文件系统中block大小为256MB |
dfs.namenode.handler.count | 100 | NameNode处理DataNode的RPC请求的线程数量 |
·DataNode配置:
参数 | 值 | 描述 |
dfs.datanode.data.dir | 逗号分隔的每一个绝对路径分别对应一个DataNode存储block的位置。 | 如果这里是一个逗号分隔的目录,那么数据将被存储到所有指定的目录下,通常设置在不同的设备上。 |
·etc/hadoop/yarn-site.xml
·ResourceManager和NodeManager的配置:
参数 | 值 | 描述 |
yarn.acl.enable | true/false | 是否启用ACLs,默认false |
yarn.admin.acl | Admin ACL | ACL在集群中设置管理员,ACL的格式为逗号分隔用户空格逗号分隔组的形式。默认 “*”这个符号是一个表示所有人的特殊值。如果是一个空格那么表示没有任何人可以访问。 |
yarn.log.aggregation-enable | false | 配置启用或者禁用日志聚集。 |
·配置ResourceManager:
参数 | 值 | 描述 |
yarn.resourcemanager.address | ResourceManager host:port 这个地址提供客户端提交作业使用。 | 如果设置了host:port 那么它将会覆盖yarn.resourcenamager.hostname的值 |
yarn.resourcemanager.scheduler.address | ResourceManager host:port 这个地址提供资源给ApplicationMasters调度。 | 如果设置了host:port 那么它将会覆盖yarn.resourcenamager.hostname的值 |
yarn.resourcemanager.resource-tracker.address | ResourceManager host:port 提供给NodeManager | 如果设置了host:port 那么它将会覆盖yarn.resourcenamager.hostname的值 |
yarn.resourcemanager.admin.address | ResourceManager host:port 提供管理命令 | 如果设置了host:port 那么它将会覆盖yarn.resourcenamager.hostname的值 |
yarn.resourcemanager.webapp.address | ResourceManager web-ui host:port | 如果设置了host:port 那么它将会覆盖yarn.resourcenamager.hostname的值 |
yarn.resourcenamager.hostname | ResourceManager服务地址 | 只设置这个hostname的地址,就可以设置到所有yarn.resourcemanager*address所有值。默认的端口自然就作为ResourceManagerger各个组件的通道。 |
yarn.resourcemanager.scheduler.class | ResourceManager Scheduler class | CapacityScheduler(推荐),FairScheduler(推荐)或FifoScheduler |
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访问权限 |
配置NodeManager:
参数 | 值 | 描述 |
yarn.nodemanager.resource.memory-mb | 即:分配给NodeManager的实际物理内存,单位MB。 | 定义NodeManager运行容器实际可用的资源总量。 |
yarn.nodemanager.vmem-pmem-ratio | 这个数值代表的是虚拟内存使用率,即:任务所使用内存的百分比,默认值为2.1倍。 | 根据任务在NodeManager中所使用的虚拟内存可能会超过物理内存使用的比例,通过这个比例来限制虚拟内存可能会超过每个任务所使用的物理内存。 |
yarn.nodemanager.local-dirs | 此处填写本地文件系统路径,多个路径之间使用逗号进行分隔。 | 多个路径有助于分散磁盘的IO |
yarn.nodemanager.log-dirs | 此处填写本地文件系统路径,多个路径之间使用逗号进行分隔。 | 多个路径有助于分散磁盘的IO |
yarn.nodemanager.log.retain-seconds | 10800 | 日志文件在NodeManager保留的默认时间,它仅在log-aggregation被禁用的时候有效。 |
yarn.nodemanager.remote-app-log-dir | /logs | 运用程序执行完成的日志被移动到的HDFS的目录。 |
yarn.nodemanager.remote-app-log-dir-suffix | /logs | 被追加到远程的日志路径。日志将被汇聚到${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam} ,仅在log-aggregation被启用时有效。 |
yarn.nodemanager.aux-services | mapreduce_shuffle | 需要给Map Reduce应用程序设置的Shuffle服务。 |
·日志记录服务器配置(例如需要转移日志到别处去):
参数 | 值 | 描述 |
yarn.log-aggregation.retain-seconds | -1 | 这些汇聚的日志在删除之前需要保留多长时间。-1表示禁用,注意:此处设置太小将会给NameNode发送垃圾信息。 |
yarn.log-aggregation.retain-check-interval-seconds | -1 | 检查汇总日志保留时间的时间,如果设置为0或者是负数,那么将被计算为汇聚日志保留时间的十分之一。注意:此处设置太小将会给NameNode发送垃圾信息。 |
·etc/hadoop/mapred-site.xml
·MapReduce应用程序配置:
参数 | 值 | 描述 |
mapreduce.framework.name | yarn | 为Hadoop Yarn设置一个可执行的framework |
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从非常大的map输出中读取并行副本传输的数量。 |
·配置MapReduce JobHistory服务:
参数 | 值 | 描述 |
mapreduce.jobhistory.address | Host:port | 默认端口号为10020 |
mapreduce.jobhistory.webapp.address | Web 服务 Host:port | 默认端口号为19888 |
mapreduce.jobhistory.intermediate-done-dir | /mr-history/tmp | 此目录为MapReduce作业运行日志的存储路径。 |
mapreduce.jobhistory.done-dir | /mr-history/done | 此目录为通过MapReduce JobHistory 服务管理日志的存储路径。 |
NodeManager运行状态监控
Hadoop提供了一个机制,管理员可以配置NodeManager定期去运行管理员自己提供的脚本确定一个节点是否正常运行。
管理员可以通过执行检查脚本中选择任意一种方式确定某些节点运行良好。如果脚本检测到节点运行状态不好,它必须打印一行以ERROR开头的字符串。NodeManager有自己的脚本定期检测这些输出信息。如果脚本输出的字符串中包含ERROR,那么通过NodeManager将被当做以上描述的处理,对应的节点被通知为运行状态不良好同时这些节点被列入ResourceManager黑名单中。未做相关设置的任务也会做同样的处理。不过NodeManager会继续运行脚本检查运行不良的节点是否恢复正常,恢复正常的节点将会自动从ResourceManger的黑名单中移除。节点的良好状态与脚本输出是紧密联系的,如果它是不良好的就会在ResourceManager的web接口上提供给管理员信息,与此同时运行良好的节点也会显示在web接口上。
在etc/hadoop/yarn-site.xml中使用一下参数可以控制节点的健康监测脚本。
参数 | 值 | 描述 |
yarn.nodemanager.health-checker.script.path | 脚本路径 | 运行状态监测脚本 |
yarn.nodemanager.health-checker.script.opts | 脚本参数 | 根据这些参数监测运行状态 |
yarn.nodemanager.health-checker.script.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 ,整个节点不良好这个信息会发送给资源管理器。磁盘或启动盘是否发生故障由监测脚本来识别。
保存文件
所有的slave服务器名或IP地址列表在您的etc/hadoop/slaves文件中,每一行是一个。帮助脚本(下面描述)将使用etc/hadoop/slaves文件在许多主机上执行命令。它不使用任何基于java的Hadoop配置。为了使用此功能,必须使用建立ssh信任的账号运行hadoop。
Hadoop 机架感知(Rack Awareness)
许多Hadoop组件都是机架感知和对网络拓扑的性能和安全的利用。Hadoop系统服务在集群中通过调用管理员配置的模型获取机架的slaves信息。请参考机架感知文档了解更多信息。
启动HDFS(分布式文件系统)之前极力推荐您配置机架感知(rack awareness)。
日志记录
Hadoop通过Apache Commons Loggin 框架使用Apache log4j记录日志。编辑etc/log4j.properties文件自定义配置Hadoop系统服务的日志记录(例如日志格式等等)。
运行Hadoop集群
配置好所有必须的配置后,分发这些配置文件到所有Hadoop集群计算机的HADOOP_CONF_DIR (Hadoop配置文件目录)下。在所有的集群计算机上这个目录应该是相同的。
通常HDFS和YARN推荐使用不同的用户运行,大多数情况下,HDFS进程运行使用‘hdfs’,YARN使用‘yarn’这个账号。
启动Hadoop
启动一个Hadoop集群您将意味着需要启动HDFS和YARN这两个集群。
启动HDFS之前您必须格式化它。使用hdfs用户格式化一个新的分布式文件系统(HDFS):
$ HADOOP_PREFIX/bin/hdfs namenode -format <cluster_name> |
使用hdfs用户在指定的节点上使用以下命令启动HDFS NameNode:
$HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode |
使用hdfs用户在每个指定的节点上通过以下命令一个HDFS DataNode:
$HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs start datanode |
如果etc/hadoop/slaves和ssh信任(参考单机模式安装)已经配置好,那么HDFS的所有进程可以通过脚步启动,使用hdfs用户执行命令如下:
$HADOOP_PREFIX/sbin/start-dfs.sh |
使用yarn用户通过以下命令启动YARN运行在指定的ResourceManager如下:
$HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start resourcemanager |
在每个指定的主机上使用yarn用户运行脚本启动一个NodeManager
$HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR start nodemanager |
运行一个独立的WebAppProxy服务是使用yarn用户在WebAppProxy服务(WebAPPProxy设备)上运行的。如果是使用负载均衡的多个服务,那么它应该运行在每个服务器上,启动命令如下:
$HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start proxyserver |
如果etc/hadoop/slaves和ssh信任(参考单机模式安装)已经配置好,那么YARN的所有进程可以通过脚步启动,使用yarn用户执行命令如下:
$HADOOP_PREFIX/sbin/start-yarn.sh |
使用mapred用户通过以下命令启动MapReduce JobHistory Server 运行在指定的服务器上:
$HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR start historyserver |
关闭Hadoop
使用hdfs用户通过以下命令在指定的NameNode上的停止NameNode:
$HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop namenode |
使用hdfs用户运行一个脚本停止一个DataNode:
$HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs stop datanode |
如果etc/hadoop/slaves和ssh信任(参考单机模式安装)已经配置好,那么HDFS的所有进程可以通过脚步停止,使用hdfs用户执行命令如下:
$HADOOP_PREFIX/sbin/stop-dfs.sh |
使用yarn用户在指定的ResourceManager上通过以下命令停止ResourceManager:
$HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop resourcemanager |
使用yarn用户在一个slave上运行一个脚本停止一个NodeManager,如下:
$HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR stop nodemanager |
如果etc/hadoop/slaves和ssh信任(参考单机模式安装)已经配置好,那么YARN的所有进程可以通过脚步停止,使用yarn用户执行命令如下:
$HADOOP_PREFIX/sbin/stop-yarn.sh |
停止一个独立的WebAppProxy服务是使用yarn用户在WebAppProxy服务(WebAPPProxy设备)上运行的。如果是使用负载均衡的多个服务,那么它应该运行在每个服务器上,停止命令如下:
$HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop proxyserver |
使用mapred用户在指定的服务器上通过以下命令停止MapReduce JobHistory Server:
$HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR stop historyserver |
Web 接口
进程 | Web接口 | 描述 |
NameNode | http://nn_host:port | 默认端口为50070 |
ResourceManager | http://rm_host:port | 默认端口为8088 |
MapReduce JobHistory Server | http://jhs_host:port | 默认端口为19888 |