我们常说的分布式系统,其实就是分布式软件系统,支持分布式处理的软件系统。他是在通信网络互联的多处理机体系结构上执行任务。
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. ...
随机推荐
- WPF中RadioButton绑定数据的正确方法
RadioButton一般用于单选的时候,也就是从一组值中选择一个值. 比如性别有“男”和“女”两种取值,而对于一个员工的实例来说,性别的取值要么是男,要么是女. 这种时候一般就会用到RadioBut ...
- [fiddler] 手机抓包
最近工作涉及到与原生app联调,需要抓取手机上的请求.借此机会研究了下fiddler,简直神器. 以下简单介绍通过fiddler进行手机抓包的方法,之后也会陆续更新fiddler的其他功能 设置fid ...
- asp.net form身份认证不定时认证失败的问题 排查
1.网站出现form认证不定时认证失败.登陆过后 每隔一会儿就需要重新登陆.首先检查的是form身份认证票据设置的时间(正常) 然后检查加密后的身份认证信息写入的cookie的失效时间(正常) 2.这 ...
- Codeforces Round #373 (Div. 2)
A,B,C傻逼题,就不说了. E题: #include <iostream> #include <cstdio> #include <cstring> #inclu ...
- C#之字符串篇
大杂烩 一.类型转换 字符串转整形: int a = int.Parse(""); //不能转换null int b = Convert.ToInt32("&quo ...
- 网络基础之IPv4、网线、
=========================================Internet是一个圈子,进去这个圈子就要有相应的身份,就像我们去篮球场打球,首先得是个"人"才 ...
- java高级特性
第二章 XML(可扩展标记语言) XML格式能够表达层次结构,并且重复的元素不会被曲解. 与HTML不同,XML是大小写敏感的. 必须有结束符. 属性值必须用引号括起来. 所有属性必须都有属性值. X ...
- [Scala] akka actor编程(一)
Akka基础 Akka笔记之Actor简介 Akka中的Actor遵循Actor模型.你可以把Actor当作是人.这些人不会亲自去和别人交谈.他们只通过邮件来交流. 1. 消息传递 2. 并发 3 ...
- 马化腾称春节前推出微信小程序
腾讯马化腾在第二届深商大会“互联与时代”论坛上透露,会在2017年春节前推出微信小程序.在谈到“互联网+”.开放生态等话题时,马化腾表示,腾讯从过去5年来,从封闭的环境变成一个开放的环境,变成一个真正 ...
- 一些PHP性能优化汇总
PHP优化对于PHP的优化主要是对php.ini中的相关主要参数进行合理调整和设置,以下我们就来看看php.ini中的一些对性能影响较大的参数应该如何设置. # vi /etc/php.ini (1) ...