Hadoop简介
Hadoop 是一个开源的分布式计算和存储框架,由 Apache 基金会开发和维护。
Hadoop 为庞大的计算机集群提供可靠的、可伸缩的应用层计算和存储支持,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集,并且支持在单台计算机到几千台计算机之间进行扩展。
Hadoop结构
Hadoop 1.x与Hadoop 2.x的架构对比,Hadoop3.x与Hadoop 2.x相同;

HDFS架构
典型的主从架构的分布式系统,有元数据节点(NameNode)和数据节点(DataNode)组成;

NameNode
NameNode是HDFS的主节点,用来管理文件元数据(文件名称、大小,位置等)和处理客户端的文件访问请求的主服务器;
- 管理文件元数据
- 周期性接受来自集群中DataNode的心跳和块报告
SecondaryNameNode
SecondaryNameNode帮助NameNode管理元数据,NameNode的辅助工具;
- fsimage和edits
元数据信息主要存储在fsimage和edits中,fsimages主要存储元数据信息,edits是HDFS操作日志文件;NameNode启动是会对fsimage和edits进行合并得到完整的元数据信息,并把合并后的元数据信息1写入到fsimage;集群中edits会随时间推移edits文件变得比较大,导致NameNode的启动时间很长;SecondaryNameNode用于协助NameNode定期合并fsimage和edtis;
-
SecondaryNameNode工作流程
- SecondaryNameNode准备从NameNode获取元数据时,通知NameNode站厅edits的写入,NameNode停止写入edits,将新的日志写入到edits.new
- SecondaryNameNode通过http get方式获取edits和fsimage到本地,进行合并生成新文件fsimage.ckpt
- SecondaryNameNode 通过http post方式将fsimage.ckp发回Namenode,fsimage.ckp覆盖原来的fsimage,将文件edits.new 改为edits;
DataNode
HDFS真正储存数据的地方,客户端可以向DataNode请求写入或读取数据块,也可以在·NameNode的指令下执行块的创建,删除和复制,并周期性向NameNode汇报数据块信息。
yarn架构
YARN集群总体上是经典的主/从(Master/Slave)架构,主要由ResourceManager、NodeManager、Task、Container和ApplicationMaster等组件构成。

ResourceManager
ResourceManager以后台进程方式运行,负责对集群资源的管理和任务调度。
NodeManager
NodeManager是集权每个节点的资源和任务管理器,以后台进程方式运行。
Task
应用程序具体执行的任务。
Container
Container是YARN中资源分配的基本单位,是封装了CPU和内存资源的一个容器,相当于一个Task运行环境的抽象。
ApplicationMaster
应用程序的管理者,负责应用程序管理,后台进程运行,一个应用程序对应一个ApplicationMaster。
执行任务的流程

- 客户端提交任务给yarn集群中的ResourceManager;
- ResourceManager分配资源,在分配的nodeManager中启动MRApplicationMaster,它负责此应用程序的整个生命周期
- MRApplicationMaster向ResourceManager注册并申请资源;
- 执行相应Task;
MapReduce
从HDFS中获取数据,将获取的数据分割成多个小数据集,并行计算这些小数据集,最后将小数据集的结果进行汇总得到最终结果;
MapReduce计算模型
Map任务负责对数据的获取、分割与处理,其核心执行方法为map()方法;Reduce任务负责对Map任务的结果进行汇总,其核心执行方法为reduce()方法

MapReduce程序编写
-
Mapper类
//继承import org.apache.hadoop.mapreduce.Mapper,重写map方法 //MapReduce 是对每一个k v进行一次计算,对txt文件数据读取一行做一次计算 public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{ //IntWritable相当于java中的Int private final static IntWritable one = new IntWritable(1); //Text相当于java中的String private Text word = new Text(); // key,value,为从hdfs读取的值,MapReduce输入值是map结构 public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); //生成新的key,value写入context context.write(word, one); } } } -
Reduce类
//继承import org.apache.hadoop.mapreduce.Reducer,重写reduce方法; public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); //map操作数据切片后的操作,生成相同key的value生成values集合给到Reduce操作 public void reduce(Text key, Iterable<IntWritable> values, Context context ) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } -
程序执行主类
public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); //设置集群地址 conf.set("fs.defaultFS","hdfs://192.168.126.134:8020"); //生成作业 Job job = Job.getInstance(conf, "word count"); //主程序类 job.setJarByClass(WordCount.class); //Mapper类 job.setMapperClass(TokenizerMapper.class); //Combiner 运行在 Mapper 阶段,是用于统计当前MapTask的数据集。 //Reducer 运行在 Reducer 阶段,是用于统计所有MapTask的数据集 job.setCombinerClass(IntSumReducer.class); //Reducer类 job.setReducerClass(IntSumReducer.class); //输出key job.setOutputKeyClass(Text.class); //输入value job.setOutputValueClass(IntWritable.class); //数据输入地址 FileInputFormat.addInputPath(job, new Path("/input/README.txt")); //结果输出地址 FileOutputFormat.setOutputPath(job,new Path("/out/out")); System.exit(job.waitForCompletion(true) ? 0 : 1); } }
112

被折叠的 条评论
为什么被折叠?



