1.首先了解下hadoop:
1.1分为三个重要模块:
分布式文件系统:HDFS —— 实现将文件分布式存储在很多的服务器上
分布式运算编程框架:MapReduce —— 实现在很多机器上分布式并行运算
分布式资源调度平台:Yarn —— 帮用户调度大量的mapreduce程序,并合理分配运算资源
1.2hadoop:相关框架
2.HDFS
2.1 hdfs是一个分布式文件系统,简单理解就是多台机器组成的一个文件系统。
2.2 单台服务器无法存储处理特大文件。将这个大文件切割成各个块(block),分散存在各个服务器中。
2.3 Hdfs按照字节数组(byte)切割,切割之后的每个块(每一个块的容量大小是一样的),无序的分散在集群节点中,hadoop2.0上的版本,默认块大小是128M 。块和块之间通过偏移量来有序的组装数据,偏移量的值是上个块大小的值。
2.4 每一个块有几个副本,用于备份数据。副本的数量,最好不好超过总节点数量。hadoop2.0上的版本,默认3个,下图是副本备份策略。第一个副本备份于当前机架当前节点上。第二个副本必须出机架,选一个磁盘不满,cpu空闲的节点上。第三个副本,是另外机架上的另一个节点上。
2.5 每个块的数据不可以修改,块大小也不可以修改。因为修改或者删除会改变块的偏移量,造成整个集群变动。但是可以增加,增加是增加一个块,只是一个单点的操作。
包含的模块和作用:
2.6NameNode:元数据MetaData:描述文件相关信息(大小,名字,修改时间,目录位置...)
主节点,只有一个,掌管所有节点中的块的元数据信息。
2.7Secondary NameNode:是NameNode冷备份分担NameNode其工作量、定期合并fsimage和fsedits,并推送给NameNode、在紧急情况下,可辅 助恢复 NameNode。
2.8DataNode:存在除NameNode节点的其他节点。利用本地服务器文件系统,保存真正的数据。和NameNode保持心跳,向NameNode时时汇报块和块备份的信息。
2.9HdfsClient:与NameNode获取元数据信息。与DataNode获取Block块数据。
热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作。 冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失。
fsimage:元数据镜像文件(文件系统的目录树。) edits:元数据的操作日志(针对文件系统做的修改操作记录) namenode内存中存储的是=fsimage+edits SecondaryNameNode负责定时默认1小时,从namenode上,获取fsimage和edits来进行合并,然后再发送给namenode。减少namenode的工作量。
关于MapReduce的理解?
特点:
编程简单。它简单的实现一些接口,就可以完成一个分布式程序。
高扩展性。当计算资源不足的时候,可以通过简单的增加机器来扩展计算能力。
高容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上面上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由 Hadoop 内部完成的。 4. 适合 PB 级以上海量数据的离线处理。它适合离线处理而不适合在线处理。
MapReduce的基本原理就是:将大的数据分析分成小块逐个分析,最后再将提取出来的数据汇总分析,最终获得我们想要的内容。当然怎么分块分析,怎么做Reduce操作非常复杂,Hadoop已经提供了数据分析的实现,我们只需要编写简单的需求命令即可达成我们想要的数据。
举个例子:文件中统计单词重复出现的次数
假设有个文件txt文档,有3行,值为:
Mary javk
This is jack
He is mary
mr框架会读取文件中的内容,生成给map处理的key-value集合,生成的数据内容如下
(1,Mary jack)
(8,This is jack)
(16,He is mary)
mr框架生成的key-value的key是每行的首字符在文件中的位置,value是每行的文本
对于上面的每对key-value数据,会交给map处理,本例子是为了获取单词重复的次数,首先需要将单词区分出来,显然,map阶段可以用来干这个事,这样我们map阶段可以有这样的输出,输出的key-value对是每个单词,其中key是单词本身,value是固定值为1
(Mary,1)
(jack,1)
(This ,1)
(is,1)
(jack,1)
(He ,1)
(is ,1)
(mary,1)
map处理后,框架会对Map输出的Key-value数据基于key来对数据进行排序和分组(这过程称为shuffle),shuffle操作的结果是,将map输出数据中相同Key的value进行合并成列表,生成新的key-value数据,传给reduce。结果数据如下:
(mary,[1,1])
(jack,[1,1])
(this,[1])
(is,[1,1])
(he,[1])
这样,reduce要做的事情就很简单了,就是将每对key-value数据中的value中的各个元素的值汇总即可,然后写入不同的数据源,提供接口:
He 1
Is 2
Jack 2
Mary 2
This 1
令举一个更为深刻理解的例子:查询全国人口不重名的数量。可以利用shuffle归组这一神操作实现,然后reduce中直接把key写出去,做一个 count++就好了
mapreduce的运行原理:
mapreduce中的combiner 和partition的区别:Combiner就是在map端先进行一次reduce操作,减少map端到reduce端的数据传输量,节省网络带宽,提高执行效率。
Partition就是将map输出按key分区,送到不同的reduce上去并行执行,提高效率。
Map阶段:首先是读数据,数据来源可能是文本文件,表格,MySQL数据库。这些数据通常是成千上万的文件(叫做shards),这些shards被当做一个逻辑输入源。然后Map阶段调用用户实现的函数,叫做Mapper,独立且并行(每行处理一次,调一次map函数)的处理每个shard。对于每个shard,Mapper返回多个键值对,这是Map阶段的输出。
Shuffle阶段:把键值对进行归类,也就是把所有相同的键的键值对归为一类。这个步骤的输出是不同的键和该键的对应的值的数据流。
Reduce阶段: 输入当然是shuffle的输出。然后Reduce阶段调用用户实现的函数,叫做Reducer,对每个不同的键和该键的对应的值的数据流进行独立、并行的处理。每个reducer遍历键对应的值,然后对值进行“置换”。这些置换通常指的的是值的聚合或者什么也不处理,然后把键值对写入数据库、表格或者文件中。