对于Hadoop来说,是通过在DataNode中启动Map/Reduce java进程的方式来实现分布式计算处理的,那么就从源码层简要分析一下hadoop中启动Map/Reduce任务的过程。
首先,对于Map/Reduce端启动的任务,都是通过一些参数来控制java opts的,mapreduce.map.java.opts,mapreduce.reduce.java.opts,这些参数都在MRJobConfig类中,拿map.java.opts举例来说,org.apache.hadoop.mapred.MapReduceChildJVM类中使用了这个参数,用来构造Map或Reduce端的JVM,在下面方法中拿到了ChildJavaOpts:
private static String getChildJavaOpts(JobConf jobConf, boolean isMapTask)
如果是MapTask,JavaOpts的获得具体方法内容如下(Reduce端逻辑基本一致):
if (isMapTask) { userClasspath = jobConf.get( JobConf.MAPRED_MAP_TASK_JAVA_OPTS, jobConf.get( JobConf.MAPRED_TASK_JAVA_OPTS, JobConf.DEFAULT_MAPRED_TASK_JAVA_OPTS) ); adminClasspath = jobConf.get( MRJobConfig.MAPRED_MAP_ADMIN_JAVA_OPTS, MRJobConfig.DEFAULT_MAPRED_ADMIN_JAVA_OPTS); // Add admin classpath first so it can be overridden by user. return adminClasspath + " " + userClasspath;
userClassPath按照下面的参数顺序获得:
mapreduce.map.java.opts, mapred.child.java.opts, DEFAULT_MAPRED_TASK_JAVA_OPTS = "-Xmx200m”;
adminClassPath要获得的参数的基本顺序:
mapreduce.admin.map.child.java.opts, DEFAULT_MAPRED_ADMIN_JAVA_OPTS ="-Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN ";
最后,由于在JVM启动的参数中,后面能够覆盖掉前面的,因此userClassPath的同个选项的设置是可以覆盖adminClassPath,adminClassPath是不能保证所有参数不能被覆盖。
从源码端向上走,跳转到方法:
public static List<String> getVMCommand(InetSocketAddress taskAttemptListenerAddr, Task task, ID jvmID)
从这个方法中可以看到一个隐藏的设置,如果在选项中使用了@taskid@,是可以被替换成具体的attemptID的。
String javaOpts = getChildJavaOpts(conf, task.isMapTask()); javaOpts = javaOpts.replace("@taskid@", attemptID.toString());
代码中也以GC为例子,在注释中举例说明用法:
// Add child (task) java-vm options. // // The following symbols if present in mapred.{map|reduce}.child.java.opts // value are replaced: // + @taskid@ is interpolated with value of TaskID. // Other occurrences of @ will not be altered. // // Example with multiple arguments and substitutions, showing // jvm GC logging, and start of a passwordless JVM JMX agent so can // connect with jconsole and the likes to watch child memory, threads // and get thread dumps. // // <property> // <name>mapred.map.child.java.opts</name> // <value>-Xmx 512M -verbose:gc -Xloggc:/tmp/@taskid@.gc \ // -Dcom.sun.management.jmxremote.authenticate=false \ // -Dcom.sun.management.jmxremote.ssl=false \ // </value> // </property> // // <property> // <name>mapred.reduce.child.java.opts</name> // <value>-Xmx 1024M -verbose:gc -Xloggc:/tmp/@taskid@.gc \ // -Dcom.sun.management.jmxremote.authenticate=false \ // -Dcom.sun.management.jmxremote.ssl=false \ // </value> // </property> //
一般情况下,我们在打印gc日志时,需要用-Xloggc:指定具体的目录,但是在MapReduce任务中你无法指定,因为可能两个Map会在同一台机器上执行,那样就肯定会发生gc文件覆盖,而实用@taskid@就可以避免这个问题。同样适用于OOM导致的堆栈打印避免文件意外被覆盖。
还会默认增加一个参数,用来设置java的临时文件夹(所有临时文件的建立都在这个文件夹,比如File.createTempFile):
vargs.add("-Djava.io.tmpdir=" + childTmpDir);
主类为:
org.apache.hadoop.mapred.YarnChild
一个YarnChild进程的最终完整命令为:
/usr/java/jdk1.7.0_11//bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx2048M -Djava.io.tmpdir=/home/data5/hdfsdir/nm-local-dir/usercache/xxx/appcache/application_1413206225298_36914/container_1413206225298_36914_01_000098/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/home/workspace/hadoop/logs/userlogs/application_1413206225298_36914/container_1413206225298_36914_01_000098 -Dyarn.app.container.log.filesize=209715200 -Dhadoop.root.logger=INFO,CLA org.apache.hadoop.mapred.YarnChild 192.168.7.26 21298 attempt_1413206225298_36914_r_000001_0 98
从源码端来分析该命令是如何生成的:
- $JAVA_HOME: /usr/java/jdk1.7.0_11/
- 源码中写死: /bin/java
- mapreduce.admin.map.child.java.opts:如果不设置,使用-Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN;
- mapreduce.map.java.opts: Xmx2048M;
- 源码中添加:-Djava.io.tmpdir=/home/data5/hdfsdir/nm-local-dir/usercache/tong/appcache/application_1413206225298_36914/container_1413206225298_36914_01_000098/tmp;
- org.apache.hadoop.mapred.MapReduceChildJVM.setLog4jProperties中设置log4j,包括日志级别,日志大小等:-Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/home/workspace/hadoop/logs/userlogs/application_1413206225298_36914/container_1413206225298_36914_01_000098 -Dyarn.app.container.log.filesize=209715200 -Dhadoop.root.logger=INFO,CLA;
- 主类:org.apache.hadoop.mapred.YarnChild;
- TaskAttempt的主机地址:192.168.7.xx;
- TaskAttempt的主机端口:212xx;
- TaskAttempt ID:attempt_1413206225298_36914_r_000001_0;
- JVMID:98(这是干啥的不太清楚);
最后将进程的正常和异常输出重定向:
// Finally add the jvmID vargs.add("1>" + getTaskLogFile(TaskLog.LogName.STDOUT)); vargs.add("2>" + getTaskLogFile(TaskLog.LogName.STDERR));
相关推荐
定义Reduce任务中可用于拉取Map输出数据的输入缓冲区大小的百分比。 41. mapreduce.reduce.shuffle.memory.limit.percent 定义用于Shuffle的内存限制的百分比。 42. mapreduce.shuffle.ssl.enabled 指示是否使用...
Hadoop是一款能够高效处理大规模数据集的分布式计算框架,其核心组成部分之一就是MapReduce引擎,它通过Map和Reduce两个基本步骤来实现数据的并行处理。在这一过程中,任务的状态管理至关重要,而`TaskStatus`类正是...
7. **启动Map/Reduce** ``` $bin/start-mapred.sh ``` 类似于启动HDFS的脚本,该命令启动MapReduce服务,包括JobTracker和所有由`slaves`配置文件列出的TaskTracker。 8. **停止HDFS** ``` $bin/stop-dfs.sh ...
- **Shuffle过程**:Map任务完成后,将中间结果按照键值进行分区和排序,然后传递给Reduce任务。 - **Reduce任务**:每个Reduce任务将接收到相同键的所有值,并对其进行汇总处理,最终生成输出结果。 #### 3. ...
MapReduce由Google提出,其核心思想是将复杂的分布式计算过程分为两个主要阶段:Map阶段和Reduce阶段。Map阶段负责数据的预处理,将原始输入数据分割成一系列键值对;Reduce阶段则将Map阶段生成的中间结果进行聚合,...
- **Map和Reduce**:MapReduce将大数据处理过程分为两个阶段:Map阶段负责将原始数据拆分成多个子任务进行处理;Reduce阶段则负责汇总各个子任务的结果,生成最终输出。 - **Java MapReduce**:提供了详细的Java API...
使用eclipse和maven的Hadoop Mapreduce示例:日志文件分析:本文简要概述了如何使用Eclipse和maven应用map reduce来计算每天发生的日志消息类型的数量。 先决条件: • 虚拟机上的Hadoop 设置。 • Java 版本 6 ...
- **性能调优**: 分析了影响MapReduce任务性能的因素,并提出了一些有效的优化策略。 #### 七、Hadoop Hive SQL 语法解释 - **网址**: [Hadoop Hive SQL 语法解释](http://jeffxie.blog.51cto.com/1365360/317524)...
它将大型任务分解为小规模的Map任务和Reduce任务,这些任务在多台节点上并行执行,以提高处理效率。 在WordCount案例中,Mapper负责读取输入数据(通常是文本文件),对每一行进行切分,生成键值对<单词,1>。这个...
- **核心算法**:MapReduce通过两个主要阶段——Map阶段和Reduce阶段——来处理数据。 - **Map阶段**:将输入数据分割成小块,每个小块被单独处理,并输出一系列中间键值对。 - **Reduce阶段**:将来自Map阶段的...
本学习笔记主要涵盖了Hadoop的基本概念、MapReduce计算模型以及HDFS分布式文件系统的深入解析,并对比了Hadoop与其他数据分析方式的区别,同时还涉及到了Hive作为数据仓库工具的简要介绍。 一、背景 随着互联网的...
MapTask和ReduceTask是Hadoop MapReduce框架中的核心类,负责执行Map和Reduce任务。MapTask接收InputSplit,通过反射机制创建InputSplit实例,然后运行Mapper。ReduceTask则负责接收和处理来自多个Map任务的中间结果...
在了解“阴影:在MapReduce中利用有效改组的选择能力”这一研究课题之前,我们首先需要对MapReduce框架进行简要介绍。MapReduce是一个由Google开发的编程模型和处理大规模数据集的相关实现,它允许开发者在不了解...
它允许开发者编写Map(映射)函数和Reduce(归约)函数来处理数据集。这种模型特别适合于处理大数据集,因为其工作原理是将复杂计算分解为多个可并行处理的小任务。 6. Hadoop实践应用 本书强调实践应用,从基础的...
9. **MapReduce**:MapReduce是处理大规模数据的编程模型,包括Map阶段(数据切分和映射)和Reduce阶段(数据聚合和总结)。它可以并行处理任务,提高计算效率。 10. **ZooKeeper**:ZooKeeper是一个分布式的协调...
Map的工作原理是将复杂的任务分解为多个小任务,保证这些小任务能在单个计算机上运行,从而提高数据存储和分析的效率。Reduce的工作原理是将Map阶段得到的中间结果进行汇总和合并,最终得到最终的计算结果。...
- **并发度调整**:根据任务特点调整map和reduce的并发数量。 - **缓存机制**:优化缓存策略,减少磁盘I/O操作。 #### 九、配置检查 - **Cloudera Manager中的属性设置**:利用Cloudera Manager界面配置相关属性。...
第四章《MapReduce入门编程》深入MapReduce编程模型,解析Map和Reduce阶段的工作原理。这一章通过实例演示如何编写Java MapReduce程序,讲解输入输出格式、分区器、Combiner等相关概念,帮助理解MapReduce的执行流程...
- **优化技巧**:书中还介绍了多种优化MapReduce作业性能的方法,例如使用Combiner减少网络传输的数据量、合理设置map和reduce任务的数量等。 #### 四、Hadoop生态系统扩展组件 - **HBase**:基于Hadoop的一个...
MapReduce将处理过程分为两个阶段:Map(映射)阶段和Reduce(归约)阶段。在Map阶段,系统将输入数据分割为独立的块,然后由Map函数处理,生成一系列中间的键值对。在Reduce阶段,系统会将具有相同键的所有中间值...