Hadoop安装

     1. 安装前的准备

    安装hadoop首先需要在机器上安装合适版本的java(最新版本肯定没问题),并从Apache镜像中下载稳定版本的hadoop安装包。在集群中安装hadoop通常需要在所有机器上拷贝一份hadoop安装包,并解压缩到安装目录中。

    通常集群中一台机器专门被指定为NameNode,另一台机器专门被指定为ResourceManager。其它服务,例如web app proxy server和MapReduce Job history Server通常根据负载的变化,运行在专用硬件或共享的基础上。集群中其它的机器是DataNode和NodeManager,它们是slaves。

, hdfs-default.xml, yarn-default.xml and mapred-default.xml),机器特定的配置文件(etc/hadoop/core-site.xml, etc/hadoop/hdfs-site.xml, etc/hadoop/yarn-site.xml and etc/hadoop/mapred-site.xml)。另外你也可以通过设置etc/hadoop/hadoop-env.sh,etc/hadoop/yarn-env.sh,etc/hadoop/mapred-env.sh文件中的值,控制hadoop脚本,配置hadoop守护进程的运行环境。HDFS守护进程是NameNode, SecondaryNameNode, and DataNode进程,YARN守护进程是ResourceManager, NodeManager, WebAppProxy。如果有MapReduce作业运行,那么MapReduce Job History Server进程也将运行。对于大型集群,这些进程通常运行在不同的主机上。

    2. 配置hadoop守护进程运行环境

etc/hadoop/hadoop-env.sh,etc/hadoop/mapred-env.sh,etc/hadoop/yarn-env.sh脚本设置机器特定的运行环境。必须设置JAVA_HOME,可选的配置包括HADOOP_PID_DIR,HADOOP_LOG_DIR分别是hadoop守护进程id和日志文件路径,HADOOP_HEAPSIZE / YARN_HEAPSIZE设置守护进程JVM最大heap size。

    使用etc/hadoop/core-site.xml配置fs.defaultFS(NameNode URI),io.file.buffer.size(读写SequenceFiles时缓存大小)

    使用etc/hadoop/hdfs-site.xml配置dfs.namenode.name.dir(本地路径用于保存NameNode命名空间和操作日志),dfs.hosts /dfs.hosts.exclude(包含/排除的DataNode列表),dfs.blocksize(HDFS块大小),dfs.namenode.handler.count(NameNode处理来自DataNode的RPC服务线程数量),dfs.datanode.data.dir(DataNode保存数据的本地路径)

    3. NodeManager集群监测脚本,Hadoop提供了一个机制,管理员可以配置NodeManager运行脚本,监测集群的健康状态。监测脚本输出包括字符串“ERROR”,该节点的状态被报告为“unhealthy”,将被ResourceManager加入黑名单,后续不会有tasks分配到该节点。然而,NodeManager监测脚本一直运行,当该节点重新可用时,将自动被ResourceManager加入到集群中。节点的健康状态可以在Resource Manager Web Interface中看到。一些和监测脚本相关的参数可以在etc/hadoop/yarn-site.xml中设置。例如:yarn.nodemanager.health-checker.script.interval-ms设置监测脚本运行的时间间隔。

etc/hadoop/slaves文件中,逐行列出所有slave的主机名或者IP地址。Hadoop很多脚本将使用该文件,在多个节点上运行命令。当然,所有机器之间必须能够相互ssh通过。

    5. Hadoop Rack(机架)敏感,利用节点之间的拓扑结构,提高集群的性能和安全性。Hadoop守护进程通过启动一个管理员配置模块,获取机架信息。在启动HDFS前,一般需要配置机架信息。

etc/hadoop/log4j.properties定制日志配置。

HADOOP_CONF_DIR目录,该目录在所有机器中必须相同。一般地,HDFS和YARN相关进程采用不同的用户名启动,在大多数配置中,HDFS采用“hdfs”用户名,YARN采用“yarn”用户名。



MapReduce性能调优

    1. Map任务输出的键值对,首先被写入内存(MapOutputBuffer)中,该内存大小默认是100MB,可以通过参数io.sort.mb调整。当MapOutputBuffer剩余空间小于80%(可以通过参数io.sort.spill.percent调整)时,程序开始将内存中的数据写入磁盘中,这也称为spill。

    2. 当Map任务部分完成或者全部完成后,如果Map有输出,就会生成一个或者多个spill文件。在Map完全结束之前,还有一个merge操作,将这些spill文件合并。参数io.sort.factor设置最多能有多少个spill文件参与一次merge操作,默认值是10个。

    3. 当job指定了Combiner的时候,在map端会调用Combiner定义的函数对Map输出结果进行合并。Combiner函数运行的时机可能是在merge操作之后,也可能是之前。通过min.num.spill.for.combine参数,默认为3,当spill文件大于3个的时候,Combiner函数会在merge产生结果文件之前运行。

    4. Map任务的中间结果,spill文件以及最终的merger文件都是支持压缩的,参数mapred.compress.map.output设置为true时,Map产生的中间数据会先压缩,然后再写入磁盘中,这样磁盘IO会减少,但是会消耗计算资源用于数据的压缩和解压。根据观察,大部分job的瓶颈都不是cpu,除非运算逻辑异常复杂,所以对Map中间结果进行压缩通常是有利的。参数mapred.map.output.compression.codec指定具体的压缩方式。

io.sort.factor也同时影响Reducer端执行一次merge操作的数据分区数量。mapred.job.shuffle.input.buffer.percent调节shuffle数据使用reduce内存的比例,默认为 70%。mapreduce.reduce.java.opts参数设置Reducer任务最大heap使用量。参数mapred.job.shuffle.merge.percent设置shuffle数据开始执行merge操作时,所占内存比例,默认是66%。参数mapred.job.reduce.input.buffer.percent,默认是0.0,调节Reducer执行reduce函数时,读取已经sort、merge好的数据的内存缓存大小。