一般集群中的一台机器作为NameNode,另一台机器作为ResourceManager,这是masters。
剩下的服务(Web App Proxy Server和MapReduce Job History server)会运行在专用硬件或者共享设施上,这取决于加载方式。(这一块还不太理解)
master之外的机器都是DataNode和NodeManager。他们属于slaves。
Hadoop有两类重要的配置文件:
只读的默认配置文件(包括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 , etc/hadoop/mapred-env.sh,这三个文件来控制bin目录下的hadoop脚本。
Hadoop的守护进程包括:
HDFS的NameNode,SecondaryNameNode,DataNode
YARN的ResourceManager,NodeManager,WebAppProxy
此外还有个前面提到过的MapReduce Job History server
某个hadoop实例运行的守护进程不同,所需的配置也不太一样。
大致关系是这样的:
Daemon | Environment Variable |
---|---|
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 |
export HADOOP_NAMENODE_OPTS="-XX:+UseParallelGC"其他配置还包括:
HADOOP_PID_DIR -指定用于存储守护进程id files的目录
HADOOP_LOG_DIR -指定用于存储守护进程log files的目录
HADOOP_HEAPSIZE / YARN_HEAPSIZE-指定最大的heapsize,单位是MB
HADOOP_PREIFX-貌似就是个前缀,还需要在系统级别配置这个环境变量。实际就是hadoop的安装目录,哈哈。
此外还有下面的环境变量:
Daemon | Environment Variable |
---|---|
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中
Parameter | Value | Notes |
---|---|---|
fs.defaultFS | NameNode URI | 主节点URI,类似hdfs://host:port/ |
io.file.buffer.size | 131072 | SequenceFiles的读写缓存 |
为NameNode配置
Parameter | Value | Notes |
---|---|---|
dfs.namenode.name.dir | NameNode持久化namespace和事务日志的目录 | 可以配多个目录以保证冗余,逗号分隔。 |
dfs.hosts / dfs.hosts.exclude | permitted和excluded的datanodes清单 | 使用这些文件来管理allowable datanode清单 |
dfs.blocksize | 268435456 | HDFS blocksize |
dfs.namenode.handler.count | 100 | 处理来自DataNodes的RPC(remote procedure call)的线程数 |
Parameter | Value | Notes |
---|---|---|
dfs.datanode.data.dir | 用于存储blocks的目录,用逗号做分隔符 | 数据将会存储在所有列举出的目录中 |
ResourceManager和NodeManager的配置
Parameter
Value | Notes | |
---|---|---|
yarn.acl.enable | true / false | 是否开启ACLs(一种权限管理),默认false. |
yarn.admin.acl | Admin ACL | 设置集群的管理。由由逗号分隔的用户和逗号分隔的group组成,这两部分中间用空格隔开。默认是*表示所有人都可以访问,若设置为空格则表示所有人无权访问。 |
yarn.log-aggregation-enable | false | 是否开启 log aggregation |
Parameter | Value | Notes |
---|---|---|
yarn.resourcemanager.address | ResourceManager host:port for clients to submit jobs. | host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. |
yarn.resourcemanager.scheduler.address | ResourceManager host:port for ApplicationMasters to talk to Scheduler to obtain resources. | host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. |
yarn.resourcemanager.resource-tracker.address | ResourceManager host:port for NodeManagers. | host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. |
yarn.resourcemanager.admin.address | ResourceManager host:port for administrative commands. | host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. |
yarn.resourcemanager.webapp.address | ResourceManager web-ui host:port. | host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. |
yarn.resourcemanager.hostname | ResourceManager host. | host Single hostname that can be set in place of setting all yarn.resourcemanager*address resources. Results in default ports for ResourceManager components. |
yarn.resourcemanager.scheduler.class | ResourceManager Scheduler class. | CapacityScheduler (recommended), FairScheduler (also recommended), or FifoScheduler |
yarn.scheduler.minimum-allocation-mb | Minimum limit of memory to allocate to each container request at the Resource Manager. | In MBs |
yarn.scheduler.maximum-allocation-mb | Maximum limit of memory to allocate to each container request at the Resource Manager. | In MBs |
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path | permitted/excluded NodeManagers清单. | 使用该清单来控制allowable NodeManagers. |
Parameter | Value | Notes |
---|---|---|
yarn.nodemanager.resource.memory-mb | NodeManager的可用物理内存,单位MB | 定义NodeManager中可以用来运行容器的所有资源 |
yarn.nodemanager.vmem-pmem-ratio | 任务所占用的虚拟内存超过物理内存的最大比例 | 虚拟内存可以按照这个比例超过物理内存 |
yarn.nodemanager.local-dirs | 媒介数据存放的目录 | 配置多个路径可以分散IO |
yarn.nodemanager.log-dirs | 日志文件存放的目录 | 配置多个路径可以分散IO |
yarn.nodemanager.log.retain-seconds | 10800 | 仅当log-aggregation失效时才有效,用来指定日志文件存放在NodeManager的默认时间。单位是秒 |
yarn.nodemanager.remote-app-log-dir | /logs | 仅当log-aggregation生效时才有效。当应用结束时,日志文件将会转移到这个HDFS目录。需要设置合适的权限。 |
yarn.nodemanager.remote-app-log-dir-suffix | logs | 仅当log-aggregation生效时才有效。远程日志目录的后缀名,日志将会被聚集到${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam} |
yarn.nodemanager.aux-services | mapreduce_shuffle | Map Reduce applications.所需的Shuffle service |
Parameter | Value | Notes |
---|---|---|
yarn.log-aggregation.retain-seconds | -1 | 保存聚合日志的时间。-1表示无效。 |
yarn.log-aggregation.retain-check-interval-seconds | -1 | 检查聚合日志保存时间的时间间隔,0或负数表示聚合日志保存时间的十分之一。 |
为MapReduce Application配置
Parameter | Value | Notes |
---|---|---|
mapreduce.framework.name | yarn | 将执行的框架设置为YARN |
mapreduce.map.memory.mb | 1536 | maps操作的资源上限 |
mapreduce.map.java.opts | -Xmx1024M | maps操作的子虚拟机的heap-size上限 |
mapreduce.reduce.memory.mb | 3072 | reduces操作的资源上限 |
mapreduce.reduce.java.opts | -Xmx2560M | reduces子虚拟机的heap-size上限 |
mapreduce.task.io.sort.mb | 512 | 执行sorting data for efficiency(为了提升效率而进行的排序操作)时的内存上限 |
mapreduce.task.io.sort.factor | 100 | 对文件进行排序时,一次融合的流的数目 |
mapreduce.reduce.shuffle.parallelcopies | 50 | reduce操作中,从maps操作的大的结果集中复制数据的最大并行数. |
Parameter | Value | Notes |
---|---|---|
mapreduce.jobhistory.address | MapReduce JobHistory 服务器的 host:port | 默认端口是10020. |
mapreduce.jobhistory.webapp.address | MapReduce JobHistory Server Web UI的 host:port | 默认端口是19888. |
mapreduce.jobhistory.intermediate-done-dir | /mr-history/tmp | 写入历史文件的目录 |
mapreduce.jobhistory.done-dir | /mr-history/done | MR JobHistory Server管理历史文件的目录 |
hadoop允许管理者配置NodeManager,使其周期性执行一个管理者提供的脚本来判断这个节点是否是健康的。
若该脚本判断节点不健康,它需要打印以Error开头的一行信息到标准输出。NodeManager周期性执行该脚本,并检查输出。若检查到ERROR,则标记该节点为unhealthy。接着ResourceManager会将该节点加入黑名单,接下来的任务也不会被提交到该节点。直到某次运行脚本时检测结果为healthy才将它从黑名单移除。
下列etc/hadoop/yarn-site.xml中的参数用来控制节点健康监控脚本
Parameter | Value | Notes |
---|---|---|
yarn.nodemanager.health-checker.script.path | Node health script | check使用的脚本 |
yarn.nodemanager.health-checker.script.opts | Node health script options | check脚本使用的options |
yarn.nodemanager.health-checker.script.interval-ms | Node health script interval | 运行check脚本的时间间隔 |
yarn.nodemanager.health-checker.script.timeout-ms | Node health script timeout interval | check脚本执行的超时时间 |
Slaves File
在etc/hadoop/slaves文件中列出所有slave的hostname或IP地址,一个一行。Helper脚本将会使用这个文件中的清单来在多个主机执行命令。它不会被任何基于java的配置项使用。为使用该功能,运行hadoop的账号需要实现ssh免密码登录。
Hadoop Rack Awareness
hadoop很多组件都是机架敏感的。hadoop守护进程通过激活一个管理者配置的模型来获得关于机架的信息。
Hadoop日志打印使用log4j,配置文件位于etc/hadoop/log4j.properties
操作Hadoop集群
完成以上配置后,可以将它们集中发送到所有机器的HADOOP_CONF_DIR目录(猜测就是etc/hadoop)。
推荐用不同的用户运行HDFS和YARN。
启动步骤
1、格式化dfs
[hdfs]$ $HADOOP_PREFIX/bin/hdfs namenode -format <cluster_name>(我觉得这个集群名称是可以随便取的)2、启动hdfs的namenode
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode3、启动datanode
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs start datanode4、如果etc/hadoop/slaves和ssh免密码登录都配置好了,那么上面的操作可以用下面的脚本代替。
[hdfs]$ $HADOOP_PREFIX/sbin/start-dfs.sh5、启动ResourceManager
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start resourcemanager6、启动NodeManager
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR start nodemanager7、启动webAppProxy服务器,若采用多服务器负载均衡,则需要依次启动它们。
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start proxyserver8、 如果etc/hadoop/slaves和ssh免密码登录都配置好了,那么上面的操作可以用下面的脚本代替。
[yarn]$ $HADOOP_PREFIX/sbin/start-yarn.sh9、启动MapReduce JobHistory Server
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR start historyserver关闭步骤
1、关闭NameNode
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop namenode2、关闭DataNode
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs stop datanode3、 如果etc/hadoop/slaves和ssh免密码登录都配置好了,那么上面的操作可以用下面的脚本代替。
[hdfs]$ $HADOOP_PREFIX/sbin/stop-dfs.sh4、关闭ResourceManager
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop resourcemanager5、关闭NodeManager
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR stop nodemanager6、 如果etc/hadoop/slaves和ssh免密码登录都配置好了,那么上面的操作可以用下面的脚本代替。
[yarn]$ $HADOOP_PREFIX/sbin/stop-yarn.sh7、关闭WebAppProxy server.
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop proxyserver8、关闭MapReduce JobHistory Server
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR stop historyserver其中中括号中的是执行命令行的账号。
Web Interfaces
下面列举了hadoop集群的所有web ui
Daemon | Web Interface | Notes |
---|---|---|
NameNode | http://nn_host:port/ | Default HTTP port is 50070. |
ResourceManager | http://rm_host:port/ | Default HTTP port is 8088. |
MapReduce JobHistory Server | http://jhs_host:port/ | Default HTTP port is 19888. |