一、概述
HDFS集群主要由NameNode和DataNodes组成,前者负责管理文件系统元数据,后者用于保存真正的数据。
主要特性:
1. 可使用商品级硬件(如普通PC)进行分布式存储和分布式计算。高容错、可扩展、易伸缩。
2. 可根据不同的需求进行不同的配置。
3. Hadoop使用Java编写,支持各主流平台。
4. 支持使用类似shell命令与HDFS进行交互。
5. NameNode和DataNodes集成在了web服务器中,可方便使用web查看集群状态。
6. 其他特性:文件权限验证、机架感知、安全模式、fsck等等。
以下笔记由hadoop 2.7.2文档而来。
二、Web界面
默认的配置中,NameNode可通过http://namenode-name:50070/来访问(其中的namenode-name是你自己配置的namenode主机名)。使用Web界面可以查看集群状态、浏览文件系统、查看DataNodes等。
三、Hadoop集群安装
略,请参考文档,或自行百度。
四、非安全模式下的Hadoop配置
1. 配置文件主要有两种:
- 只读的默认配置 ——
- 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
2. 控制Hadoop脚本行为:
- etc/hadoop/hadoop-env.sh
- etc/hadoop/yarn-env.sh
- etc/hadoop/mapred-env.sh
3. Hadoop后台进程:
- Hadoop后台进程一般各自运行在独立的主机上
- HDFS后台进程
- NameNode, SecondaryNameNode, DataNode
- YARN后台进程
- ResourceManager, NodeManager, WebAppProxy
- MapReduce后台进程(若有)
- Job History Server
4. Hadoop后台进程环境配置:
- Hadoop进程的环境变量在以下3个脚本中设置
- etc/hadoop/hadoop-env.sh
- etc/hadoop/yarn-env.sh
- etc/hadoop/mapred-env.sh
- 各后台进程的环境变量如下:
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 |
MapReduce Job History Server | HADOOP_JOB_HISTORYSERVER_OPTS |
比如,对NameNode的设置可以如下:
export HADOOP_NAMENODE_OPTS=”-Xmx30720m -XX:+UseParallelGC -Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS}”
5. Hadoop后台进程配置:
- etc/hadoop/core-site.xml
Parameter | Value | Notes |
fs.defaultFS | NameNode URI | hdfs://主机名:端口/ |
io.file.buffer.size | 131072 | 序列化文件的读/写缓存大小 |
- etc/hadoop/hdfs-site.xml
NameNode的配置
Parameter | Value | Notes |
dfs.namenode.name.dir | 本地文件系统上,NameNode保存命名空间和处理日志的路径 | 如果值指定为用逗号分隔的目录列表,命名表会复制到所有目录下做一个冗余。 |
dfs.hosts /dfs.hosts.exclude | 许可/拒绝的DataNodes列表 | 如果有需要的话,可以使用该属性来指定哪些DataNodes可用/不可用。 |
dfs.blocksize | 268435456 | 大型文件系统可指定HDFS的块大小为256MB |
dfs.namenode.handler.count | 100 | 指定有多少NameNode server线程来处理来自大量DataNodes的RPCs(远程过程调用) |
DataNode的配置
Parameter | Value | Notes |
dfs.datanode.data.dir | 一个DataNode将其数据块保存在本地文件系统上的指定路径中,多个路径使用逗号分隔 | 如果路径有多个,那么数据会保存在所有的目录下。一般而言,多个路径位于不同的device下。 |
- etc/hadoop/yarn-site.xml
ResourceManager和NodeManager共有的配置
Parameter | Value | Notes |
yarn.acl.enable | true/false | 是否开启ACLs,默认关闭 |
yarn.admin.acl | Admin ACL | ACL可设置集群的管理员。 ACLs是用逗号分隔的用户空间和用户组。默认值为* 表示任何人可以访问。空白表示无人可访问。 |
yarn.log-aggregation-enable | false | 设置是否允许日志聚集 |
ResourceManager的配置
Parameter | Value | Notes |
yarn.resourcemanager.address | ResourceManager 主机名:端口号。用户向这里提交作业。 | 如果设置了主机名:端口号,会覆盖在 yarn.resourcemanager.hostname中设置的主机名 |
yarn.resourcemanager.scheduler.address | ResourceManager host:port ApplicationMasters向这里发出资源申请。 | 如果设置了主机名:端口号, 会覆盖在 yarn.resourcemanager.hostnamez中设置的主机名 |
yarn.resourcemanager.resource-tracker.address | ResourceManager host:port 供NodeManager使用 | 如果设置了主机名:端口号, 会覆盖在 yarn.resourcemanager.hostnamez中设置的主机名 |
yarn.resourcemanager.admin.address | ResourceManager host:port 供管理命令使用 | 如果设置了主机名:端口号, 会覆盖在 yarn.resourcemanager.hostnamez中设置的主机名 |
yarn.resourcemanager.webapp.address | ResourceManager web界面 host:port. | 如果设置了主机名:端口号, 会覆盖在 yarn.resourcemanager.hostnamez中设置的主机名 |
yarn.resourcemanager.hostname | ResourceManager 主机. | 单独的主机名可以在所有yarn.resourcemanager*address 中设置。端口号是默认的。 |
yarn.resourcemanager.scheduler.class | ResourceManager Scheduler class. | CapacityScheduler (推荐), FairScheduler (推荐), or FifoScheduler |
yarn.scheduler.minimum-allocation-mb | 分配给Resource Manager容器最小内存。 | 单位是MB |
yarn.scheduler.maximum-allocation-mb | 分配给 Resource Manager容器的最大内存 | 单位是MB |
yarn.resourcemanager.nodes.include-path/yarn.resourcemanager.nodes.exclude-path | 许可/拒绝的NodeManager列表 | If necessary, use these files to control the list of allowable NodeManagers. |
NodeManager的配置
Parameter | Value | Notes |
yarn.nodemanager.resource.memory-mb | NodeManager可用的屋里内存 | Defines total available resources on the NodeManager to be made available to running containers |
yarn.nodemanager.vmem-pmem-ratio | 任务使用的虚拟内存可超出物理内存的最大比率 | The virtual memory usage of each task may exceed its physical memory limit by this ratio. The total amount of virtual memory used by tasks on the NodeManager may exceed its physical memory usage by this ratio. |
yarn.nodemanager.local-dirs | 中间结果写入的本地文件系统路径列表,用逗号隔开 | Multiple paths help spread disk i/o. |
yarn.nodemanager.log-dirs | 日志写入的本地文件系统路径列表,用逗号隔开 | Multiple paths help spread disk i/o. |
yarn.nodemanager.log.retain-seconds | 10800 | NodeManager保存日志文件的默认时长(单位为秒),仅适用于log-aggregation被关闭时。 |
yarn.nodemanager.remote-app-log-dir | /logs | 应用程序结束后,程序日志移动到HDFS 上的相应目录。需要设置转移许可权限。仅适用于log-aggregation开启时。 |
yarn.nodemanager.remote-app-log-dir-suffix | logs | 远程日志目录后缀。日志将被收集到${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam}。仅适用于log-aggregation开启时 |
yarn.nodemanager.aux-services | mapreduce_shuffle | MapReduce程序所需的Shuffle 服务 |
History Server的配置
Parameter | Value | Notes |
yarn.log-aggregation.retain-seconds | -1 | 收集到的日志保存多久。 -1 表示不保存。注意,如果该属性值设置的太小,name node可能会收到垃圾信息。 |
yarn.log-aggregation.retain-check-interval-seconds | -1 | 聚集日志保存时间检查间隔。如果设为0或负值,值被解释成聚集日志保存时间的1/10。注意,如果该属性值设置的太小,name node可能会收到垃圾信息。 |
- etc/hadoop/mapred-site.xml
MapReduce Applications的配置
Parameter | Value | Notes |
mapreduce.framework.name | yarn | 管理框架设为 Hadoop YARN. |
mapreduce.map.memory.mb | 1536 | Larger resource limit for maps. |
mapreduce.map.java.opts | -Xmx1024M | Larger heap-size for child jvms of maps. |
mapreduce.reduce.memory.mb | 3072 | Larger resource limit for reduces. |
mapreduce.reduce.java.opts | -Xmx2560M | Larger heap-size for child jvms of reduces. |
mapreduce.task.io.sort.mb | 512 | 更大的数值有利于数据的高效排序 |
mapreduce.task.io.sort.factor | 100 | 排序时,每次将合并更多的流 |
mapreduce.reduce.shuffle.parallelcopies | 50 | map输出数据量较大时,该属性可使reduce在抓取map结果时并行更多的拷贝 |
MapReduce JobHistory的配置
Parameter | Value | Notes |
mapreduce.jobhistory.address | MapReduce JobHistory Server host:port | Default port is 10020. |
mapreduce.jobhistory.webapp.address | MapReduce JobHistory Server Web UIhost:port | Default port is 19888. |
mapreduce.jobhistory.intermediate-done-dir | /mr-history/tmp | MapReduce作业将history文件写入配置的目录中 |
mapreduce.jobhistory.done-dir | /mr-history/done | MR JobHistory Server管理history文件的目录 |
五、NodeManagers状态监控
管理员可以提供一个脚本让NodeManager定期运行,检测节点的状态。如果脚本检测出一个节点处于不健康状态,必须向标准输出打印一行以”ERROR”开头的信息。NodeManager定期运行脚本并检查脚本输出。如果脚本的输出包含字符串”ERROR”,将报告节点为不健康状态,并且ResourceManager会将该节点加入黑名单。以后的任务将不会在该几点上运行。不过,如果在NodeManager之后的检测中发现改节点又恢复健康状态,则该节点又会从黑名单删除。
节点状态监控脚本的控制参数在etc/hadoop/yarn-site.xml中:
Parameter | Value | Notes |
yarn.nodemanager.health-checker.script.path | 脚本路径 | Script to check for node’s health status. |
yarn.nodemanager.health-checker.script.opts | 脚本参数 | Options for script to check for node’s health status. |
yarn.nodemanager.health-checker.script.interval-ms | 脚本运行间隔 | Time interval for running health script. |
yarn.nodemanager.health-checker.script.timeout-ms | 脚本超时时间 | Timeout for health script execution. |
如果仅仅是因为磁盘出问题,监控脚本不应该打印”ERROR”。NodeManager具备定期检测本地磁盘健康状态的能力(特别是检测nodemanager-local-dirs和nodemanager-log-dirs),一旦不健康的目录数量达到属性yarn.nodemanager.disk-health-checker.min-healthy-disks设定的阈值,整个节点就被标记为不健康,并报告给ResourceManager。引导盘要么做raid,要么也纳入脚本监控。
六、slaves文件
etc/hadoop/slaves文件中列出了所有从节点的主机名或IP地址,每行一个。helper脚本会使用etc/hadoop/slaves文件同时在多台主机上运行命令。这个功能的前提是配置了ssh信任关系(通过ssh免密码登录或其他方式,比如Kerberos认证)。
七、机架感知
许多Hadoop组件都使用了机架感知,并且利用网络拓扑来获得性能和安全性的平衡。Hadoop守护进程通过调用管理员配置的模块来获取集群上从节点的机架信息。详情请参见 Rack Awareness。
强烈建议启动HDFS之前,先配置好机架感知。
八、日志
Hadoop使用 Apache log4j 来记录日志。可通过 etc/hadoop/log4j.properties 文件来定义Hadoop守护进程的日志配置。