集群的拓扑结构配置:
需要实现DNSToSwitchMapping 接口。
topology.node.switch.mapping.imp1 属性实现了上述接口。
大多数只需使用ScriptBasedMapping 脚本即可。 脚本存放路径由属性topology.script.file.name控制。
Hadoop 1.x配置
hadoop-env.sh Bash脚本 记录脚本中要用到的环境变量,以运行hadoop。 比如slaves的位置记录在HADOOP_SLAVES 项中。
core-site.xml Hadoop配置xml Hadoop Core的配置项,比如HDFS,MapReduce常用的I/O设置。
hdfs-site.xml Hadoop配置xml HDFS 守护进程的配置项:namenode,辅助namenode,datanode。
mapred-site.xml Hadoop配置xml MapReduce 守护进程的配置项:jobtracker,tasktracker。
masters 文本 运行辅助namenode 的机器列表
slaves 文本 运行datanode和tasktracker的机器列表
hadoop-metrics.properties Java属性 控制如何在Hadoop上发布度量的属性。
log4j.properties Java属性 系统日志、namenode审计日志、tasktracker 子进程的任务日志的属性。
只有Jobtracker和namenode上的控制脚本能使用slaves和masters。
start-dfs.sh 脚本用于启动集群中所有的HDFS守护进程。
1.在本地机器启动一个namenode
2. 在slaves 文件中记录的各机器启动一个datanode
3. 在masters 文件中记录的所有机器上均启动一个 辅助namenode
start-mapred.sh 脚本用于启动集群中所有的MapReduce守护进程。
1. 在本地机器启动一个 jobtracker
2. 在slaves 中的各机器启动 tasktracker。
3. 此脚本不使用masters文件。
以上两个脚本都是通过hadoop-daemon.sh 来启动和终止Hadoop守护进程的。用户可自行编写脚本调用hadoop-daemon.sh 。
内存分配
默认,Hadoop为各个守护进程分配1000MB内存。
此项由hadoop-env.sh 中的 HADOOP_HEAPSIZE 参数控制。也可为各个守护进程单独设置。
一个tasktracker 能够同时运行的最大map任务数由 mapred.tasktracker.map.tasks.maximum 属性控制。
默认是2个,称为map槽的数量。
能够同时运行的最大reduce任务数由 mapred.tasktracker.reduce.tasks.maximum 属性控制。
默认也是2个,称为reduce槽的数量。
分配给每个map或reduce子任务的JVM的内存由mapred.child.java.opts属性决定。默认为-Xmx200m,即200MB。
则默认一个slaves的内存占用: datanode(1000) + tasktracker(1000) + 2*map(200) +2*reduce(200) = 2800MB
这里-Xmx200m的意思为,JVM heap的最大值,Stack空间不算。
设置Java
1.可在hadoop-env.sh 中设置JAVA_HOME 项
2.或者在shell中设置JAVA_HOME 环境变量
系统日志
在hadoop-env.sh 的HADOOP_LOG_DIR 属性中设置日志的存放地址。 默认路径为${HADOOP_HOME}/logs
我这里改成了 /var/log/hadoop
日志一共两种
1. 以 .log 为后缀,大部分应用程序日志消息都写在该日志中。 系统不删除日志。
2. 以 .out 为后缀,记录标准输出和标准错误日志。重启守护进程时系统会创建新文件记录,系统仅保留最新的5个日志文件,介于1-5,5表示最旧。
日志中的用户名称,可在hadoop-env.sh 中HADOOP_IDENT_STRING 属性更改。
SSH设置
1. 通过设置SSH的ConnectTimeout选项,重新设置连接超时设定,可减少连接宕机的等待时间。
2. StrictHostKeyChecking 设置为no,可以自动将主机键添加进已知主机,不需要确认。
3. hadoop-env.sh 中HADOOP_SSH_OPTS 环境变量还有更多设置。
配置同步
集群的各项配置文件需要同步。
1.首先需要将hadoop-env.sh 同步到集群所有的机器中。 为让所有机器都知道HADOOP_MASTER 的位置。
2.工作节点的守护进程启动后,会自动用rsync工具同步HADOOP_MASTER 和HADOOP_INSTALL 的目录。 HADOOP_MASTER是主节点HADOOP的安装目录。HADOOP_INSTALL 是本地hadoop安装目录。(rsync 是远程同步文件的命令,只同步不相同的文件。)
3.当大集群同时rsync主节点,为避免主节点瘫痪,可设置HADOOP_SLAVE_SLEEP 让工作节点休眠一会。
4. 如果hadoop-env.sh 没有设置HADOOP_MASTER 则工作节点不会使用rsync来同步。
配置API读取
1.一个Configuration类的实例代表配置属性及其取值的一个集合。
2.Configuration从资源XML中读取其属性值。允许为XML没有定义的属性指定默认值。
3.之后添加的属性会覆盖之前定义的属性。被标记为final的属性不能被后面的定义所覆盖。
4.如果配置文件XML不在默认HADOOP_INSTALL/conf 目录下,则需要通过config来指定配置文件的位置。
eg : ./start-all.sh --config path-to-conf hadoop fs -conf path-to-conf ls /
属性配置
HDFS属性
fs.default.name
描述HDFS文件系统的URI,主机为namenode的主机IP,端口为namenode监听的RPC端口。默认端口为8020.
此属性也指定了默认文件系统,可以解析相对路径。(HDFS不用masters文件确定主机名,masters文件只供控制脚本使用)
典型配置: hdfs://127.0.0.1/
hadoop.tmp.dir
hadoop的临时目录, 默认值为/tmp/hadoop-${user.name}
在Ubuntu下/tmp目录为开机就清除的目录。所有很多文件存在这,重开机就被删了,导致namenode起不来。
要修改为其他路径。在core-site.xml 中修改。
dfs.name.dir (dfs.namenode.name.dir hadoop-2.x)
指定一系列目录来供namenode存放永久性的文件系统元数据, 可以用逗号分隔出多个目录。系统会将元数据写入所有的目录(推荐其中有NFS挂载的目录)(进行冗余备份).
当namenode发生故障,可以从NFS恢复元数据。默认值为 ${hadoop.tmp.dir}/dfs/name
dfs.data.dir (dfs.datanode.name.dir hadoop-2.x)
指定datanode存储数据的目录,也是同时指定多个目录(用逗号隔开),但和 dfs.name.dir不同的是它在所有目录存放不同的文件,目的是提高性能。
默认值为 ${hadoop.tmp.dir}/dfs/data
fs.checkpoint.dir
指定一系列 辅助namenode 存储文件系统检查点(checkpoint)的目录,在多个目录备份相同的checkpoint,冗余备份。
默认值为 ${hadoop.tmp.dir}/dfs/namesecondary
dfs.block.size
指定HDFS的块大小,默认为64MB。可修改为更大的块,以减小namenode的内存压力。在hdfs-site.xml 中。
dfs.datanode.du.reserved
默认情况下,datanode能够占用存储目录上的所有空闲空间。如要为其他应用程序保留部分空间,则通过此属性指定待保留空间的大小。
fs.trash.interval
Hadoop有回收站系统,通过shell删除的文件会移到.Trash目录,保留一段时间,通过此属性设置保留时间的长短,默认为0,即直接删除。用程序删除的文件会直接删除,不移到回收站。此属性在core-site.xml 中设置。 HDFS会自动删除回收站的过期文件。其他文件系统用 hadoop fs -expunge 命令删除。
MapReduce属性
mapred.job.tracker
指定jobtracker PRC服务的IP和端口,非URI。 默认为local。通常使用8021端口
伪分布通常修改为 localhost:8021
mapred.local.dir
指定一系列map任务输出的目录,这些数据被写入本地文件系统,作业终止时,数据被清除。
map输出的数据会分散到所有目录,为提高性能。数据可能非常多,保证空间够~
默认路径 ${hadoop.tmp.dir}/mapred/local
mapred.system.dir
MapReduce使用分布式文件系统和各个tasktracker共享文件,即作业运行期间存储共享文件的目录(例如作业JAR作业)。
此属性指定这些文件的存储目录,可以是fs.default.name的相对路径。
默认值为 ${hadoop.tmp.dir}/mapred/system
mapred.tasktracker.map.tasks.maximum
最多同时运行的map任务数,默认为2。
mapred.tasktracker.reduce.tasks.maximum
最多同时运行的reduce任务数,默认为2
map和reduce子项
mapred.child.java.opts (hadoop 1.x 2.x 均适用)
默认-Xmx200m,即map和reduce子JVM最大heap容量为200MB。
mapreduce.map.java.opts
默认-Xmx200m map子JVM heap大小 (1.x 没有)
mapreduce.reduce.java.opts
默认-Xmx200m reduce子JVM heap大小 ( 1.x没有 )
RPC服务器
之前说了 fs.default.name mapred.job.tracker 两个RPC服务器。前一个是HDFS RPC服务器,后一个是jobtracker RPC服务器。
dfs.datanode.ipc.address
设置datanode的PRC服务器。默认为 0.0.0.0:50020
3(0.0.0.0 指本机的所有网络,如果你当前主机有两个IP,就两个IP的50020端口都设置)
mapred.task.tracker.report.address
设置tasktracker 的RPC服务器。默认为 127.0.0.1:0 (端口0为任一空闲端口,tasktracker的子JVM利用它和tasktracker通信)
TCP/IP服务器
dfs.datanode.address
设置datanode间check传输的地址端口。默认值为 0.0.0.0:50010
HTTP服务器
mapred.job.tracker.http.address 默认 0.0.0.0:50030 jobtracker 的HTTP服务器地址和端口
mapred.task.tracker.http.address 默认 0.0.0.0:50060 tasktracker 的HTTP服务器地址和端口
dfs.http.address 默认 0.0.0.0:50070 namenode的HTTP服务器地址和端口
dfs.datanode.http.address 默认 0.0.0.0:50075 datanode的HTTP服务器的地址和端口
dfs.secondary.http.address 默认 0.0.0.0:50090 辅助namenode的HTTP服务器地址和端口
缓冲区大小
Hadoop默认4KB的缓冲区辅助I/O操作。 可通过core-site.xml 中的 io.file.buffer.size属性设置缓冲区大小。
慢启动reduce
mapred.reduce.slowstart.completed.maps
此属性设置reduce任务何时启动,默认为5%的map任务结束后启动,这样可能造成reduce任务占用reduce槽而无事可做。
可以改成0.80(80%),来提高吞吐率。
创建用户帐号
为用户创建home目录,并赋予用户拥有者权限。
hadoop fs -mkdir /user/username
hadoop fs -chown username:username /user/username
设定各目录空间限制。下列设置是不超过1T。
hadoop dfsadmin -setSpaceQuota 1t /user/username
YARN配置(Hadoop 2.x)
YARN的start-yarn.sh 脚本启动集群中YARN的守护进程。该脚本会在当前机器启动资源管理器,然后在slaves文件列举的每台机器上各启动一个节点管理器。
YARN还有一个Web应用程序代理服务器(访问YARN应用的用户界面)、作业历史服务器(显示历史作业的执行细节)。
yarn-env.sh bash脚本 运行YARN的脚本所使用的环境变量
yarn-site.xml Hadoop配置xml YARN守护进程的配置设置:资源管理器,节点管理器,作业历史服务器,Web应用服务器。
当运行YARN时,mapred-site.xml 文件仍被记录通用MapReduce属性,只是与Jobtracker和Tasktracker相关的属性被废弃了。
本文中MapReduce属性中的属性项,都被废弃。
hadoop 1.x 和 2.x 的内存控制有很大区别。
hadoop 1.x 基于槽来控制,集群启动时固定有多少map槽和reduce槽,应用不能改变,一些占用内存小的多个任务占用一台机器、后期只有reduce任务,而分配给map槽的内存却在空缺,存在浪费。
hadoop 2.x 由资源管理器来分配计算资源,不固定槽的数量,应用运行过程都由master负责管理,并由master和资源管理器沟通、申请资源。
hadoop 1.x的内存属性配置在“hadoop权威指南P345”
shuffle过程
map输出先进入缓冲区,每当缓冲区快满时开始处理,先按键把键值对分区,然后分区内排序,进行一遍combiner,然后把生成文件写入本地目录暂时保存。 这样,map任务结束后,会有多个本地保存的中间文件,需要把这些文件合并,过程为先分区再排序,最后进行combiner。
然后reduce端接收多个map任务发来的数据,排序后进行combiner。然后开始reduce处理。
YARN属性
mapred.framework.name
属性需设置为yarn才使用YARN框架,classic标示mapreduce1.x ,在mapred-site.xml 中设置。
yarn.resourcemanager.address
指定资源管理器的RPC接口。格式 主机:端口
yarn.nodemanager.local-dirs
类似于mapred.local.dir 属性,指定中间数据(map输出)存储地址。只是第一代和第二代的区别,磁盘间也用逗号隔开。(任务结束时删除)
yarn.nodemanager.aux-services
节点管理器运行的附加服务列表。设置为 mapreduce_shuffle ,以此显示启用shuffle过程(1代不用),此设置在yarn-site.xml 中。
yarn.nodemanager.resource.memory-mb
分配给节点管理器的物理内存量,默认为8192,单位为MB
mapreduce.map.memory.mb / mapreduce.reduce.memory.mb
指定内存大小来运行map或reduce任务,默认为1024MB,此内存包括mapred.child.java.opts的JVM heap内存、及它创建的任何进程如Streaming。
所以必须要比heap内存大。如果map或reduce任务内存超出,JVM进程会被节点管理器终止,并标记为失败。
yarn.nodemanager.vmem-pmem-ratio
指定进程虚拟内存量与物理内存限制的乘积。 默认为2.1,则虚拟内存的规模上限为2.1*mapreduce.xxxxx.memory.mb(1024MB)= 2150MB
YARN的RPC属性
yarn.resourcemanager.address
默认为 0.0.0.0:8032 ,资源管理器通过它与客户端通信
yarn.resourcemanager.admin.address
默认为 0.0.0.0:8033,资源管理器通过它与admin客户端通信
yarn.resourcemanager.scheduler.address
默认为 0.0.0.0:8030,资源管理器通过它与应用程序宿主(master)通信
yarn.resourcemanager.resource-tracker.address
默认为 0.0.0.0:8031,资源管理器通过此与节点管理器通信
yarn.nodemanager.address
默认为 0.0.0.0:0 ,节点管理器与应用程序宿主通信。
yarn.nodemanager.localizer.address
默认为 0.0.0.0:8040,节点管理器的localizer的RPC服务器地址。
mapreduce.jobhistory.address
默认为 0.0.0.0:10020 作业历史服务器与客户端在此通信。 此属性在mapred-site.xml 中设置。
YARN的HTTP属性
yarn.resourcemanager.webapp.address
默认0.0.0.0:8088 ,资源管理器的HTTP服务器地址。
yarn.nodemanager.webapp.address
默认为0.0.0.0:8042,节点管理器的HTTP服务器地址。
yarn.web-proxy.address
Web应用代理服务器的HTTP服务器地址。默认未设置,则Web应用代理器会在资源管理器进程中运行。
mapreduce.jobhistory.webapp.address
默认为 0.0.0.0:19888 ,作业历史服务器的HTTP服务器地址。在mapred-site.xml 中设置。
mapreduce.shuffle.port
默认8080 ,shuffle句柄(handler)的HTTP端口号,为map任务的输出结果服务。不是用户可访问的界面。在mapred-site.xml 中设置。