一、Hadoop分布式文件系统

当数据集超过一个单独的物理计算机的存储能力时,便有必要将它分布到多个独立的计算机。

Hadoop有一个被称为HDFS的分布式文件系统,全称为 Hadoop Distributed File System 。(有时可能简称为DFS,在非正式情况或者文档配置中,其实是一样的)

二、HDFS的设计

  • HDFS是为以流式数据访问模式存储超大文件而设计的文件系统,在商用硬件的集群上运行。让我们看看下面的说明:
超大文件 :“超大文件”在这里指几百MB,几百GB甚至几百TB大小的文件。
  • 流式数据访问
    HDFS建立在这样一个思想上:一次写入、多次读取模式是最高效的。一个数据集通常由数据源生成或复制,接着在此基础上进行各种各样的分析。
     
  • 低延迟的数据访问
    需要低延迟访问数据在毫秒范围内的应用并不适合HDFS。HDFS是为达到高数据吞吐量而优化的,这样可能会为延迟付出代价。
     
  • 大量的小文件
    名称节点(Namenode)存储着文件系统的元数据,因此文件数量的限制也由名称节点的内存量决定。根据经验,每个文件,索引目录及块占大约150个字节。
    举例,如果有一百万个文件,每个文件占一个块,就至少需要300MB的内存。
     
  • 多用户写入,任意修改文件
    HDFS中的文件只有一个写入者,而且写操作总是在文件的末尾。它不支持多个写入者,或是在文件的任意位置修改。(可能在以后这些会被支持,但它么也相对不那么高效。)

三、HDFS块的概念

hdfs 贴吧 hdfs du_数据

  • 在分布式文件系统中使用抽象块会带来很多好处。第一个好处最明显的好处是,一个文件可以大于网络中任意一个磁盘的容量。文件的分块不需要存储在同一个磁盘上,因此它们可以利用集群上的任意一个磁盘。
  • 第二个好处是,使用块抽象单元而不是文件会简化存储系统。

四、名称节点与数据节点

hdfs 贴吧 hdfs du_HDFS_02


hdfs 贴吧 hdfs du_hdfs 贴吧_03

五、MapReduce 概述

1,MapReduce是一种可用于数据处理的编程模型。
2,MapReduce程序本质上是并行运行的,因此可以将大规模的数据分析任务分发给任何一个拥有足够多机器的数据中心。
3,MapReduce的优势在于处理大规模数据集,那么它的运行必然会设计到shuffle。

shuffle

1) shuffle概述
A)shuffle map()输出开始到reduce()输入,此阶段称为shuffle
B)shuffle分为两阶段

map shuffle phase reduce shuffle phase

2) shuffle功能:

partition 分区, map
sort map&reduce
combiner map
对局部的数据进行合并,map端的reduce;不是所有的业务场景都需要
compress map
group reduce
相同key的value存入集合作为value

3) shuffle详细过程
shuffle所有的操作都是针对map输出的key,value对进行的
map shuffle phase

进入环形缓存区(默认100M,mapred-site.xml mapreduce.task.io.sort.mb)
当达到缓存区的80%,会把缓存区的数据spill到本地磁盘。
3.溢写并不是立刻将缓存区数据spill到本地,经过一些操作 (分区,sort)

1.分区(partition)

job.setNumReduceTasks(int tasks);
			mapreduce job的reduce task个数,决定分区个数
				
			job.setPartitionerClass(Class clz);
			分区类决定map输出的数据被哪个reduce进行处理
				默认情况下,使用HashPartition依据key进行分区

2.排序(排序完成发生溢写)

默认情况下按照key的 字典顺序
自定义排序,实现WritableComparable接口
当溢写结束, 此时将数据spill到本地磁盘,产生多个小文件
将本地的小文件进行合并
combiner 局部的聚合,不是所有业务都适合
compress 减少网络io,磁盘io
mapreduce.map.output.compress true开启压缩
mapreduce.map.output.compress。
codec 压缩类 org.apache.hadoop.io.compress.SnappyCodec

reduce shuffle phase

merge (合并)
map task任务结束,向app master反馈,master通知各个reduce,拉取该reduce所要处理的对应的分区的数据
拉去数据完成,对数据进行合并

排序:

对每个reduce的数据进行排序
分组(group)
将相同key的value存入到一个集合作为value key1,value1 key1,value2 … —> key1 list(value1,value2…)
最后将数据传递给reduce()进行处理