本文描述了如何安装、配置和管理 Hadoop 集群
从 Apache mirrors 下载稳定版本的 Hadoop
通常,将集群中的一台机器作为 NameNode,另一台机器作为 ResourceManager。它们是 masters。集群中剩余的机器同时为 DataNode 和 NodeManager,它们是 slaves
一些部分描述了如何配置一个Hadoop集群
Hadoop 配置由两种类型的重要配置文件影响:
为了配置集群,你需要配置 Hadoop 守护进程执行环境。Hadoop 守护进程为 NameNode/DataNode 和 ResourceManager/NodeManager
管理员应该使用 conf/hadoop-env.sh 和 conf/yarn-env.sh 脚本来定制 Hadoop 守护进程的环境。 你至少要指定 JAVA_HOME 以便于它在每个远程节点上被正确定义。 在大多数情况下,你也应该指定 HADOOP_PID_DIR 和 HADOOP_SECURE_DN_PID_DIR 来指向那些只能被要执行 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 |
例如,配置 NameNode 使用 paralleIGC,以下这句应该被添加到 hadoop-env.sh 中:
export HADOOP_NAMENODE_OPTS="-XX:+UseParallelGC ${HADOOP_NAMENODE_OPTS}"
其他你可以定制的有用参数包括:
守护进程 | Value |
---|---|
ResourceManager | YARN_RESOURCEMANAGER_HEAPSIZE |
NodeManager | YARN_NODEMANAGER_HEAPSIZE |
WebAppProxy | YARN_PROXYSERVER_HEAPSIZE |
Map Reduce Job History Server | HADOOP_JOB_HISTORYSERVER_HEAPSIZE |
本节涉及在给出文件中要被指定的重要参数:
参数 | 值 | 注释 |
---|---|---|
fs.defaultFS | NameNode标志 | hdfs://host:port/ |
io.file.buffer.size | 131072 | 用在序列化文件中读写缓冲区的size |
NameNode配置:
参数 | 值 | 注释 |
---|---|---|
dfs.namenode.name.dir | NameNode存放名字空间和持续处理日志的本地文件系统路径 | 如果这是一个以逗号分隔的目录列表,作为冗余考虑,名字表将被复制到所有目录下 |
dfs.namenode.hosts / dfs.namenode.hosts.exclude | 允许的/拒绝的 DataNode 列表 | 如有需要,使用这些文件来控制被允许的datanode |
dfs.blocksize | 268435456 | HDFS block size |
dfs.namenode.handler.count | 100 | NameNode中用来处理来自众多 DataNode RPCs的线程数 |
DataNode配置:
参数 | 值 | 注释 |
---|---|---|
dfs.datanode.data.dir | 逗号分隔的本地文件系统上的路径列表,用来存放该 DataNode 的block | 如果这是一个逗号分隔的目录列表,数据将被存储在所有命名的目录下, 通常在不同的设备上 |
ResourceManager 和 NodeManager 配置
参数 | 值 | 注释 |
---|---|---|
yarn.acl.enable | true / false | 是否启动ACLs?默认不启用 |
yarn.admin.acl | 管理员ACL(访问控制列表) | 设置集群的管理员ACL。默认值为*,表示任何人。指定该值为空格表示任何人都没有访问权限 |
yarn.log-aggregation-enable | false | 启用或禁用日志聚合 |
ResourceManager 配置
参数 | 值 | 注释 |
---|---|---|
yarn.resourcemanager.address | ResourceManager用于给 client 提交 job 的地址(host:port) | host:port |
yarn.resourcemanager.scheduler.address | ResourceManager 用于给 ApplicationMaster 向调度器申请资源的地址 | host:port |
yarn.resourcemanager.resource-tracker.address | ResourceManager 为 NodeManagers 提供的地址 | host:port |
yarn.resourcemanager.admin.address | ResourceManager 为管理员命令提供的地址 | host:port |
yarn.resourcemanager.webapp.address | ResourceManager web 页面地址 | host:port |
yarn.resourcemanager.scheduler.class | ResourceManager 资源调度类 | CapacityScheduler (推荐的), FairScheduler (同样推荐的), or FifoScheduler |
yarn.scheduler.minimum-allocation-mb | 为每个 container 分配的内存的最小值 | 以 MB 为单位 |
yarn.scheduler.maximum-allocation-mb | 为每个 container 分配的内存的最大值 | 以 MB 为单位 |
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path | ||
允许的/拒绝的 NodeManager 列表 | 如有必要,使用这些文件来控制允许的 NodeManager 列表 |
NodeManager 配置
参数 | 值 | 注释 |
---|---|---|
yarn.nodemanager.resource.memory-mb | 可用的物理内存,以 MB 为单位 | 定义 NodeManager 所有可用的内存资源 |
yarn.nodemanager.vmem-pmem-ratio | task 使用的虚拟内存相对于物理内存的最大倍数 | / |
yarn.nodemanager.local-dirs | 以逗号分隔的本地文件系统路径列表,用来存放中间数据 | 多路径有助于分散磁盘 I/O |
yarn.nodemanager.log-dirs | 以逗号分隔的本地文件系统路径列表,用来存放日志文件 | 多路径有助于分散磁盘 I/O |
yarn.nodemanager.log.retain-seconds | 10800 | 保留 NodeManager 上日志文件的时长(以秒为单位),只有当关闭日志聚合才有效 |
yarn.nodemanager.remote-app-log-dir | /logs | 当 application 完成时 application 日志上传到的 HDFS 目录。 |
yarn.nodemanager.remote-app-log-dir-suffix | logs | 添加到远程日志目录的后缀。日志会被聚合到 ${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam}。只有当开启日志聚合才有用 |
yarn.nodemanager.aux-services | mapreduce_shuffle | 为 Map Reduce 设置的 shuffle 服务 |
History Server 配置
参数 | 值 | 注释 |
---|---|---|
yarn.log-aggregation.retain-seconds | -1 | 在删除日志前保留的时长。-1禁用。注意,不要把该值设的太小 |
yarn.log-aggregation.retain-check-interval-seconds | -1 | 检查已聚合日志保留时间的时间间隔。如果设为0或负数,该值为1/10的yarn.log-aggregation.retain-seconds的值。注意,别把该值设的太小 |
MapReduce Application 配置
参数 | 值 | 注释 |
---|---|---|
mapreduce.framework.name | yarn | 将执行框架设为 Hadoop YARN |
mapreduce.map.memory.mb | 1536 | map 内存资源限制 |
mapreduce.map.java.opts | -Xmx1024M | map 的子 jvm 堆 size |
mapreduce.reduce.memory.mb | 3072 | reduce 内存资源限制 |
mapreduce.reduce.java.opts | -Xmx2560M | reduce 的子 jvm 堆 size |
mapreduce.task.io.sort.mb | 512 | 用于排序的内存 size 上限 |
mapreduce.task.io.sort.factor | 100 | 排序时的数据流合并 |
mapreduce.reduce.shuffle.parallelcopies | 50 |
MapReduce JobHistory服务配置:
参数 | 值 | 注释 |
---|---|---|
mapreduce.jobhistory.address | MapReduce JobHistory 服务的地址(host:port) | 默认端口是10020 |
mapreduce.jobhistory.webapp.address | MapReduce JobHistory 服务页面地址(host:port) | 默认端口是19888 |
mapreduce.jobhistory.intermediate-done-dir | /mr-history/tmp | MapReduce job 写 history 文件的目录 |
mapreduce.jobhistory.done-dir | /mr-history/done | MR JobHistory 服务管理 history 文件的目录 |
HDFS 和 YARN 是机架敏感的。 NameNode 和 ResourceManager 通过在管理员模块中调用 API resolve 来获得集群中 slaves 的机架信息。 API解析DNS到到机架ID。 可以通过配置项 topology.node.switch.mapping.impl 来配置要用的 site-specific 模块。
pass
通常,你选择集群中的一台机器作为 NameNode 和一台机器作为 ResourceManager 。剩余的机器同时作为 DataNode 和 NodeManager 并被称为 slaves。 在你的 conf/slaves 文件中列出所有的 slave 主机名或 ip,每项一行。
Hadoop通过 Apache通用日志框架使用 Apache log4j来记录日志。编辑 conf/log4j.properties 文件来自定义 Hadoop 守护进程的日志配置
一旦完成所有需要的配置,将所有配置文件分发到所有节点上的 HADOOP_CONF_DIR 目录下。
启动 Hadoop: 要启动 Hadoop 集群,你需要启动 HDFS 和 YARN 集群。
格式化 HDFS:
[hdfs]$ $HADOOP_PREFIX/bin/hdfs namenode -format <cluster_name>
启动 HDFS:
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode
停止 HDFS:
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop namenode
以 root 用户和指定的环境变量 HADOOP_SECURE_DN_USER 执行一个脚本来启动所有 slaves 上的 DataNodes:
[root]$ HADOOP_SECURE_DN_USER=hdfs $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start datanode
停止 DataNodes:
[root]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop datanode
启动 ResourceManager:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start resourcemanager
停止 ResourceManager:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop resourcemanager
执行一个脚本来启动所有 slaves 上的 NodeManagers:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start nodemanager
停止 NodeManagers:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop nodemanager
启动一个单机的 WebAppProxy 服务。以 yarn 用户启动。如果多台服务器用户负载均衡,那么需要在每台服务器上执行下面命令:
[yarn]$ $HADOOP_YARN_HOME/bin/yarn start proxyserver --config $HADOOP_CONF_DIR
停止 WebAppProxy:
[yarn]$ $HADOOP_YARN_HOME/bin/yarn stop proxyserver --config $HADOOP_CONF_DIR
启动 MapReduce JobHistory 服务,以 mapred 用户在指定机器上运行:
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh start historyserver --config $HADOOP_CONF_DIR
停止MapReduce JobHistory 服务:
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh stop historyserver --config $HADOOP_CONF_DIR
一旦 Hadoop 集群启动,通过以下页面检查各组件:
参数 | 值 | 注释 |
---|---|---|
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. |