安装部署
安装 Hadoop cluster 常用方式:在所有服务器上解压软件;通过操作系统支持的包安装。建议将不同的功能分散到不同的硬件上。
通常,cluster 内的一台作为 NameNode ,另一台作为 ResourceManager。 这些都是 masters 角色。其他服务 (比如 Web App Proxy Server , MapReduce Job History server) 可以运行在独立硬件上,也可以共享运行,取决于负载。
Cluster 内的其他机器同时作为 DataNode 和 NodeManager。它们都是 slaves 角色。
在Non-Secure模式下配置Hadoop
Hadoop 的 Java 配置被两种类型的重要配置文件驱动:
- 只读属性的默认配置:
core-default.xml
,hdfs-default.xml
,yarn-default.xml
andmapred-default.xml
. - 站点自定义配置:
etc/hadoop/core-site.xml
,etc/hadoop/hdfs-site.xml
,etc/hadoop/yarn-site.xml
andetc/hadoop/mapred-site.xml
.
另外,你还可以配置 bin/
目录下的Hadoop脚本,通过etc/hadoop/hadoop-env.sh
and etc/hadoop/yarn-env.sh
设置站点自定义值。
配置 Hadoop cluster 需要配置环境变量,Hadoop daemons 会识别为其配置参数。
Daemon Type | Daemons |
---|---|
HDFS | NameNode SecondaryNameNode DataNode |
YARN | ResourceManager NodeManager WebAppProxy |
MapReduce | Job History Server |
大型部署,deamons建议都部署在独立的主机上。
1. 配置环境变量
管理员通过 etc/hadoop/hadoop-env.sh
, etc/hadoop/mapred-env.sh
,etc/hadoop/yarn-env.sh
脚本来定制环境变量。
至少,在每个远程节点上配置 JAVA_HOME 。
如下表列出了不同deamons的配置:
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 |
比如,配置 Namenode 使用 parallelGC,在 hadoop-env.sh 内添加如下:
export HADOOP_NAMENODE_OPTS="-XX:+UseParallelGC"
See etc/hadoop/hadoop-env.sh for other examples.
其他一些常见配置参数:
配置参数 | 说明 |
---|---|
HADOOP_PID_DIR | deamon进程ID存放目录 |
HADOOP_LOG_DIR | deamon日志存放目录。日志文件会自己创建。 |
HADOOP_HEAPSIZE / YARN_HEAPSIZE | 最大heapsize定义,单位MB。 比如,设置1000,heap就会是1000MB。 用来配置daemon的 heap size。 默认值 1000。 |
大多情况下,设置 HADOOP_PID_DIR and HADOOP_LOG_DIR目录,这样它们只可以被运行deamons进程的用户写入。否则,会有 symlink attack 的风险。
还可以在系统层面设置 HADOOP_PREFIX 变量。比如,在 /etc/profile.d
:
HADOOP_PREFIX=/path/to/hadoop
export HADOOP_PREFIX
Daemon | Environment Variable |
---|---|
ResourceManager | YARN_RESOURCEMANAGER_HEAPSIZE |
NodeManager | YARN_NODEMANAGER_HEAPSIZE |
WebAppProxy | YARN_PROXYSERVER_HEAPSIZE |
Map Reduce Job History Server | HADOOP_JOB_HISTORYSERVER_HEAPSIZE |
2. 配置 Hadoop Daemons
配置文件 etc/hadoop/core-site.xml
Parameter | Value | Notes |
---|---|---|
fs.defaultFS |
NameNode URI | hdfs://host:port/ |
io.file.buffer.size |
131072 | Size of read/write buffer used in SequenceFiles. |
配置文件 etc/hadoop/hdfs-site.xml
- NameNode 配置
Parameter | Value | Notes |
---|---|---|
dfs.namenode.name.dir |
NameNode存储namespace 和transactions 日志的本地文件系统路径。 | 如果是一个逗号分隔的目录列表,那么name tables会复制到所有的目录,以实现冗余。 |
dfs.hosts / dfs.hosts.exclude |
允许/拒绝的DataNodes列表 | 如有必要,使用该文件控制允许加入的datanodes列表 |
dfs.blocksize |
268435456 | HDFS blocksize 设置, 大文件系统256MB |
dfs.namenode.handler.count |
100 | 处理大量DataNodes RPCS的 NameNode 服务线程数量。 |
- DataNode配置
Parameter | Value | Notes |
---|---|---|
dfs.datanode.data.dir |
DataNode 存储它的块文件的本地文件系统路径,以逗号分隔的列表 | 如果是一个以逗号分隔的目录列表,那么数据会村粗到所有命名的目录,通常是在不同的设备上。 |
配置文件 etc/hadoop/yarn-site.xml
- ResourceManager & NodeManager 共用配置
Parameter | Value | Notes |
---|---|---|
yarn.acl.enable |
true / false | 开启 ACLs ? 默认 false. |
yarn.admin.acl |
Admin ACL | 设置管理员ACL。 默认值 *,代表任意人;空格代表拒绝访问。 |
yarn.log-aggregation-enable |
false | 开启or关闭 log aggregation |
- ResourceManager 配置
Parameter | Value | Notes |
---|---|---|
yarn.resourcemanager.address |
客户端提交任务地址 host:port |
覆盖 yarn.resourcemanager.hostname 内的hostname 设置 |
yarn.resourcemanager.scheduler.address |
ApplicationMasters调度资源的地址 host:port |
覆盖 yarn.resourcemanager.hostname 内的hostname 设置 |
yarn.resourcemanager.resource-tracker.address |
NodeManagers调用地址 host:port |
覆盖 yarn.resourcemanager.hostname 内的hostname 设置 |
yarn.resourcemanager.admin.address |
管理命令行地址 host:port |
覆盖 yarn.resourcemanager.hostname 内的hostname 设置 |
yarn.resourcemanager.webapp.address |
Web UI地址 host:port. |
覆盖 yarn.resourcemanager.hostname 内的hostname 设置 |
yarn.resourcemanager.hostname |
ResourceManager 主机 | 主机唯一hostname,可用于替代所有yarn.resourcemanager*address设置。端口皆为默认配置。 |
yarn.resourcemanager.scheduler.class |
ResourceManager Scheduler class. | CapacityScheduler (recommended)FairScheduler (also recommended)or FifoScheduler |
yarn.scheduler.minimum-allocation-mb |
分配给容器的最小内存 | In MBs |
yarn.scheduler.maximum-allocation-mb |
分配给容器的最大内存 | In MBs |
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path |
NodeManagers的允许/排它列表 | 如有必要,使用这些文件控制允许的NodeManagers列表 |
- NodeManager 配置
Parameter | Value | Notes |
---|---|---|
yarn.nodemanager.resource.memory-mb |
可用物理内存 | 定义了NodeManager 可供运行容器的总可用内存 |
yarn.nodemanager.vmem-pmem-ratio |
任务使用的虚拟内存可以超越物理内存的最大比率 | 每个任务所用虚拟内存可以超越物理内存的比率受此限制。 该NodeManager 上所有任务使用的总虚拟内存,可以根据此比率超越物理内存。 |
yarn.nodemanager.local-dirs |
中间数据写入的本地路径列表,以逗号分隔 | 多路径有助于扩展disk i/o |
yarn.nodemanager.log-dirs |
日志写入的本地路径列表,以逗号分隔 | 多路径有助于扩展disk i/o |
yarn.nodemanager.log.retain-seconds |
10800 | 日志保留的默认时间(s计),仅在关闭log-aggregation时适用。 |
yarn.nodemanager.remote-app-log-dir |
/logs | HDFS目录,当应用完成时将应用日志移过去。需要设置相应权限。仅在开启log-aggregation时生效。 |
yarn.nodemanager.remote-app-log-dir-suffix |
logs | 附加到remote log目录的前缀。日志聚合格式 ${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam} ,仅在开启log-aggregation时生效。 |
yarn.nodemanager.aux-services |
mapreduce_shuffle | 需要给Map Reduce应用设置的Shuffle service |
- History Server 配置(Needs to be moved elsewhere):
Parameter | Value | Notes |
---|---|---|
yarn.log-aggregation.retain-seconds |
-1 | aggregation logs的保留时间。 -1 禁用。设置太小,会向namenode发送大量垃圾信息。 |
yarn.log-aggregation.retain-check-interval-seconds |
-1 | aggregated log 周期检查时间。0或负值,将该值设置为aggregated log周期的1/10时间。设置太小,会向namenode发送大量垃圾信息。 |
etc/hadoop/mapred-site.xml
配置文件 etc/hadoop/mapred-site.xml
- MapReduce 应用配置
Parameter | Value | Notes |
---|---|---|
mapreduce.framework.name |
yarn | 执行框架设置为 Hadoop YARN. |
mapreduce.map.memory.mb |
1536 | maps的最大资源限制 |
mapreduce.map.java.opts |
-Xmx1024M | maps的子jvm的最大 heap-size 限制 |
mapreduce.reduce.memory.mb |
3072 | reduces的最大资源限制 |
mapreduce.reduce.java.opts |
-Xmx2560M | reduces的子jvm的最大 heap-size 限制 |
mapreduce.task.io.sort.mb |
512 | 数据排序的最大内存限制 |
mapreduce.task.io.sort.factor |
100 | 排序文件时,单次的streams merge限制 |
mapreduce.reduce.shuffle.parallelcopies |
50 | 匹配大量maps输出的reduce并行复制最大数量 |
- MapReduce JobHistory Server 配置
Parameter | Value | Notes |
---|---|---|
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 | history文件写入的临时目录 |
mapreduce.jobhistory.done-dir |
/mr-history/done | history文件最终目录 MR JobHistory Server管理 |
监控NodeManagers
Hadoop提供了一种机制,管理员可以配置NodeManager周期运行脚本来判断node的健康状况。
通过执行脚本的一些选项,管理员可以判断node的健康状况。如果脚本检测出来node是不健康状况,它会以ERROR标准输出打印出来。NodeManager定期调用脚本、检查输出。 如果输出包含ERROR,节点就被上报以不健康状况,ResourceManager将其纳入黑名单。后续任务不会再分发到该节点。但是,NodeManager 还是会继续运行脚本,这样如果node恢复正常, ResourceManager 就会自动将其从黑名单删除。节点依赖于脚本的输出判断健康状态,如果不健康,管理员会在ResourceManager web界面上看到。节点的健康状态时间也会显示。
在etc/hadoop/yarn-site.xml
文件,如下参数用于设置节点健康监测状态脚本:
Parameter | Value | Notes |
---|---|---|
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可以周期性的监测local disks (specifically checks nodemanager-local-dirs
and nodemanager-log-dirs
) ,在达到yarn.nodemanager.disk-health-checker.min-healthy-disks
设置的故障目录阈值后, 整个节点都会标记为不健康,这个信息会被发送至resource manager。The boot disk is either raided or a failure in the boot disk is identified by the health checker script.
Slaves File
将slaves的hostnames or IP 写到 etc/hadoop/slaves
文件,一行一条。 Helper scripts (described below) 将使用 etc/hadoop/slaves
文件来批量执行命令。它不是用于 Java-based Hadoop configuration。要使用该功能,需要在运行Hadoop的账户配置 ssh trusts (通过免密ssh or 其他,比如 Kerberos) 。
Hadoop Rack Awareness
很多 Hadoop 组件都是机架感知的,利用了网络拓扑性能和安全的优势。Hadoop daemons 通过调用管理员配置的模块来获取slaves的机架信息。
参见 Rack Awareness 文档。
强烈推荐启动HDFS前配置机架感知。
Logging
Hadoop 通过 Apache Commons Logging framework 使用 Apache log4j 记录日志。编辑 etc/hadoop/log4j.properties
文件自定义日志配置。
Operating the Hadoop Cluster
在所有配置完成后,将文件分发到所有服务器的HADOOP_CONF_DIR
目录。所有服务器应该是同样的目录。
通常,建议 HDFS 和 YARN 以独立用户运行。安装时,HDFS 使用账户 hdfs,YARN 使用账户 yarn 。
- Hadoop Startup
启动一个Hadoop集群,需要启动 HDFS 和 YARN cluster。
第一次启动 HDFS,需要格式化。以hdfs
格式化一个新的分布式文件系统:
[hdfs]$ $HADOOP_PREFIX/bin/hdfs namenode -format
以hdfs
启动/停止 HDFS NameNode
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop namenode
以hdfs
启动/停止 HDFS DataNode
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs start datanode
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs stop datanode
在 etc/hadoop/slaves
和 ssh trusted access 配置好后, (see Single Node Setup), 以hdfs
启动所有的HDFS进程:
[hdfs]$ $HADOOP_PREFIX/sbin/start-dfs.sh
[hdfs]$ $HADOOP_PREFIX/sbin/stop-dfs.sh
在规划的ResourceManager服务器上,以yarn
用户启动/停止 YARN :
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start 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 start nodemanager
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR stop nodemanager
以yarn
用户启动一台独立的 WebAppProxy server。如果以负载均衡配置多台,那么在每台都要启动。
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start proxyserver
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop proxyserver
在 etc/hadoop/slaves
和 ssh trusted access 配置好后, (see Single Node Setup), 以yarn
启动所有的YARN进程:
[yarn]$ $HADOOP_PREFIX/sbin/start-yarn.sh
[yarn]$ $HADOOP_PREFIX/sbin/stop-yarn.sh
在规划的服务器上,以mapred
用户启动 MapReduce JobHistory Server :
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR start historyserver
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR stop historyserver
Web Interfaces
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. |