Hadoop学习笔记——MapReduce

  • 这一章主要讲:Map reduce 在实际工作中的原理与体现
  • Map_reduce 是一种可用于数据处理的编程模型。 Hadoop可以运行各种语言版本的MapReduce程序
  • 实例分析:
    • 数据集采用:采用的数据集是来自美国国家气候数据中心
    • 我们如何处理这一数据?对于标准格式数据,我们可以使用Unix工具,awk对数据进行处理。(一种处理按行存储的数据的工具)
    • 对于并行处理的问题:
      • 我们如何划分文件的大小?
      • 我们如何对分布处理的文件的结果进行进一步处理?
      • 我们如何处理并行计算机的协调性问题以及稳定性问题。
      • 这些问题就是hadoop的存在意义。
    • 利用hadoop来处理数据:
      • MapReduce过程分为两个处理阶段,map阶段和reduce 阶段。每个阶段都以键值对作为输入和输出,其类型由程序员选择。
      • 在本例中键值分别是:key为文件中的行偏移量。map函数在这个中的功能仅限于提取年份和气温信息,并将它们作为输出。
      • reduce函数的作用在于遍历这个表,并得到中间最大的数据。
      • Map函数由Mapper类实现,后者声明了一个map()的虚方法。Mapper(泛型,泛型对输入键,输入值,输出键,输出值进行了控制)对Map结构提供了控制方法。)
      • 重写Map方法与reduce方法。
      • 第三部分代码负责运行MapReduce作业。即主函数的存在空间,主函数做些什么样的事情呢?Job对象指定作业执行规范,设定一系列路径以及控制整个作业的运行。在Hadoop上运行这个作业时,要把代码打包成一个Jar文件,在setJarByClass()方法中传递一个类即可。Hadoop会用这个类找到包含这个类的Jar文件。
      • FileOutputFormat 中的 setOutputPath() 来指定reduce 函数的输出路径。 输入的类型用InputFormat类来控制。 没有控制的我们使用的是默认的TextInputFormat(文本输入格式)
      • 运行测试。
      • 调用方法的简单介绍是这样的。调用Hadoop的命令的第一个参数是类名,Hadoop就会启动一个JVM来运行这个类,使用Hadoop命令的运行作业比直接用Java命令运行来的更加方便。
      • 运行作业的输出得到了一些有用的信息(这一部分信息属于对运行过程的监测)
      • 标题为counters:输出的最后一部分对Hadoop运行的信息进行检查,检查运行了几个任务产生了几个输出。
      • 横向扩展:前面介绍了MapReduce针对少量数据是如何开始工作的,现在我们开始鸟瞰整个系统以及右大量输入时的数据流,为简单起见,到目前为止,我们的例子都只使用了本地文件系统中的文件,然而为了使用横向扩展,我们需要把数据存储在分布式文件系统中。一般为HDFS
    • 数据流,以及定义的一些关键术语:
      • Job是客户端需要执行的一个工作单元,它包括输入数据,MapReduce程序,和配置信息。有两类节点控制着任务的执行进程,一个jobtracker和一系列tasktracker,jobtracker通过调度tasktracker上运行的任务来协调所有运行在系统上的作业。
      • tasktracker在运行任务的同时将运行进度报告发送给jobtracker, jobtracker由此记录每项任务的整体运行情况.如果一个上的任务失败,jobtracker可以在另一个tasktracker上重新调度该任务。
      • HadoopMapReduce 的输入数据划分成等长的小数据块,称为输入数据。Hadoop为每一个分片构建一个map任务。(分片的大小是比较双刃也比较玄学的一件事情,因此默认是64MB)
      • Hadoop在存储后输入数据的节点上运行 map任务可以获得最佳性能,这就是所谓的“数据本地化优化”因为它无需使用宝贵的集群带宽资源。但是有时对于一个mao任务的输入而言,存储有某个HDFS数据块备份的三个节点可能正在运行其他map任务,此时任务调度需要在三个备份中的某个数据寻求同个机架中空闲的机器来运行该map任务。因此最佳分片的大小应该与块大小相同。
      • map任务的输出写在磁盘上便于操作也便于删除,这部分数据仅仅是中间产物,所以将它们再进行备份,存储在HDFS上实在是太过于小题大做了。
      • reduce 任务不具有本地化的优势,单个的reduce任务的输入常常来自于所有Mapper的输出,在本例中我们只有一个reduce任务,通常来自于所有mapper的输出。排过序的map输出须通过网络传输发送到运行reduce任务的节点,数据在reduce 端合并,然后由用户定义的reduce函数处理,reduce的输出通常存储在HDFS中以实现可靠存储。如果有多个reduce节点,我们往往需要对数据进行shuffle也就是进行混洗。
    • combiner:优化方式
      • 集群上的可用带宽限制了MapReduce作业的数量,因此尽量避免mapreduce任务之间的数据传输是有利的。combiner主要就是作为reduce结果的一个整合。(是一个反复迭代的算法,这个例子里是明确的,但要我说明白这是啥玩意,我说不出来。
    • Hadoop对其他语言的拓展支持:略。

 

你可能感兴趣的:(Hadoop学习笔记)