目的
本文档描述了如何安装、 配置和管理完全分布式 Hadoop 集群从几个节点到数千个节点的群集。
要使用 Hadoop,可能首先要在一台机器上安装 Hadoop (见单个节点安装).
安装 Hadoop 集群通常涉及在群集中的所有机器上解压Hadoop安装包。
通常,集群中的一台机器被指定为机作为NameNode,另一台指定为JobTracker。这些都是master。在集群中的其余计算机担任DataNode 和 TaskTracker这两个角色。这些都是slave.
安装包的的根目录被称为HADOOP_HOME。在群集中的所有机器通常都有相同的HADOOP_HOME路径。
以下各节描述了如何配置 Hadoop 集群。
Hadoop 配置是由两种类型的重要配置文件驱动的:
- 只读默认配置-
src/mapred/mapred-default.xml.
- site特定的配置-
conf/核心-site.xml、
conf/hdfs-site.xml、
conf/mapred-site.xml.
若要了解有关这些配置文件如何控制Hadoop 框架的详细信息,请看这里.
此外,您通过设置特定于站点的值通过conf/hadoop-env.sh控制$HADOOP_HOME/bin/下的脚本来控制Hadoop集群,.
要配置 Hadoop 集群,你需要配置环境变量,这个用于Hadoop 守护程序执行以及用于 Hadoop 守护程序的配置参数。
Hadoop 守护程序有NameNode/DataNode和JobTracker/TaskTracker.
配置 Hadoop 守护程序的环境
管理员应该使用conf/hadoop-env.sh脚本来自定义 Hadoop 守护程序进程环境。
至少你应该指定JAVA_HOME ,以便正确定义它在每个远程节点上。
在大多数情况下,还应为HADOOP_PID_DIR指定一个只有运行Hadoop守护线程的用户可以写入的目录。否则有符号链接攻击的可能性。
管理员可以配置个别守护程序使用的配置选项HADOOP_ * _OPTS。更多可用的选项如下表中所示。
守护进程 | 配置选项 |
NameNode | HADOOP_NAMENODE_OPTS |
DataNode | HADOOP_DATANODE_OPTS |
SecondaryNamenode | HADOOP_SECONDARYNAMENODE_OPTS |
JobTracker | HADOOP_JOBTRACKER_OPTS |
TaskTracker | HADOOP_TASKTRACKER_OPTS |
例如,要配置 Namenode 使用 parallelGC,下面的声明语句应将添到conf/hadoop_env.sh :
export HADOOP_NAMENODE_OPTS ="-XX: + UseParallelGC ${HADOOP_NAMENODE_OPTS}"
其它你可以配置的有用参数如下:
- HADOOP_LOG_DIR -守护程序的日志文件的存储位置的目录。它们将自动创建的如果它们不存在。
- HADOOP_HEAPSIZE-可以使用的最大内存,以 mb 为单位。这个可以配置Hadoop守护进程的堆内存大小。默认情况下,值是1000 MB.
这一节涉及重要的参数,如下:
conf/core-site.xml:
参数 | 价值 | 备注 |
fs.default.name | NameNode的 URI. | hdfs://hostname/ |
conf/hdfs-site.xml:
参数 | 价值 | 备注 |
dfs.name.dir | NameNode在本地存储命名空间和事务日志的目录。 | 如果这是一个以逗号分隔的目录列表,命名空间表复制到所有目录,以实现冗余。 |
dfs.data.dir | 以逗号分隔的本地目录。DataNode存储block的位置。 | 如果这是一个以逗号分隔的目录列表,那么数据将存储到所有的目录,通常在不同的设备中存储的数据,以提高读写速度等性能。 |
conf/mapred-site.xml:
参数 | 价值 | 备注 |
mapred.job.tracker | JobTracker的主机名或IP和端口的. | 主机:端口。 |
mapred.system.dir | MapReduce 框架在hdfs上存储系统文件的位置,如:/ hadoop/mapred/system | 这是默认文件系统 (HDFS) 中,必须可从服务器和客户机访问。 |
mapred.local.dir | MapReduce 的临时数据写入的位置在本地文件系统路径的用逗号分隔的列表。 | 多个路径提高磁盘 i/o 的性能。 |
mapred.tasktracker。{map|reduce}.tasks.maximum | MapReduce 任务,是在同时运行给定的TaskTracker,分别最大数目。 | 默认值为 2 (2 地图和 2 减少了),但这取决于您的硬件。 |
dfs.hosts/dfs.hosts.exclude | 允许排除 DataNodes 的列表。 | 如有必要,可使用这些文件来控制允许 datanodes 的列表。 |
mapred.hosts/mapred.hosts.exclude | 允许排除 TaskTrackers 的列表。 | 如有必要,可使用这些文件来控制允许 TaskTrackers 的列表。 |
mapred.queue.names | 以逗号分隔的可以将作业提交到队列的列表。 | MapReduce 系统始终支持至少一个队列名称为默认值。因此,此参数的值应始终包含字符串的默认值。如 Hadoop Capacity Scheduler,像一些作业调度程序支持多个队列。如果使用的此类计划程序,则必须在此处指定配置的队列名称的列表。一旦定义了队列,用户可以将作业提交到队列的工作配置中使用属性名称mapred.job.queue.name 。可能由调度程序管理的单独的配置文件来配置这些队列的属性。请参阅对同一信息的调度程序的文档。 |
mapred.acls.enabled | 布尔值,指定是否为授权用户来做队列操作和作业工序做检查队列 Acl 和作业的 Acl。 | 如果真实,队列 Acl 检查时提交和管理工作岗位及作业 Acl 检查中是否有授权查看和修改的工作岗位。使用窗体定义的mapred.queue.queue-name.acl-名称,下面根据 mapred-队列-acls.xml 的配置参数指定队列的 Acl。在作业授权描述作业 Acl |
conf/mapred-queue-acls.xml
参数 | 价值 | 备注 |
mapred.queue.queue-name.acl- submit-job | 列表中的用户和组,可以将作业提交到指定的队列名称. | 用户和组的列表中有两个名称的逗号分隔列表。由空白分隔两个列表。示例: user1、 user2 group1,group2。如果您希望定义只有组的列表,提供的值开头的空白。 |
mapred.queue.queue-name.acl- administer-jobs | 列表中的用户和组,可以查看作业的详细信息、 更改优先级或杀到指定的队列名称已提交的作业. | 用户和组的列表中有两个名称的逗号分隔列表。由空白分隔两个列表。示例: user1、 user2 group1,group2。如果您希望定义只有组的列表,提供的值开头的空白。请注意作业的所有者始终可以更改优先级,或杀了自己工作,不论 Acl。 |
通常上面的所有参数由用户应用程序被都标记为最终以确保他们不能被重写。
本节列出了一些已被用于非常大的集群上运行的排序基准的非默认配置参数。
- 用于运行 sort900,这就是 9 TB 数据排序在 900 节点群集上的一些非默认配置值:
配置文件 | 参数 | 价值 | 备注 |
conf/hdfs-site.xml | dfs.block.size | 134217728 | HDFS 块大小为 128 MB 的大型文件系统。 |
conf/hdfs-site.xml | dfs.namenode.handler.count | 40 | 更多 NameNode 服务器的线程来处理大量的 DataNodes 从 Rpc。 |
conf/mapred-site.xml | mapred.reduce.parallel.copies | 20 | Reduce并行拷贝map输出的数量。 |
conf/mapred-site.xml | mapred.map.child.java.opts | -Xmx512M | Map jvm堆大小。 |
conf/mapred-site.xml | mapred.reduce.child.java.opts | -Xmx512M | Reduce jvm堆大小。 |
conf/core-site.xml | fs.inmemory.size.mb | 200 | Reduce端合并map文件输出的的内存大小 |
conf/core-site.xml | io.sort.factor | 100 | 一次合并时打开的文件流 |
conf/core-site.xml | io.sort.mb | 200 | Reduce端数据排序时的内存限制 |
conf/core-site.xml | io.file.buffer.size | 131072 | 在 SequenceFiles 中使用读/写缓冲区的大小。 |
- 要运行 sort1400 和 sort2000,这就是 14 TB 的数据对 1400年节点和 20 TB 的排序 2000年节点上的数据进行排序的一些配置值的更新:
配置文件 | 参数 | 价值 | 备注 |
conf/mapred-site.xml | mapred.job.tracker.handler.count | 60 | 更多 JobTracker 服务器的线程来处理大量的 TaskTrackers 的Rpc请求。 |
conf/mapred-site.xml | mapred.reduce.parallel.copies | 50 | |
conf/mapred-site.xml | tasktracker.http.threads | 50 | TaskTracker 的 http 服务器的工作线程数。使用 http 服务器通过reduce取中间的map输出。 |
conf/mapred-site.xml | mapred.map.child.java.opts | -Xmx512M | Map jvm 的大小。 |
conf/mapred-site.xml | mapred.reduce.child.java.opts | -Xmx1024M | Reduce jvm 的大小。 |
Hadoop MapReduce 框架中的类定义了用户提交的map、reduce任务是如何发起和控制的。他们可以用于需要一些自定义启动或控制用户任务的过程的集群中。例如,在某些群集中,可能有一项要求,用户需要作为提交作业的用户运行任务,而不是作为任务跟踪用户,这是任务,默认情况下的启动方式的用户运行的任务。本节描述如何配置和使用任务控制器。
下面的任务控制器是在 Hadoop 中可用。
名称 | 类名称 | 说明 |
DefaultTaskController | org.apache.hadoop.mapred.DefaultTaskController | 此默认任务控制器,Hadoop 使用来管理任务的执行。任务任务跟踪系统用户的身份运行。 |
LinuxTaskController | org.apache.hadoop.mapred.LinuxTaskController | 此任务控制器,仅在 Linux 中支持,作为提交作业的用户运行的任务。它要求在发射任务的地方在群集节点上创建这些用户帐户。它使用一个 setuid 可执行文件包含在 Hadoop 分布中。任务跟踪程序使用此可执行文件,启动并杀了任务。Setuid 可执行文件切换到的用户的已提交作业和发射或杀死任务。为了安全起见,此任务控制器设置受限制的权限和用户/组的本地文件和使用的任务如作业 jar 文件、 中间文件、 任务日志文件和分布式的缓存文件的目录的所有权。特别注意到因此,除了作业所有者和 tasktracker,没有其他用户可以访问的任何本地文件/目录包括那些作为分布式缓存的一部分进行本地化。 |
可以通过设置以下键的值在 mapred-site.xml 配置任务控制器,用于
属性 | 价值 | 备注 |
mapred.task.tracker.task 控制器 | 任务控制器类的完全限定的类名称 | 目前有两种实现方式的任务控制器在 Hadoop 系统中,DefaultTaskController 和 LinuxTaskController。请参阅上文所述,以确定要选择的类设置的值的类名称。 |
文档的本节描述使用 LinuxTaskController 所需的步骤。
若要使用 LinuxTaskController,可执行 setuid 应建,并在计算节点上部署。可执行文件命名为任务控制器。若要生成可执行文件,执行ant 任务-控制器-Dhadoop.conf.dir=/path/to/conf/dir.在传递路径-Dhadoop.conf.dir应会在哪一个配置文件的可执行 setuid 在群集节点上的路径。可执行文件将建到build.dir/dist.dir/bin和应安装到$HADOOP_HOME/bin.
可执行文件必须具有特定的权限,如下所示。可执行文件应该有6050 或 — — Sr-s--- root(super-user) 由拥有用户和组由一个特别小组,其中 TaskTracker 的用户是组成员和没有作业提交者是拥有的权限。如果任何作业提交者属于此特殊的组,将危及安全。应为配置属性"mapreduce.tasktracker.group"在 mapred site.xml 和任务 controller.cfg指定此特殊的组的名称。例如,让我们说 TaskTracker 作为用户mapred是组用户和specialGroup的一部分运行它们都主要组。让也是该用户有mapred和另一个用户 (作业提交) 作为其成员, X和 X 不属于specialGroup。去由上面的描述,应设置的 setuid setgid 可执行文件6050 或 — — Sr-s---与mapred和specialGroup有mapred作为其成员 (和不用户作为其成员除了mapred以外也有X的组-所有者的用户-所有者).
LinuxTaskController 要求路径包括和导致目录指定在mapred.local.dir和hadoop.log.dir要设置 755 权限。
可执行文件需要一个配置文件被称为taskcontroller.cfg出现在传递给的 ant 目标,如上文所述的配置目录中。如果二进制文件不是一个具体的 conf 目录,路径默认为/path-to-binary /.../conf。组由任何人拥有和应具有的权限,必须由 root 用户,拥有配置文件0400年或 r---.
可执行文件,需要以下配置项出现在taskcontroller.cfg文件中。项目应作为简单提及键 = 值对。
名称 | 说明 |
hadoop.log.dir | Hadoop 日志目录的路径。应为 TaskTracker 启动时使用的值相同。这是必需的以便可以由用户的任务写入和读取由 TaskTracker web UI 上提供服务的日志文件设置适当的权限。 |
mapreduce.tasktracker.group | TaskTracker 所属的组。组的所有者的二进制 taskcontroller 应该是这一组。应该是相同的配置 TaskTracker 的值。这种配置都需要验证任务控制器二进制文件的安全访问。 |
Hadoop MapReduce 提供一种机制,管理员可以配置 TaskTracker 运行管理员提供脚本定期以确定节点是否健康。管理员可以确定节点是否处于健康状态,请在脚本中执行他们选择的任何检查。如果该脚本检测要处于不健康状态的节点,它必须打印到标准输出错误字符串开头的行。TaskTracker 定期生成脚本,并检查其输出。如果该脚本的输出中包含的字符串错误,如上文所述,该节点的状态报告为 '不正常' 和节点是在 JobTracker 的黑色上市。没有进一步的任务将会分配给此节点。然而,TaskTracker 继续运行脚本,这样,如果在节点再次变得健康,它将从 JobTracker 中列入黑名单的节点自动删除。该节点的健康以及脚本的输出如果是不健康的是在 JobTracker 的 web 界面,管理员可以。在 web 界面上还显示时间因为该节点是健康的。
配置节点健康检查脚本
可以使用下列参数来控制节点健康监测mapred site.xml中的脚本.
名称 | 说明 |
mapred.healthChecker.script.path | 其中由 TaskTracker 来确定节点是否是健康定期运行该脚本的绝对路径。该文件应该由 TaskTracker 可执行文件。如果此关键字的值为空或该文件不存在或不是可执行文件,则不启动节点运行状况监视。 |
mapred.healthChecker.interval | 在节点健康脚本运行时,以毫秒为单位的频率 |
mapred.healthChecker.script.timeout | 后,该节点健康脚本将被杀死 TaskTracker 如果没有响应的时间。该节点被标记为不健康。如果节点健康脚本超时。 |
mapred.healthChecker.script.args | 可以传递给该节点健康脚本启动时的额外参数。这些应该是参数的逗号分隔列表。 |
TaskTracker(TT) 可以将配置为监视内存使用情况的任务它散布这样表现不好的作业做不打倒机由于过多内存消耗量。启用监视的每个任务分配任务限制为虚拟内存 (VMEM)。此外,每个节点分配节点限制为 VMEM 用法。TT 可确保一项任务杀了,如果它,和它的后裔,超过了该任务的每个任务限制使用 VMEM。它还确保一个或多个任务杀如果总和的 VMEM 使用的所有任务和他们的后裔,跨节点限制。
用户也可以 (可选) 指定 VMEM 任务限制每个作业。如果没有这种限制提供的则使用默认限制。每节点,可以设置一个节点限制。
目前在 Linux 平台只支持内存监测和管理。
若要启用监控的 TT,所有的下列参数需要设置:
名称 | 类型 | 说明 |
mapred.cluster.map.memory.mb mapred.cluster.reduce.memory.mb | 长 | 在虚拟内存中,在地图减少使用的框架,在计划程序中的单个地图减少槽的大小。通过 mapred.job.map.memory.mb/mapred.job.reduce.memory.mb,mapred.cluster.max.map.memory.mb/mapred.cluster.max.reduce.memory.mb,由指定如果调度程序支持该功能的限制单个任务的多个插槽可以要求一份工作。值为-1 指示关闭此功能。 |
mapred.job.map.memory.mb mapred.job.reduce.memory.mb | 长 | 一个数字,以字节为单位,表示默认 VMEM 任务-限制与地图/减少任务相关联。除非重写的作业设置,此数字定义 VMEM 任务限制。这些属性替换旧弃用的属性, mapred.task.default.maxvmem. |
mapred.cluster.max.map.memory.mb mapred.cluster.max.reduce.memory.mb | 长 | 一个数字,以字节为单位,代表 VMEM 任务-上限与地图/减少任务相关联。用户,他们的任务,VMEM 任务限制在指定时不应指定超过这一数额的限制。这些属性替换旧弃用的属性, mapred.task.limit.maxvmem. |
此外,还可以配置以下参数。
名称 | 类型 | 说明 |
mapred.tasktracker.taskmemorymanager.monitoring 间隔 | 长 | 时间间隔,以毫秒为单位,之间的 TT 检查的任何内存冲突。默认值为 5000 毫秒 (5 秒)。 |
这里是如何对 TT 内存监测工作。
- 如果一个或多个以上所述的配置参数丢失或指定-1,为 TT 禁用内存监视。
-
定期,TT 检查以下内容:
- 如果任何任务的当前 VMEM 使用率大于 VMEM 任务限制该任务的任务杀了和理由杀人任务在任务 diagonistics 中记录。这项任务被视为失败,即杀害计数实现该任务的失败计数。
- 如果使用的所有任务和后代的 VMEM 的总和大于节点限制,TT 杀死足够的任务,按至少取得的进展,直到整体的 VMEM 使用率低于节点限制。这种被杀死的任务不是失败,他们杀人不计入任务的失败计数。
调度程序可以选择纾缓监测压力 TT 由防止太多的任务在一个节点上运行和调度任务只有 TT 有足够 VMEM 免费。此外,计划程序可以选择考虑的物理内存 (RAM),以及在节点上可用。要启用调度程序支持,TTs 报告其内存设置到 JobTracker 中每一次心跳。
TT 报告中每一次心跳与内存相关的下列数字:
- 总的 VMEM 在节点上可用。
- 其余的 VMEM 在节点上可用。
- 在节点上可用的内存总量。
- 在节点上可用的 RAM 剩余。
通常您在群集中,作为NameNode和一台机器专门作为JobTracker,选择一台机器。机器的其余部分作为DataNode和TaskTracker和被称为slave.
列出所有slave的主机名或 IP 地址在conf/slaves文件中,每行一个。
Hadoop 使用Apache log4j通过Apache 共同性日志记录框架进行日志记录。编辑conf/log4j.properties文件,若要自定义的 Hadoop 守护程序的日志记录配置 (日志格式和等等)。编辑 conf/任务-log4j.properties 文件以自定义日志记录配置为 MapReduce 任务。
作业历史记录文件都存储在中央位置hadoop.job.history.location ,可以在 DFS 也,其默认值是${HADOOP_LOG_DIR} / 历史。从作业跟踪器 web UI 访问历史记录 web 用户界面。
历史记录文件也记录到用户指定默认为作业输出目录的目录hadoop.job.history.user.location 。这些文件存储在"_logs/历史 /"中指定的目录。因此,在默认情况下他们会是在"mapred.output.dir/_logs/history/"。用户可以通过hadoop.job.history.user.location给的值都不停止日志记录
用户可以查看历史记录日志摘要中指定的目录,使用下面的命令
元斌/hadoop 作业-历史输出-目录
此命令将打印作业的详细信息,失败和被杀提示的详细信息。
可以使用下面的命令查看更多详细信息如成功任务和所作的每个任务的任务尝试作业
元斌/hadoop 作业-历史上所有输出 dir
一旦完成所有必要的配置,通常分发到HADOOP_CONF_DIR目录中所有的机器上的文件${HADOOP_HOME} / conf.
如果mapred.jobtracker.restart.recover设置为 true,并且启用了JobHistory 测井作业跟踪器重新启动可以恢复正在运行的作业。此外mapred.jobtracker.job.history.block.size值应设置为最优值转储作业历史记录到磁盘尽快尽可能,典型的值是 3145728(3MB)。
机架意识到 HDFS 和地图/减少组件。
NameNode和JobTracker 机架 id在群集中的黑奴通过获取调用 API解决管理员配置模块中。API 将奴隶的 DNS 名称 (还 IP 地址) 解析为一个机架 id。可以使用配置项topology.node.switch.mapping.impl配置要使用哪些模块。相同的默认实现将运行的脚本命令使用topology.script.file.name配置。如果未设置 topology.script.file.name,机架 id /default-rack被返回传递的任何 IP 地址。在地图/减少一部分额外的配置是mapred.cache.task.levels ,确定的级别 (在网络拓扑结构) 的缓存的数。因此,例如,如果它是默认值为 2,两个级别的缓存将建造-一个用于主机 (主机-> 任务映射),另一个用于机架 (机架-> 任务映射)。
要启动一个 Hadoop 群集将需要启动的 HDFS 和map/reduce群集。
设置新的分布式文件系统的格式:
bin/hadoop namenode -format
用下面的命令,对指定NameNode运行启动 HDFS:
bin/start-dfs.sh
Bin/start-dfs.sh脚本还协商${HADOOP_CONF_DIR} / slaves NameNode上的文件和启动DataNode守护程序上所有列出的slave。
用下面的命令,对指定的JobTracker运行开始map/reduce:
bin/start-mapred.sh
Bin/start-mapred.sh脚本还协商${HADOOP_CONF_DIR} / slave JobTracker上的文件和启动TaskTracker守护进程上所有列出的slave。
用下面的命令,对指定NameNode运行停止 HDFS:
bin/stop-dfs.sh
Bin/stop-dfs.sh脚本还协商${HADOOP_CONF_DIR} / slaves NameNode上的文件和停止DataNode守护程序上所有列出的slave。
用下面的命令,对指定运行指定的JobTracker停止map/reduce:
bin/stop-mapred.sh
Bin/stop-mapred.sh脚本还协商${HADOOP_CONF_DIR} / slaves JobTracker上的文件和停止TaskTracker守护进程上所有列出的slave。