| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Hadoop源码分析(一) -> 正文阅读 |
|
[大数据]Hadoop源码分析(一) |
2021SC@SDUSC 要分析Hadoop中MapReduce部分的源码,我们需要先了解MapReduce的基本流程: 以 Hadoop 带的 wordcount 为例子(下面是启动行):
用户提交一个任务以后,该任务由 JobTracker 协调,先执行 Map 阶段(图中 M1,M2 和 M3),然后执行 Reduce 阶段(图中 R1 和 R2)。Map 阶段和 Reduce 阶段动作都受TaskTracker监控,并运行在独立于TaskTracker的Java虚拟机中。 我们的输入和输出都是 HDFS 上的目录(如上图所示)。输入由 InputFormat 接口描述,它的实现如 ASCII 文件,JDBC 数据库等,分删处理对应的数据源,并提供了数据的一些特征。通过 InputFormat 实现,可以获取 InputSplit 接口的实现,这个实现用于对数据进行划分(图中的 splite1 刡 splite5,就是划分以后的结果),同时从 InputFormat 也可以获取 RecordReader接口的实现,并从输入中生成<k,v>对。 有了<k,v>,就可以开始做 map 操作了。map 操作通过 context.collect(最终通过 OutputCollector. collect)将结果写入 context 中。当 Mapper 的输出被收集后,它们会被 Partitioner 类以指定的方式区分地写出到输出文件里。我们可以为 Mapper 提供 Combiner,在 Mapper输出它的<k,v>时,键值对不会被马上写到输出里,他们会被收集在 list 里(一个 key 值一个 list),当写入一定数量的键值对时,这部 Map 的动作做完以后,进入 Reduce 阶段。返个阶段分 3 个步骤:混洗(Shuffle),排序(sort)和 reduce。 混洗阶段,Hadoop 的 MapReduce 框架会根据 Map 结果中的 key,将相关的结果传输到某一个 Reducer 上(多个 Mapper产生的同一个 key 的中间结果分布在不同的机器上,这一步结束后,他们传输都到了处理返个 key 的 Reducer 的机器上)。这个步骤中的文件传输使用了HTTP 协议。 排序和混洗是一块进行的,这个阶段将来自不同 Mapper 具有相同 key 值的<key,value>对合并到一起。Reduce 阶段,上面通过 Shuffle 和 sort 后得到的<key, (list of values)>会送到 Reducer. reduce 方法中处理,输出的结果通过 OutputFormat,输出到 DFS 中。 以上就是MapReduce的基本流程。 下面分析 org.apache.hadoop.mapreduce.Job 类: Job类本身是继承自JobContextImpl,并实现了JobContext接口。JobContextImpl是JobContext接口的一个简单实现,给Job类中的相关方法提供了一系列的默认实现。
在前3个构造函数的实现中,最终会由configuration生成新的cluster类,从而调用第5个构造函数,而第4和第6个构造函数也会调用第5个构造函数,因此,第5个构造函数是实际上Job类构造的实现。Cluster类提供了访问map/reduce cluster的一系列方法。而Configuration类提供了对于配置信息的访问方法。 除了上面列出的构造函数,Job类还提供了一系列对应的工厂方法:
通过job类提供的构造函数,我们可以创建一个job对象,利用job类的一些方法,我们可以设置相应的属性,使job对象正常运行,以下是job类中常用的方法:
在Java doc中,对于这个function的注释是:Set the Jar by finding where a given class came from,即通过对应的类来设置Jar。 同时,Job类还提供另外一个方法,直接设值Job的Jar文件:setJar(String jar),通过指定全路径,直接设值Job的jar文件。
该方法用来设置Job的Mapper,这里,输入的参数应该是一个Mapper类的子类的class属性。
该方法用来设置Job的Combiner。
用于设置Job的Reducer。
用于设置Job的输出Key值所属的类。
对应第五点,用于设置Job的输出Value值所属的类。
这里,我们要注意,FileInputFormat的全路径是org.apache.hadoop.mapreduce.lib.input.FileInputFormat,因为原来也有一个FileInputFormat在mapred包下面,那个类已经是Deprecated的类,在新的版本当中,采用org.apache.hadoop.mapreduce.lib.input.FileInputFormat来替换。addInputPath函数将输入的path加入到job的INPUT_DIR中去。FileInputFormat类提供了几个类似的类来实现相关的功能,如:setInputPaths(Job, String),addInputPaths(Job, String),setInputPaths(Job, Path…),addInputPath(Job, Path)。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:55:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |