MapReduce

《MapReduce:Simplified Data Processing on Large Cluster》 阅读笔记

 ̄綄美尐妖づ 提交于 2020-01-29 21:03:02
介绍 MapReduce是一种编程模式,以及与之相关的用于处理和生成大数据集的实现。其运作方式可以简单概括为以下步骤:一个大的输入被分成很多个小的输入块,同时,一个分布式系统中存在的多个计算机,组成一个大的计算机集群,这些分出来的小的输入块将会被集群中的计算机来执行,由一个 master 机器来分发人物。这些用于计算的机器成为 worker。master 将这个小的输入块分配给 worker,接下来就由worker来进行计算。我们称这个计算的过程为 Map,Map 会处理输入数据并生成一组结果。整个 Map 过程会产生很多个计算结果,我们称这些计算结果为中间值 (imtermediate value)。接下来,这些中间值就会被分配到 worker 中来执行 Reduce 任务,这个过程同样也是用 master 来分配的。关于 Reduce 任务,其主要目标即是合并具有相关联的中间值(key/value对)key值的中间值对,计算出结果。 上述过程即是一个 MapReduce 任务的基本步骤。当然,过程的Map函数和Reduce函数是可由用户指定的。在 MapReduce 架构下设计的程序代码将会自动的并行运行并运行在一个分布式集群里。我们接下来要关心的则是:输入数据的划分,程序运行中机器的调度,机器计算等处理过程出错,以及管理机器之间的数据交流。在本篇笔记中

Hadoop的MapReduce工作机制解析

