五分钟深入 Hadoop 内核
来源:互联网 发布:java工程师就业班 编辑:程序博客网 时间:2024/05/26 02:54
前一篇系列文章<五分钟零基础理解 Hadoop>介绍了 Hadoop到底是怎么回事。下面几篇文章介绍 Hadoop的核心框架,为后面讨论 Hadoop面试题打好基础!
回顾
上篇文章我们说到,Hadoop的工作下图所示,负责把 mapper function装载到要运行 mapper的机器上,然后执行 mapper function,之后负责把 mapper 的结果 shuffle到要运行 reducer的机器上,下载 reducer运行得到最终结果。
那么下面,我们就通过学习Hadoop的 component架构,来理解 Hadoop 是怎么做到这几步的。
架构
JobTracker
我们上面说了:Hadoop是一个很强大的 Framework,那用户怎么使用呢?Hadoop提供了一个叫做 JobTracker的 component,去等待用户提交的Hadoop任务。
具体说来,用户告诉 JobTracker要运行什么 mapper function和 reducer function,这个非常 make sense对不对?Hadoop就是要帮助用户运行mapper和 reducer,不知道他们是什么样的怎么行?
那 Mapper 和 Reducer长什么样呢?
我们用 Java举例:用户需要用一个 class实现 Hadoop定义的 Mapper接口,用户在这个 class里提供 mapper function的具体实现(当然 Hadoop也支持别的语言),同样的 reducer function也是用户实现 Reducer接口的 class.
既然是 java,这两个 class就会存在 jar中,所以用户要告诉 JobTracker这个 jar的路径是什么,也要告诉这个 jar里,哪个 class是 mapper,哪个是 reducer.只有这样,JobTracker才能帮助用户把 mapper function和 reducer function部署到要运行的机器上。
除此之外,用户还要告诉JobTracker要处理的数据在哪里。实际上,数据存储使用的是 HDFS文件系统。我们之后会为大家详细介绍,这里请大家把 HDFS想象成普通电脑里的文件系统就好,使用文件夹结构,比如 Linux下的 /root, /usr, /etc ……
特别的是,HDFS为了扩大容量,把文件存在很多台机器上,但用户不需要知道分布的具体细节:只要告诉 HDFS我要哪个目录下的文件,HDFS就会很神奇的找到相应的机器为用户读取数据(这就是分布式文件系统的特点)。
用户需要告诉JobTracker这个任务里需要处理的数据数据存在HDFS的哪个目录下面就 OK啦。同样的,用户也要告诉 JobTracker这个 Hadoop任务的输出在哪里,通常也是一个HDFS上的目录。
JobTracker是以一个进程的形式运行的,一直等待用户提交的任务。说白了,就好像大家玩过的扫雷:你打开这个游戏后,那个窗口一直等待你点击鼠标。我们要记住的是一个 Hadoop cluster 里只有一个 JobTracker.
JobTracker接收了用户提交的任务之后它做什么呢?
它就要挑选机器来执行 mapper /reducer function.
我们刚才说过,任务要处理的数据被 HDFS 管理。用户是不知道数据存在哪些机器上的,而只要告诉 HDFS一个目录,它就知道到哪台机器取。
这样JobTracker告诉 HDFS用户提交的输入数据的路径,HDFS就会告诉 JobTracker数据在哪台机器上,Job Tracker也就可以把 mapper function运行在那台机器上,这样就可以达到非常好的运行效率:mapper function处理本台机器上的数据。
我们知道 HDFS和 Hadoop运行在一组机器上,那这些机器有可能还在运行别的软件,或者处理之前提交的任务。这就有可能造成:明明数据就在 Host A 上,但是 Host A太忙,没有空闲资源运行 mapper function,这种情况怎么办呢?
这样的情况下,JobTracker可能就要退而求其次了:把mapper function 运行在一个离数据很近的机器上,比如和数据所在机器网络连接速度很快的机器 Host B.这样,在数据从 Host A读取到 Host B之后,mapper function 就可以的继续执行。
说起来简单,但是前提是 JobTracker 需要知道每台机器忙不忙,否则它怎么知道存数据的当前机器不能用,或者选择另一个不忙的机器呢?
Hadoop所做的就是为每一台机器定义 N个 slot,就是能同时运行 N个 mapper function或者 reducer function,用几个 slot被占用评断机器忙不忙。
一个机器有几个 slot是机器管理员根据机器 cpu和内存情况设定的,在用户提交任务以前就定义好了。Jobtracker通过追踪每一台机器上还有几个 slot可以用来判断机器的繁忙程度。
这里你是不是觉得 Hadoop 绕弯子?直接看每台机器 cpu和 memory不就好了,为什么还通过 slot表示?恭喜你,你已经有 Hadoop 2.0 architect 的水平了:)我们之后讨论哈。
之前说过JobTracker只是运行在一台机器上的一个进程,那它如何知道其他机器有哪些 slot呢?
答案是:它是通过TaskTracker来完成的。
TaskTracker
TaskTracker是运行在每一台机器上的一个 daemon.它的首要任务就是 keep track of本台机器有哪些 slot.
这个工作比较简单:TaskTracker启动时,它从机器管理员写的config file 里读出这台机器有几个 slot;当 JobTracker分配给这台机器一个 mapper function或者 reducer function,那 TaskTracker就会记录下 slot减少一个。
TaskTracker and Slots
TaskTracker有一个 heartbeat机制,就是每隔几秒钟或者几分钟向 JobTracker发一个信息,告之当前机器还有几个 free slot.这样,JobTracker就知道所有 Hadoop机器资源使用情况。那么下次 JobTracker收到用户提交的任务时,就有足够的信息决定向哪个机器分配 mapper或 reducer任务。
JobTracker task allocation to TaskTrackers
那么当JobTracker决定了给机器 a, c, e,f (out of机器 a-h)分配任务之后,JobTracker就向每一台机器发消息,告诉它你要执行的 mapper或者 reducer function是什么。
在Java里,这一步就是告诉每一台机器 jar 的路径,以及 mapper class和 reducer class的名称。
如果分配的是 mapperfunction, JobTracker 还要告诉 TaskTracker mapper要处理的数据路径。我们之前提到了 JobTracker会尽可能把 mapper分配到数据所在的机器,这样 mapper可以从本地文件读取数据了。
当TaskTracker得知所有这些信息之后,就可以运行mapper/reducer.
我们之前说 Hadoop会去执行 mapper function和 reducer function, TaskTracker就是 Hadoop里负责这个任务的 component.
mapper function和 reducer function运行结束以后,TaskTracker会报告给 JobTracker运行结果。当所有 mapper和 reducer运行结束后,整个 Job就完成了!
Hadoop / MapReduce作为非常成熟的大数据架构,已经被部署在很多知名公司的实际系统中、发挥着重要作用,比如 Amazon, Facebook, Apple等等。
除了并行处理数据外的优势外,其对海量数据的处理和优化也非常有特色。我们会在之后的短文中为大家分享更多优化和可以配置的技巧,让大家轻松面对大数据里最刁钻的面试题。- 五分钟深入 Hadoop 内核
- 五分钟初识Hadoop
- Hadoop五分钟入门指南
- Hadoop五分钟入门指南
- 五分钟搞懂Hadoop
- 五分钟深入理解Handler
- 五分钟零基础搞懂Hadoop
- 深入介绍Linux内核(五)
- hadoop深入研究:(五)——Archives
- Hadoop深入研究:(五)——Archives
- hadoop深入研究:(五)——Archives
- 《深入理解LINUX内核》笔记(五)
- 五分钟
- 读书笔记之《深入理解Linux内核》第四、五、六章
- 深入php内核五(开始创建扩展)
- Linux内核分析(五):系统调用深入分析
- 五分钟教会五笔
- 五分钟教会五笔
- jQuery EasyUI使用教程:添加分页到树网格中
- redis的安装
- [Python] SEU-jwc验证码识别器设计思路
- 2.2 Hello World
- Es6特性
- 五分钟深入 Hadoop 内核
- Android函数工具(读取InputStream到String字符串)
- tjut 3974
- 导出数据到excel报connection reset和broken pipe异常
- HDFS自定义小文件分析功能
- apk交互时保留页面框架
- 给solr配置中文分词器
- android studio 中svn不能清理代码的解决
- 4.redis的简单使用