一,MapReduce
基本的一些概念:
- MapReduce作业(job)是客户端需要执行的一个工作单元:它包括输入数据,MapReduce程序和配置信息.
- Hadoop将作业分成若干个任务(task)来执行,其中包括两类任务:map任务和reduce任务.这些任务运行在集群的节点上,并通过YARN进行调度.如果一个任务失败,它将在另一个不同的节点上自动重新调度运行.
- Hadoop将MapReduce的输入数据划分成等长的小数据块,称之为输入分片(input split)或简称为分片.Hadoop为每个分片构建一个map任务,并由该任务来运行用户自定义的map函数,从而处理分片中的每条记录.
- 如果分片分得太小,那么管理分片的总时间和构建map任务的总时间将决定作业的整个执行时间.对于大多数作业来说,一个合理的分片大小趋向于HDFS的一个块的大小,默认为128MB,不过可以针对集群调整这个默认值或者在每个文件创建时指定.
- reduce任务并不具备数据本地化的优势,单个reduce任务的输入通常来自于所有mapper的输出.
- 如果有多个reduce任务,每个map任务就会针对输出进行分区(partition).即为每个reduce任务建一个分区.每个分区有许多键(及其对应的值),但每个键对应的键值对记录都在同一分区.分区可由用户定义的分区函数控制.但是通常用默认的partition通过哈希函数来区分,很高效.
- 一般情况下,多个reduce任务的数据流如下图所示,该图清楚的表明了为什么map任务和reduce任务之间的数据流称为shuffle(混洗),因为每个reduce任务的输入都来自许多map任务.shuffle一般比图中所示的更加复杂,而且调整混洗参数对作业总执行时间的影响非常大.
本质
- Map的应用在于我们需要数据一对一的元素的映射转换,比如说进行截取,进行过滤,或者任何的转换操作,这些一对一的元素转换就称作是Map;
- Reduce主要就是元素的聚合,就是多个元素对一个元素的聚合,比如求Sum等,这就是Reduce;
其竞争者Spark的优势
- 每一个作业独立调度,可以把所有的作业做一个图进行调度,各个作业之间相互依赖,在调度过程中一起调度,速度快;
- 所有过程都基于内存,所以通常也将Spark称作是基于内存的迭代式运算框架;
- spark提供了更丰富的算子,让操作更方便;
- 更容易的API:支持Python,Scala和Java;
- 其实spark里面也可以实现Mapreduce,但是这里它并不是算法,只是提供了map阶段和reduce阶段,但是在两个阶段提供了很多算法。如Map阶段的map, flatMap, filter, keyBy,Reduce阶段的reduceByKey, sortByKey, mean, gourpBy, sort等
二,HDFS
基本概念
- Hadoop自带的一个称为HDFS的分布式文件系统,即,Hadoop Distributed Filesystem.它是以流式数据访问模式来存储超大文件,运行于商用硬件集群上.
- 超大文件,目前可以存储PB级别数据了;
- 流式数据访问;
- 商用硬件,廉价机器即可;
- 低时间延迟的数据访问,记住,HDFS是为高数据吞吐量应用优化的,这可能会以提高时间延迟为代价,目前对于低延迟的访问需求,HBase是更好地选择;
- 大量的小文件,由于namenode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于namenode的内存容量.根据经验,每个文件,目录和数据块的存储信息大约占150字节,所以这类文件不是用在HDFS中;
- 多用户写入,任意修改文件,HDFS中的文件写入只支持单个写入者,而且些操作总是以"只添加"方式在文件末尾写数据.它不支持多个写入者的操作,也不支持在文件的任意位置进行修改.可能以后会支持这些操作,但他们相对比较低效;
HDFS的三个节点
- Namenode:HDFS的守护进程,用来管理文件系统的命名空间,负责记录文件是如何分割成数据块,以及这些数据块分别被存储到哪些数据节点上,它的主要功能是对内存及IO进行集中管理;
- Datanode:文件系统的工作节点,根据需要存储和检索数据块,并且定期向namenode发送他们所存储的块的列表;
- Secondary Namenode:辅助后台程序,与NameNode进行通信,以便定期保存HDFS元数据的快照;
- HDFS Federation(联邦HDFS):通过添加namenode实现扩展,其中每个namenode管理文件系统命名空间中的一部分.每个namenode维护一个命名空间卷,包括命名空间的源数据和该命名空间下的文件的所有数据块的数据块池.
- HDFS的高可用性(High-Availability):Hadoop的2.x发行版本在HDFS中添加了对高可用性(HA)的支持.在这一实现中,配置了一对活动-备用(active-standby)namenode.当活动namenode实效,备用namenode就会接管它的任务并开始服务于来自客户端的请求,不会有明显的中断.
常用的命令:
hadoop fs -ls / 列出hdfs文件系统根目录下的目录和文件;
hadoop fs –cp <src> <dst> 从 src 往 dst拷贝文件
hadoop fs -rm -r <hdfs dir or file> 删除文件或文件夹下的文件
hadoop fs -mkdir <hdfs dir> 在hdfs中新建文件夹