hadoop优势
(1)、处理超大文件
(2)、运行廉价的机器上,节点故障的概率高
(3)、高容错性和高可靠性,
(4)、流式访问数据
hadoop局限
(1)、不适合低延迟数据访问。hbase是一个更好的选择
(2)、无法高效存储大量小文件
namenode管理文件管理系统的元数据,元数据放置到内存中。一般来来说,每一个文件、文件夹和block需要占据150字节左右空间。如果100万文件,每个文件占据一个block,至少需要300m。利用sequencefile、mapfile、har等方式归档小文件。
hdfs和mr基本架构
hdfs基本架构:
hdfs采用主从结构模型,由一个namenode和若干个datanode
mapreduce基本架构:
mapreduce内部实践原理:
1、客户端编写好的mr程序并配置好的mr作业是一个job。job被提交给jobtracker后,jobtracker给该job一个新id值。
2、检查该job指定的输出目录是否存在,输入文件是否存在,不存在则抛出错位。
3、jobtracker根据输入文件计算输入分片。jobtracker就会配置job需要的资源并分配资源,jobtracker就会初始化作业,将job放到一个内部队列。作业调度就会初始化这个job,初始化就会创建一个正在运行job对象,以便jobtracker跟踪job的状态和进程。
4、当job被作业调度器调度时,作业调度器会获取输入分片信息,每个分片创建一个map任务,通过心跳机制监控到tasktracker的状态和进度,如果job中途失败,mr有相应的机制处理。
5、mapreduce 会根据输入文件计算输入分片。比如输入150M,那么mapreduce会将大文件切分为两个64M,64M,22M
6、MAP阶段
在map阶段,各个map任务会收到分配的split,比如对于map task1 将会接到input split1 并调用map函数。
7、combiner阶段
本地的reduce操作,map运算的本地后续操作,主要在map计算出中间文件前做一个简单的合并重复键值的操作。减少后续处理和网络传输资源
8、shuffle阶段
shuffle阶段包含为map和reduce两个阶段
(1)、map阶段的shuffle
map输出时会在内存里开启一个环形内存缓冲区,有一个阀值(默认80%),map还为输出操作启动一个守护线程,如果缓存区的内存使用达到了阀值,那么这个守护线程就会把这80%的内存写到磁盘上,这个过程叫做分隔。另外的20%内存可以供map输出继续使用。
缓冲区内容分隔到磁盘前,首先进行分区操作,分区的数目由reduce数目决定。后台线程按照键值对对需要写出的数据进行排序。如果配置了combine函数,进行combine操作,已使得更少的数据被写入磁盘并发送给给reducer。
分隔操作都会生成一个分隔文件。map端输出完成后,有很多分隔文件,因此在map任务结束前,还进行合并操作,合并过程中进行排序。
(2)、reduce阶段的shuffle
分为三个阶段:copy map输出,merge阶段,reduce处理
copy map输出:
reduce定期向jobtracker获取map的输出与否与位置。一旦有输出位置,reduce任务就会启动cope线程,通过http方式请求map task所在的task tracker获取其输出文件。
merge阶段:
和map阶段的合并类似,复制过来的数据会首先放入内存缓冲区中,根据数据量不一样,可能会分隔到磁盘过程
reduce task输入:
不断合并后,最后会生成一个最终结果(可能在内存可能在磁盘),reduce task的输入准备完毕,
9、reduce阶段
在map和shuffle阶段的shuffle过程后,reduce任务的输入准备完毕。调用reduce函数。
