Hadoop入门

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);
      }
    }
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值