一直都想学习分布式和大数据,但是之前被搭建环境给劝退了。
如今在公司不用自己搭建环境,了一些概念和操作后就可以动手测试,美滋滋。
架构:
- HDFS: 分布式文件存储
- YARN: 分布式资源管理
- MapReduce: 分布式计算
HDFS和YARN逻辑上独立,但是物理上是存在关联的,前者是对磁盘和存储的管理操作,后者是对CPU内存的管理操作
这三个组件内部基本都是采用的Master/Slave架构
HDFS:
架构
- NameNode 管理文件名和数据库的映射,数据块和datanode的映射(奴隶主---唯一)
- SecondaryNameNode 定期合并一些数据,然后与NameNode进行同步,在NameNode挂掉时可以顶替它(奴隶主的帮手---唯一)
- DataNode 保存具体的block数据(奴隶---很多个)
流程
存储数据
读取数据
默认情况下会为每个文件块额外的生成2个备份,看得出来NameNode发挥着调度指挥的作用,有了它才能知道对文件进行Map操作后分散存放在哪儿
Yarn:
架构
- ResourceManager 负责全局的资源调度(集群老大,唯一的)
- NodeManager 每个节点上的资源和任务管理器(一台机器上的老大)
- ApplicationMaster 跟踪处理一个任务,让多个NM配合其工作
- Container 资源的基本单位,任务的容器
流程
AM被启动后,会去申请资源然后要求多个NM启动MR(MapReduce任务),在所有的MR完成后AM则向RM汇报结果并且注销自己
MapReduce:
如果想统计下过去10年计算机论文出现最多的几个单词,看看大家都在研究些什么,那收集好论文后,该怎么办呢?
- 我可以写一个小程序,把所有论文按顺序遍历一遍,统计每一个遇到的单词的出现次数,最后就可以知道哪几个单词最热门了。
- 写一个多线程程序,并发遍历论文。如果是多核的处理器该方法肯定比方法1好,但是需要考虑同步共享数据的问题,防止重复统计。
- 把作业交给多个计算机去完成。人为的按照某些规则分割任务集(比如机器A统计2010年之前的论文,机器B统计2010年之后的)。这个方法比方法2快得多,但是部署起来很麻烦,我们要人工把程序copy到别的机器,要人工把论文集分开,把N个运行结果进行整合。
-
让MapReduce来帮帮我们吧!MapReduce本质上就是方法三,但是如何拆分文件集,如何copy程序,如何整合结果这些都是框架定义好的。我们只要定义好这个任务(用户程序),其它都交给MapReduce。