删除回忆录丶 提交于 2020-01-29 11:07:07
上面两幅图是MapReduce工作流程,但是Shuffle过程只是从第7步开始到第16步结束,具体Shuffle过程详解,如下: (1)MapTask 收集我们的 map() 方法输出的 kv 对,放到内存缓冲区中 (2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件 (3)多个溢出文件会被合并成大的溢出文件 (4)在溢出过程及合并的过程中,都要调用 Partitioner 进行分区和针对 key 进行排序 (5)ReduceTask 根据自己的分区号,去各个 MapTask 机器上取相应的结果分区数据 (6)ReduceTask 会取到同一个分区的来自不同 MapTask 的结果文件, ReduceTask 会将这些文件再进行合并(归并排序) (7)合并成大文件后, Shuffle 的过程也就结束了,后面进入 ReduceTask 的逻辑运算过程(从文件中取出一个一个的键值对 Group ,调用用户自定义的 reduce() 方法) 注意:Shuffle中的缓冲区大小会影响到MapReduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快。缓冲区的大小可以通过参数调整,参数:io.sort.mb默认100M。 来源: CSDN 作者: zuodaoyong 链接: https://blog.csdn.net/zuodaoyong/article

Hive的基本原理(一)

梦想的初衷 提交于 2020-01-29 09:59:20
1. 前言 前面讲了很多关于集群搭建、以及HDFS和MapReduce的基本操作,接下来终于能学习新的内容了。。 Hive本身是数据仓库,那么什么是数据仓库呢? 数据仓库是为了协助分析报告,支持决策,为需要业务智能的企业提供业务流程的改进和指导,从而节省时间和成本,提高质量。它与数据库系统的区别是,数据库系统可以很好的解决事务处理,实现对数据的“增删改查”操作,而数据仓库则是用来查询分析的数据库,通常不会用来做单条数据的插入、修改和删除。 2. 什么是Hive Hive是基于Hadoop构建的一套数据仓库分析工具,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据。可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能;也可以将SQl语句转化为MapReduce任务运行,通过SQl去查询分析需要的内容。这套类SQL简称为HQL,使对MapReduce不熟悉的用户利用HQL语言查询、汇总、分析数据,简化MapReduce代码,从而使用Hadoop集群。而MapReduce开发人员可以把自己写的Mapper和Reducer作为插件来支持Hive做更复杂的数据分析。 3. Hive和数据库的异同 Hive与传统的关系型数据库不同,虽然Hive提供了类SQL的查询语言(Hive Query Language),但是引入HQL的主要目的是为了降低学习成本

MongoDB中的聚合操作

柔情痞子 提交于 2020-01-28 18:44:26
根据MongoDB的文档描述,在MongoDB的聚合操作中,有以下五个聚合命令。 其中,count、distinct和group会提供很基本的功能,至于其他的高级聚合功能(sum、average、max、min),就需要通过mapReduce来实现了。 在MongoDB2.2版本以后,引入了新的聚合框架(聚合管道,aggregation pipeline ,使用aggregate命令),是一种基于管道概念的数据聚合操作。 Name Description count Counts the number of documents in a collection. distinct Displays the distinct values found for a specified key in a collection. group Groups documents in a collection by the specified key and performs simple aggregation. mapReduce Performs map-reduce aggregation for large data sets. aggregate Performs aggregation tasks such as group using the aggregation

MapReduce计算框架

若如初见. 提交于 2020-01-28 15:43:04
原理流程分析 Map端: 文件存储在HDFS中,每个文件切分成多个一定大小(默认128M)的Block(默认3个备份)存储在多个数据节点上,数据格定义以"\n"分割每条记录,以空格区分一个目标单词。 每读取一条记录,调用一次map函数,然后继续读取下一条记录直到split尾部。 map 输出的结果暂放在一个环形内存缓冲区,每个map的结果和partition处理的key value结果都会保存在缓存中(该缓冲区的大小默认为100M,由io.sort.mb属性控制) 当内存缓冲区达到阈值时,溢写splill线程锁住80M的缓冲区(默认为缓冲区大小 的80%,由io.sort.spill.percent属性控制),开始将数据写出到本地磁盘中,然后释放内存,会在本地文件系统中每次溢写都创建一个数据文件,将该缓冲区中的数据写入这个文件。在 写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,也就是一个reduce任务对应一个分区的数据。这样做是为了避免有些 reduce任务分配到大量数据,而有些reduce任务却分到很少数据,甚至没有分到数据的尴尬局面。其实分区就是对数据进行hash的过程。溢出的数据到磁盘前会对数据进行key排序sort,以及合并combiner,这样做目的让尽可能少的数据写入磁盘。 发送相同的Reduce的key数量,会拼接到一起,减少

【MapReduce】Mapreduce基础知识整理 (七) 自定义输出

匆匆过客 提交于 2020-01-28 11:18:34
自定义输出 默认输出 : FileOutputFormat TextOutputFormat RecordWriter LineRecordWriter 自定义输出: 创建一个类继承FileOutputFormat 重写getRecordWriter 创建一个文件真正的写入器,继承RecordRecordWriter 重写write() close() job中指定自定义的输出类 job.setOutputFormatClass(MyFileOutputFormat.class); 案例:按学生平均成绩及格和不及格输出到不同文件 computer , huangxiaoming , 85 computer , xuzheng , 54 computer , huangbo , 86 computer , liutao , 85 computer , huanglei , 99 computer , huangxiaoming , 85 computer , xuzheng , 54 computer , huangbo , 86 computer , liujialing , 45 computer , liuyifei , 75 computer , huangdatou , 48 computer , huangjiaju , 88 computer , huangzitao

大数据学习(七)mapreduce wordCount讲解与实现

走远了吗. 提交于 2020-01-28 07:04:20
MR案例一(wordcount) 前面的文章写了HDFS和Mapreduce的机制,现在我们要动手写一些最基本的分布式计算实例。 本章主要写最基本的wordcount的一个基础demo,后面会逐渐进行丰富和完善。有基础的大佬还望勿喷。 目的 我们要完成一个MR,进行分词和计数 由: 最终得到: 目录结构 具体代码 mapper import org . apache . hadoop . io . IntWritable ; import org . apache . hadoop . io . LongWritable ; import org . apache . hadoop . io . Text ; import org . apache . hadoop . mapreduce . Mapper ; import java . io . IOException ; public class WordCountMapper extends Mapper < LongWritable , Text , Text , IntWritable > { /* * 继承Mapper类,源码我们后面再看 * 其中的四个参数分别是Mapper的输入(2)和输出(2) * LongWritable和IntWritable 相当于int, Text相当于String * 第一个参数是游标

Apache Spark : RDD

佐手、 提交于 2020-01-28 03:45:37
Resilient Distributed Datasets Resilient Distributed Datasets ( RDD ) is a fundamental data structure of Spark. It is an immutable distributed collection of objects. Each dataset in RDD is divided into logical partitions, which may be computed on different nodes of the cluster. RDDs can contain any type of Python, Java, or Scala objects, including user-defined classes. Formally, an RDD is a read-only, partitioned collection of records. RDDs can be created through deterministic operations on either data on stable storage or other RDDs. RDD is a fault-tolerant collection of elements that can be

2.3 MapReduce源码分析01

夙愿已清 提交于 2020-01-27 08:13:16
Map源码-Split 以下代码为了思路通顺进行过拆分整理 ---- 重在理解 //提交任务,等待任务完成并返回任务状态 job . waitForCompletion ( true ) ; //判断当前的状态 if ( state == JobState . DEFINE ) { //提交任务 submit ( ) ; } //监控任务的运行状态 if ( verbose ) { monitorAndPrintJob ( ) ; } //返回任务状态 return isSuccessful ( ) ; //-----------------------------submit(); //确认当前任务的状态 ensureState ( JobState . DEFINE ) ; //mapreduce1.x和2.x,但是2的时候将1的好多方法进行了优化 setUseNewAPI ( ) ; //获取当前任务所运行的集群 connect ( ) ; //Provides a way to access information about the map/reduce cluster. cluster = new Cluster ( getConfiguration ( ) ) ; //创建Job的提交器 final JobSubmitter submitter =

Ubuntu下编译 Hadoop2.9

我们两清 提交于 2020-01-26 23:19:22
Ubuntu 下编译 Hadoop-2.9.2 系统环境 系统: ubuntu-18.10-desktop-amd64 maven: Apache Maven 3.6.0 jdk: jdk_1.8.0_201 ProtocolBuffer: portoc-2.5.0 OpenSSL: OpenSSL 1.1.1 cmake: cmake3.12.1 hadoop: hadoop-2.9.2 安装所需环境 # 安装各种所需依赖库 $ sudo apt-get install autoconf automake libtool zlib1g-dev pkg-config libssl-dev libsnappy-dev libbz2-dev # 安装ssh-server $ sudo apt-get install ssh-server # 安装openssl $ sudo apt-get install openssl # 安装cmake $ sudo apt-get install cmake # 安装编译c++库 $ sudo apt-get install g++ # 安装protobuf # 下载protobuf-2.5.0 $ wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0