我们常说的分布式系统,其实就是分布式软件系统,支持分布式处理的软件系统。他是在通信网络互联的多处理机体系结构上执行任务。
hadoop是分布式软件系统中文件系统层的软件,他实现了分布式文件系统和部分分布式数据库系统。hadoop中的分布式文件系统hdfs可以实现数据在计算机集群组成的云上,高效的存储和管理。hadoop中的并行编程框架mapreduce可以让用户编写hadoop应用程序。
mapreduce应用程序开发是基于mapreduce编程模型,mapreduce编程的原理是:利用输入一个key,value的集合处理后,来输出一个key,value的集合。mapreduce用两个函数表达这儿计算:map和redcue
mapreduce处理过程:
从hdfs上读取数据块,由一个个map去处理数据片段,将map任务的输出,按key相同的进行合并(key,value1,value2...)将合并后的结果交给
reduce处理,reduce输出结果文件到hdfs上。
分布式文件存储:
hdfs有一个nameNode(在hadoop2中有两个nameNode)节点和多个dataNode节点组成,一个文件在hdf的底层会分成一个个block,block的默认大小是64M。一个block块会有多个副本(默认有三个),副本会存在不同的dataNode上,以达到容错容灾的目的。nameNode里存储的是文件的源信息(文件权限,拥有者,block块存储在哪台dataNode上等)
分布式并行计算:
hadoop中有一个主控的jobTracker和多个taskTracker,主控的jobTracker用于调度和管理其他的taskTracker,TaskTracker负责执行jobTracker分发给他的任务。jobTracker可以运行任意的一台机器上。taskTracker只能运行在dataNode节点上,所以说,dataNode不光是存储文件的节点也是计算节点。jobTracker会把任务分发给空闲的TaskTracker上执行,如果哪个TaskTracker出现故障,任务失败。jobTracker则会把这个任务再分给其他的空闲taskTracker执行
本地计算(移动计算而不是移动数据)
数据存储在哪台机器上,就由哪个机器进行计算。这样的好处是可以减少网络io,减少对网络带宽的要求。在hadoop这种分布式集群上,计算节点可以很容易的扩张。数据在不同计算机之间传输,故而网络带宽就成了颈瓶。所以本地计算是一种很有效的节约网络带宽的方法(移动计算比移动数据更经济)
任务粒度
把原始文件切成小数据片段,一般来说数据片段的大小要小于或者等于hdfs中block块的大小,这样可以保证一个数据片段是位于一个计算机上的,便于本地计算。n个数据片段由n个map任务执行,注意这n个map任务是分布于n台计算机上,将他们并行处理。reduce的数量可以由用于控制。
Mapper和Reduce中全局共享数据
(1)读取hdfs文件
这样可以很直观,缺点是就算是很小的全局数据需要读取hdfs文件,这将会占用网络io,占用系统资源
(2)读取job属性
在task运行的时,可以利用Configuration对象中config.set(name, value);读取job中的属性值,可以将简单的属性封装到配置的作业中,
优点是简单,消耗的资源小,缺点是:对于大的共享资源就没法了
(3)DistributedCache
是为应用提供缓存文件的工具,他可以缓存文本文件,hdfs文件,jar文件,压缩文件
优点是每个job共享文件在启动之后复制一次,可以适合大量的全局文件。缺点是他是只读的
shuffle和排序
shuffle就是map端的输出到redcue端的输入整个过程就是shuffle过程。我们为了让reducec端并行处理数据,所以对map的输出 要进行排序和处理。
shuffle的过程可以分为map端和reduce端:
map端shufflle会对map的输出结果进行 划分(pattion),排序(sort),分割(spllit),将划分好的map结果进行排序合并并写到磁盘上,同时按照不同的划分结果发送到对应的reduce上。reduce端会把不同map端送来的相同区域的数据给对应reduceTask去处理。
shuffle过程是mapperReduce的核心过程,shuffle的性能直接影响mapReduce的执行过程(默认shuffle过程并不是最优的,可以根据需求进行定义shuffle过程)
推测式执行
推测式执行就是当做作业启动时,jobTracker会计算整个作业的进度,当发现某一个map执行的速度要慢(cpu负载果高,运行的任务较多等)与整体的平均速度的时候,jobTracker就会重启一个备份的taskTracker去运行这个map. 哪个task先运行完,就kill掉另一个taskMap。
但是这样缺点是,如果是代码的问题,这样另起一个任务并不会有什么效果,反而会增加整个集群的负担(推测式执行要在整个作业都开始之后才会启动,并且只针对运行一段时间之后,执行的速度慢与整个作业),所以可以根据具体的情况而选择开启和关闭推测式执行。
jvm重用
不管是mapTask还是 reduceTask 都是运行在taskTracke节点上的java虚拟机(jvm),每当taskTracker被分配一个任务,就会在本地启动一个新的java虚拟机。对于有大量零碎文件的map来说,启动那么多的虚拟机显然是不明智,优化有待提升的。如果在很多的时间一个map运行结束,让后续的任务继续重用这个虚拟机就是jvm重用。虽然一个taskTracker节点上可以有多个任务,但是他们都是运行在相互独立的虚拟机上的,taskTracker上的其他任务必须等待,就算是jvm重用也只能是顺序执行
控制jvm重用的属性是mapred.job.reuse.jvm.num.tasks 这个属性上定义了一个TaskTracker运行任务的最大数量,默认为1,可以自定义,为-1则表示没有数量限制
跳过坏环节
mapReduce执行的数据量非常的大,所以用户在编写程序是可能会疏忽或者数据中有坏的记录的存在,所以用户的代码在处理某个记录时可能会崩溃,这时虽然hadoop有处理这种错误的机制,即使再次重复执行也无济于事( 默认是会重新执行4次),还是会导致整个作业的失败。但是要在庞大的数据量中找到坏的数据也是很困难,很费时的。所以就是当前代码执行时,遇到坏的记录就直接跳过去,然后继续执行(数据量很大的话,有个别错误数据也是可以忍受的)。
当忽略模式启动后,任务失败两次,他就会将错误信息告诉taskTracker,taskTracker就会重新启动一个任务去运行,当再次收到先前任务运行时所遇到的错误信息时,就会直接跳过改记录。忽略模式只适合忽略个别记录数
任务的执行环境
hadoop能够为执行任务的taskTracker提供任务的运行环境,比如map知道处理文件的名称,集群的id等,jobTracker在分配任务给taskTracker时候,会将作业的配置文件发送给taskTracker,taskTracker会将文件保存在本地。我们知道,taskTracker是运行在本地节点单独的jvm上一子进程的方式运行map和reduce,每一个map或者reduce都会启动一个新的jvm,子的jvm会继承父的jvm的执行环境。
- Hadoop笔记系列 一 用Hadoop进行分布式数据处理(1)
学习资料参考地址: 1.http://blog.csdn.net/zhoudaxia/article/details/8801769 1.先说说什么是Hadoop? 个人理解:一个分布式文件存储系统+ ...
- Hadoop笔记
教程: Elasticsearch.MongoDB和Hadoop比较: http://blog.csdn.net/hong0220/article/details/47631409
- hadoop 笔记(hbase)
hbase 基础: hbase是基于列的数据,其数据模式如下: 1.安装 1.1)hbase安装分为单机.伪分布式.分布式,单机下安装不依赖于hadoop:因为不需要分布式文件系统支持: 1.2)安装 ...
- Hadoop笔记HDFS(2)
高级Hadoop MapReduce管理 1 调试部署好的Hadoop的配置 2 运行基准测试检验Hadoop的安装 3 重新利用JVM提升性能 4 容错性 5 调试脚本-分析失败任务原因 6 设置失 ...
- Hadoop笔记HDFS(1)
环境:Hadoop2.7.3 1.Benchmarking HDFS 1.1测试集群的写入 运行基准测试是检测HDFS集群是否正确安装以及表现是否符合预期的好方法.DFSIO是Hadoop自带的一个基 ...
- hadoop笔记之Hive的数据存储(内部表)
Hive的数据存储(内部表) Hive的数据存储(内部表) 基于HDFS 可使用hadoop给我们提供的web管理工具查看数据.打开管理工具localhost:9000–>Utilities下的 ...
- hadoop笔记之Hive入门(Hive的体系结构)
Hive入门(二) Hive入门(二) Hive的体系结构 ○ Hive的元数据 Hive将元数据存储在数据库中(metastore),支持mysql.derby.oracle等数据库,Hive默认是 ...
- hadoop笔记之Hive入门(什么是Hive)
Hive入门(一) Hive入门(一) 什么是Hive? Hive是个数据仓库,数据仓库就是数据库,但又与一般意义上的数据库有点区别 实际上,Hive是构建在hadoop HDFS上的一个数据仓库. ...
- hadoop笔记之MapReduce的应用案例(利用MapReduce进行排序)
MapReduce的应用案例(利用MapReduce进行排序) MapReduce的应用案例(利用MapReduce进行排序) 思路: Reduce之后直接进行结果合并 具体样例: 程序名:Sort. ...
随机推荐
- 一个key 在10w k/v 找到对应的. (B-tree), 这10w放进B-tree 会有多少层.
B-tree是二叉平衡查找树,相邻两层节点层数不超过1 所有10w 即 2^16=65536 < 10w < 2^17=131072: 会有17层,最多查询17次.
- mui日期插件$, each遍历,EventListener事件监听,json格式
(function($) { $.init(); var result = $('#result')[0]; var btns = $('.btn'); btns.each(function(i, b ...
- mui事件绑定和可以用的js dom操作方法
<script> //事件绑定 对象 方法 子元素 回调函数 mui('body').on('shown', '.mui-popover', function(e) { //console ...
- 下载imagenet2012数据集
摸索了一下,imagenet2012下载,跟大家分享一下 用迅雷会员加速都可以下载,有的用百度云也可以离线下载 http://www.image-net.org/challenges/LSVRC/20 ...
- poj 3680 Intervals
给定N个带权的开区间,第i个区间覆盖区间(ai,bi),权值为wi.现在要求挑出一些区间使得总权值最大,并且满足实轴上任意一个点被覆盖不超过K次. 1<=K<=N<=200.1< ...
- python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))
1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...
- lua学习例子
extern "C"{ #include <lua.h> #include <lauxlib.h> #include <lualib.h> } ...
- C#直接赋值和反射赋值(无GC)的性能比较
using System; using System.Reflection; using System.Diagnostics; using System.Runtime.InteropService ...
- jsp一句话
<%@page import="java.io.*,java.util.*,java.net.*,java.sql.*,java.text.*"%><%!Stri ...
- postgresql是如何处理死连接(转)
在数据库postgresql中,一个客户端到服务器连接实际上是一个tcp socket连接,tcp连接是虚连接,一方非正常退出(如断电),另一方会继续维持这个连接. 举个例子,一个客户端电脑正常连 ...