HDFS是Hadoop分布式文件系统的简称,由若干台计算机组成,用于存放PB、TB数量级以上的文件,每份文件可以有多个副本,所以HDFS是一个具有高冗余、高容错的文件系统。
Hadoop系统架构图
hadoop2.0以后的版本移除了原有的JobTracker和TaskTracker,改由Yarn平台的ResourceManager负责集群中所有资源的统一管理和分配,NodeManager管理Hadoop集群中单个计算节点。
YARN的设计减少了JobTracker的资源消耗,减少了Hadoop1.0中发生单点故障的风险。我们还可以在YARN平台上运行Spark和Storm作业,充分利用资源。
MapReduce作业是一种大规模数据集的并行计算的编程模型。我们可以将HDFS中存放的海量数据,通过MapReduce作业进行计算,得到目标数据!
MapReduce 的四个阶段:
Split阶段:分片
Map阶段(需要编码)
Shuffle阶段
Reduce阶段(需要编码)
理想的输入文件:
由于NameNode内存有限,大量的小文件会给hdfs带来性能上的问题。故Hdfs适合存放大文件,对于大量小文件,可以采用压缩、合并小文件的优化策略。例如,设置文件输入类型为CombineFileInputFormat格式
本地优化——combine
数据经过Map端输出后会进行网络混淆,经Shuffle后进行Reduce,在大量数据量的情况下可能会造成巨大的网络开销。故可以在本地先按照KEY先行一轮排序与合并,再进行网络混淆,这个过程就是
一个MapReduce作业中,以下三者的数量总是相等的:
Partitionerd的数量
Reduce任务的数量
最终输出文件(part -r-00000)
在一个Reducer中,所有数据都会被按照key值升序排序,故如果part输出文件中包含key值,则这个文件一定是有序的。
Reducer任务数量
在大多数的情况下,如果只设置1个reduce任务,那么在reduce阶段,整个集群只有该节点在运行reduce任务,其他节点都将被闲置,效率十分低下。故建议将reduce任务数量设置成一个较大的值(最大值是72)
一个节点上的reduce任务数并不像Map任务数那样受多个因素制约。
可以通过调节参数mapred.reduce.tasks
可以在代码中调用job.setNumReduceTasks(int n)
总结:
分片输入——split
由于NameNode内存限制,hdfs适合存放大文件
对于小文件可采用压缩输入格式CombineFileInputFormat\
dfs.block.size可调节块大小
Map任务数量和mapred.map.tasks和mapred.min.split.size参数有关
本地合并Combine:数据在Mapper输出后会进行和Reduce相似的操作,减少网络开销
job.setCombinerClass(MyReduce.class)